yuu_nkjm blog


2011-12-01(Thu) [長年日記] 編集

[Apache][git][openSUSE] Git over http (cloneはできたがpushできず)

WebDAVの設定

Gitリポジトリの作成

GitリポジトリをWebDAV(+https)経由で公開する - yamkazu-techの日記を参考にレポジトリを作る.

cd /git/nkjm /git/repos/nkjm
mkdir projects.git
cd projects.git
 
git --bare init
  Initialized empty Git repository in /git/repos/nkjm
 
vi description 
echo "http://hoge.nkjm.info/git/nkjm/projects.git" > cloneurl
printf "[gitweb]\n\towner = yuu_nkjm\n" >> config

HTTPからgitするための設定.

cp -a hooks/post-update.sample hooks/post-update
chmod +x hooks/post-update
git update-server-info
chown -R wwwrun:www /git/repos/nkjm/projects.git

ここで,"git update-server-info"が重要.Git のリモートリポジトリから HTTP で pull するためのメモ - akihiko’s tech note

Git over httpの設定

# lv /etc/httpd/conf.d/gitweb.conf
 
Alias /git/nkjm /git/repos/nkjm
<Location "/git/nkjm">
    Options Indexes
    DAV on
    AuthType Digest
    AuthName "xxxxxxx"
    AuthUserFile /hogehoge/.htdigest
    <Limitexcept GET HEAD PROPFIND OPTIONS REPORT>
        Require valid-user
    </LimitExcept>
</Location>

動作確認

git pull http://hoge.nkjm.info/git/nkjm/projects.git/ master

pullはうまくいった.

しかし,pushしようとすると以下のエラー…

git.exe push --progress  "origin" master:master
error: Cannot access URL http://hoge.nkjm.info/git/nkjm/projects.git/, return code 22
fatal: git-http-push failed

関連しそうな情報(githubにpushしようとしたらreturn code 22とか言われた - marblejenkaの日記)もあったけど,解決せず.

自前でGitを運用する気はいまのとこないし,HTTP経由で書き込ませたいこともどれだけあるか分からないし,今回は諦める.WebDavは便利なんだけど,昔からイジメられている気がする.


2011-12-02(Fri) [長年日記] 編集

[Apache][openSUSE] "client denied by server configuration"エラーとAllow from all

client denied by server configuration

というエラーが出る時は,当該ディレクトリに以下の様な許可が与えられているか確認する.

Order allow,deny
Allow from all

openSUSEには,デフォルトで以下の設定がされているので,注意する.

# /etc/apache2/httpd.conf
 
# forbid access to the entire filesystem by default
<Directory />
    Options None
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

2011-12-03(Sat) [長年日記] 編集

[FTP][openSUSE] コマンドラインからFTPSでFTPサーバ上のデータを取得

対話型だと自動処理に不向きなので,コマンドラインでFTPサーバからデータを取得したい.さくらインターネットでftpsが使える様になったということなので,ftpsによる接続を試みた.ncftpではftpsを扱えない様なので,FTPクライアントをlftpに代えた.

「Explicitモード(?)」の節が,うまくいったコマンドについて書いた部分である.

Implicitモード(?)

lftp -u user,passwd  -e "mirror --only-newer --verbose /home/hoge/ /srv/www/repos/hoge" ftps://hoge.sakura.ne.jp:21

sakuraサーバはFTPSに990番ポートでなく21番ポートを使う様なので,ポート番号を指定する.

lftp -u hoge -e "debug 12" ftps://hoge.sakura.ne.jp:21
 
lftp hoge@hoge.sakura.ne.jp:~> ls
---- dns cache hit
---- hoge.sakura.ne.jp (xxx.xx.xx.xxx) ポート 21 に接続中
`ls' (現在 0 バイト) [FEAT negotiation...]
**** gnutls_handshake: A TLS packet with unexpected length was received.
---- コントロールソケットを閉じています
ls: 致命的エラー: gnutls_handshake: A TLS packet with unexpected length was received.

上記の様なエラーが出て接続出来なかった.何でだろ….何かExplicitとImplicitとかいってた辺りが怪しい気がする.ひとまずwikipediaでも見てみる.

暗号化の種類

FTPSには、認証コマンド(AUTHコマンド)実行後に暗号化通信を開始するExplicitモードと、FTPSサーバ接続開始時点から暗号化通信を開始するImplicitモードの2種類が存在する。

Explicitモード

サーバに接続した後にクライアントがAUTHコマンドを実行して、使用するプロトコル(SSLまたはTLS)のネゴシエーションをおこない、適合したプロトコルでのハンドシェイク完了後に暗号化された通信がおこなわれる。 つまりExplicitモードの場合、クライアントがAUTHコマンドを実行しなければ通常のFTPとして機能する。

Implicitモード

サーバに接続した直後にSSLまたはTLSによるハンドシェイクがおこなわれる。 Implicitモードで動作するサーバに接続する場合、クライアントはサーバが採用している暗号化プロトコルに適合したFTPSクライアントソフトを使用する必要がある。 また、データ転送チャネル(PORTまたはPASVコマンドで作成されるチャネル)での通信を暗号化する場合、PROTコマンドを用いて保護レベルをP (Private) に設定する必要がある。

さくらインターネットの説明サイトにExplicitモードで接続する様に書いてあった.上記の蹴られ方を見ると,さっきはImplicitモードで接続しようとしていることになるのかな.「Explicitモードの場合、クライアントがAUTHコマンドを実行しなければ通常のFTPとして機能する」って書いてあるから,いきなりftpsを指定するのはこの説明に合わない気がする.語感としては,ftpsって指定する方がEplicitに思えるけど….

Explicitモード(?)

ユーザ毎の設定は~/.lftprcに,サーバ全体のlftpの設定は/etc/lftp.confに書く.

# ~/.lftprc
 
set ftp:ssl-auth TLS
set ftp:ssl-force true
set ftp:ssl-allow yes
set ftp:ssl-protect-list yes
set ftp:ssl-protect-data yes
set ftp:ssl-protect-fxp yes
# set ssl:verify-certificate no サーバによってはこれが必要になるケースもある?

~/.lftprcに上記の様に記述し,以下のコマンドを実行した.先ほどと違うのは,ftpsではなくftpを指定した点である.

lftp -u hoge -e "debug 12" ftp://hoge.sakura.ne.jp
 
lftp hoge@hoge.sakura.ne.jp:~> ls
(snip)
---- hoge.sakura.ne.jp (xxx.xx.xx.xxx) ポート 21 に接続中
<--- 220 ProFTPD 1.3.3c Server (SAKURA Internet FTP Server) [xxx.xx.xx.xxx]
---> FEAT
(snip)
---> AUTH TLS
<--- 234 AUTH TLS successful
(snip)

"AUTH TLS successful"と出てるし,FTP over SSL/TLSが出来ていることが分かる.

ミラーリング用のスクリプト

# hoge-bkup.conf
 
set ftp:ssl-auth TLS
set ftp:ssl-force true
set ftp:ssl-allow yes
set ftp:ssl-protect-list yes
set ftp:ssl-protect-data yes
set ftp:ssl-protect-fxp yes
# set ssl:verify-certificate no サーバによってはこれが必要になるケースもあるようだ.
# 接続先のポート番号はftp://xxxxの後ろに:ポート番号で指定する.
open -u hoge,passwd ftp://hoge.sakura.ne.jp
debug 12 -o /tmp/lftp_hoge_bkup.log
mirror --only-newer --verbose /home/hoge /srv/www/hoge

上記の様なスクリプトを作成し,lftpの-fオプションで渡して実行するようにした.パスワードを書き込むときは,そのファイルのアクセス権限に十分に注意する.

lftpのオプションは以下.-fと他のオプションの併用は出来ないようだ.

lftp -help
 
使い方: lftp [OPTS] 
`lftp' は rc ファイルを読み込んだあと最初に実行されるコマンドです
 -f            ファイルで指定されたコマンドを実行し終了する
 -c             コマンドを実行して終了する
 --help              このヘルプを表示して終了する
 --version           lftp のバージョンを表示して終了する
他のオプションは `open' コマンドのものと同じです
 -e             選択のすぐあとに指定のコマンドを実行する
 -u [,]  認証で指定のユーザ/パスワードを使う
 -p            接続に指定のポートを使う
               ホスト名、URL あるいはブックマーク名

備考

残った疑問
lftp -v
 
Libraries used: Readline 6.1

lftpのバージョン情報を表示させるとこんな感じ.ここでOpenSSLモジュールが組み込まれていると表示されないとFTPSが使えないと書いてある記事を見かけたのだが,どうなんだろう.

ncftp (ncftpget)

昔はncftpを使っていた.

ncftpget -u user -p 'passwd' -d /home/hoge/tmp/ncftp_hoge_bkup.log -T -R  hoge.sakura.ne.jp /srv/www/repos/hoge /home/hoge

2011-12-04(Sun) [長年日記] 編集

[KVM][openSUSE] KVM仮想マシンの名前変更と移動

KVM仮想マシンの整理で,(1)KVM仮想マシンの名前を変える,(2)KVM仮想マシンのコピーを取って名前を変えてそれを同一KVMホストで動かす,(3)KVM仮想マシンのコピーを他のKVMホストで動かす,という三つの作業を行ったので,その作業ログを残す.

KVM仮想マシンの名前の変更

virsh editを使う方法と設定ファイルをエディタで直接編集する方法がある.

なお,実行されているKVM仮想マシンの設定を確認するには,dumpxmlを使う.

virsh dumpxml kvm-guest-00
virsh editを使う

"virsh edit 仮想マシン名」でKVM仮想マシンの設定を編集できる.こちらが本道か.

virsh edit kvm-guest-00
設定ファイルをエディタで直接編集

KVM仮想マシン(kvm-guest-00.xml)の設定ファイルを変更した場合,その内容をKVM仮想マシンに反映させるためには,以下を行う.

virsh define /etc/libvirt/qemu/kvm-guest-00.xml

KVM仮想マシンをコピーし,同一KVMホストマシン上で動かす場合

/etc/libvirt/qemu/kvm-guest-00.xml を開いて,nameとuuidを変更する.nameは設定xmlのファイル名(拡張子より前の部分)と一致させる.

<domain type='kvm'>
<name>kvm-guest-00</name>
<uuid>********-****-****-****-************</uuid>
</domain>

また,uuidgenコマンドでuuidを得る.

uuidgen

manには「uuidgenは-tオプション,-rオプションを持っているけど,何も指定しなくてもよろしくやっとくよ」と書いてあるようなので,無指定で実行した.

virsh define /etc/libvirt/qemu/kvm-guest-01.xml

KVM仮想マシンを異なるKVMホストマシンへ移動する場合

KVM仮想マシンkvm-guest-00の設定ファイル(/etc/libvirt/qemu/kvm-guest-00.xml)と設定ファイル内で読み込んでいるディスクイメージ(/var/lib/kvm/images/以下あたりにある)を,移動先にコピーする.

移動先でKVMを実行する準備をしたあと,下記のコマンドを実行すると,移動先のKVMホストにKVM仮想マシンが作成される.

virsh define /etc/libvirt/qemu/kvm-guest-00.xml

このあとはvirshコマンド(virsh startとか)で戦ってもいいし,virt-managerから制御してもよい.

参考ページ


2011-12-05(Mon) [長年日記] 編集

[misc][Links] フリーソフトや興味のある技術の記事など


2011-12-06(Tue) [長年日記] 編集

[Linux][Postfix][bind][Troubleshooting] サービス(postfixやbindなど)の待ち受け状況をnetstatで確認する

postfixをインストールして,main.cfのmynetworksも設定したのに,メールが送れなかった.まず,25番ポートの待ち受け状態を見てみる.

[root@localhost /etc]$ netstat -anp|grep 25
 
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      28482/master

ローカルループバックアドレス(127.0.0.1)のみで待ち受けており,外部ネットワークと接続しているネットワークインタフェースにおいて,postfixが待ち受けていないことがわかる.

そこで,main.cfのinet_interfacesでallを設定すると,全てのネットワークインタフェースにおいてpostfixが待ち受けるようになる.0.0.0.0はallのことらしい.

[root@localhost /etc]$ netstat -anp|grep 25
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      29966/master

次はbindの例.以下の例では,外部ネットワークと接続しているネットワークインタフェース(10.20.30.40)の53番ポートでも待ち受けていることが分かる.(ローカルネットワークでの運用なので,53番固定で運用している)

[root@localhost /etc]$ netstat -an|grep 53
tcp        0      0 10.20.30.40:53        0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN
udp        0      0 10.20.30.40:53        0.0.0.0:*
udp        0      0 127.0.0.1:53            0.0.0.0:*

関連ページ


2011-12-07(Wed) [長年日記] 編集

[openSUSE][Apache][Tomcat] ApacheとTomacatの連携(jk版)

注記

jkをいれたけど,mod_proxy_ajpの方が良かった気がする.mod_proxy_ajpというパッケージがzypperで見つからないけど,mod_proxy_ajpは標準モジュールだから,apache2.2のインストールと共にインストールされるんだな.

インストール

yastでapache2とtomcat6をインストールする. (yast-> ソフトウェアインストール -> yast-http-serverをインストールした.これはやってもやらなくても良い.)

apacheモジュールのインストール

/etc/sysconfigエディタ-> Network/WWW/Apache2 -> APACHE_MODULESでjkを追加する.

/usr/sbin/httpd2 -M

として,apacheがロードしたモジュールを確認.

設定ファイルの編集

$CATALINA_HOME/conf以下にworkers.propertiesを作る.

# lv $CATALINA_HOME/conf/workers.properties
worker.list=worker1
 
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13

/usr/share/doc/packages/apache2-mod_jk/jk.confにjk.confの雛形があるので,/etc/apache2/conf.dにコピーする.

# lv /usr/share/doc/packages/apache2-mod_jk/jk.conf
# simple configuration for apache (for AJP connector, modul mod_jk.so)
<IfModule mod_jk.c>
     JkWorkersFile /etc/tomcat5/base/workers.properties
    JkLogFile /var/log/tomcat5/base/mod_jk.log
 
    # Log level to be used by mod_jk
    JkLogLevel error
 
    # The following line makes apache aware of the location of
    # the /servlets-examples context
    Alias /servlets-examples "/srv/www/tomcat5/base/webapps/servlets-examples"
    <Directory "/srv/www/tomcat5/base/webapps/servlets-examples">
        Options Indexes FollowSymLinks
        allow from all
    </Directory>
 
    # The following line makes apache aware of the location of
    # the /jsp-examples context
    Alias /jsp-examples "/srv/www/tomcat5/base/webapps/jsp-examples"
    <Directory "/srv/www/tomcat5/base/webapps/jsp-examples">
        Options Indexes FollowSymLinks
        allow from all
    </Directory>
 
    # The following line mounts all JSP files and the /servlet/ uri to tomcat
    JkMount /servlets-examples/servlet/* ajp13
    JkMount /jsp-examples/*.jsp ajp13
 
    # The following line prohibits users from directly accessing WEB-INF
    <Location "/jsp-examples/WEB-INF/">
        AllowOverride None
        deny from all
    </Location>
    <Location "/servlets-examples/WEB-INF/">
        AllowOverride None
        deny from all
    </Location>
</IfModule>

上記設定ファイルの"Alias /servlets-examples"あたりを参考に,自分の呼び出したいサーブレットを呼び出すような設定を書けばOK.

トラブルシューティング

バーチャルホストの扱いに注意する.

 Re: Apache2.2 / Tomcat6 / mod_jk / Suse 11.1
I figured out what was wrong: VirtualHosts. 
 
I configured two virtual hosts in apache. The tomcat connector (mod_jk) was included in httpd.conf in the top level, outside of a virtual host definition. I was assuming that calls to http://localhost/ would NOT be handled by a virtual host if there was no name-matching virtual host. 
 
That was wrong, ALL requests are handled by virtual hosts if you define them. If no matching host is found, the first one listed is used. 
 
Hence, moving the jk config inside a virtual host element solved the problem. So, I included the following in a VirtualHost element.

2011-12-08(Thu) [長年日記] 編集

[ssh][openSUSE] ssh(sshd)のトラブルシューティング

localhostから接続できるか確認する

localhostから繋がるかを確認する.つながらなかったら,ネットワークではなく,sshdの方が原因の可能性が高い.つながったら,ネットワークの方が怪しい.

ネットワークの疎通を確認する

ネットワークに接続出来ているか確認する.ネットワークに接続できない - yuu_nkjm blog(2012-02-03).また,tsharkを使って22番ポートにパケットが到達しているかを調べる.TCP/UDPパケットをtshark(Wireshark)でキャプチャ - yuu_nkjm blog(2008-08-19)

ssh hoge@localhost

ファイヤウォールやパケットフィルタソフト(iptables,suse firewall,fail2banなど)の設定を確認する

こいつらが蹴ってることも多い.

sshdをデバッグモードで起動する

SSHD の詳細なデバッグ情報を表示させる方法 - WebOS Goodiesを参考にした.openSUSEの場合では,yast->/etc/sysconfigエディタ->Network/Remote access/SSHの$SSHD_OPTSに"-d"を与える.より詳細なデバッグログを見れるデバッグモードで起動したい場合は"-d -d"のように重ねる.最大で-dを三つまで並べられる.

デバッグモードで起動するとsshdはforkされない(複数の端末からログインできない)ことに注意する.ログレベルをdebugにするとは違うことに注意する.SSHD (8)

sshdのログレベルを変更するには,sshd_configのLogLevelを変更する.SSHD_CONFIG (5)

#LogLevel INFO   デフォルトはINFO
LogLevel DEBUG
tail -f /var/log/messages

tailなどを使って,sshdログを監視する.

sshdをIPv4のみで使う

上述の$SSHD_OPTSに"-4"を与える.sshdをv4のみしか扱わないように設定する必要があったことがあったんだけど,なんでだったかな….

鍵でしかログインさせない場合でも,パスワードの設定は必要

Ship of Fools: sshの鍵ファイル認証にてハデにハマる.これか?と思ったけど,関係なかった.結局,ログインしようとしているユーザにpasswordが設定されていないだけだった.

SSH+X11

SSH+X11接続をする場合,X Window Systemが参考になった.

Failed to allocate internet-domain X11 display socket.

というエラーが出た.対策はこちら.X11フォーワディングをしようとしたとき,DISPLAY変数に値が設定されない - yuu_nkjm blog(2011-08-01)


2011-12-09(Fri) [長年日記] 編集

[grub][Linux][openSUSE][boot][Troubleshooting][Linuxお引っ越し] Linux(OS)が起動しなくなったときにGRUBを再インストールする

grubの再インストール1回目

grubを復旧する方法 - 悠々自適にを参考にしたのだと思う.

grub-installを使う

  1. インストールメディアを入れる.Rescue Systemで起動する.プロンプトが表示されたら"root"と入力する.
  2. ブート対象のデバイスを/mntにマウントする.今回は,/dev/sdbというHDDの/dev/sdb2にルートが存在した.
    mount /dev/sdb2 /mnt 
    
  3. /mnt/boot/grub/device.mapの内容を確認する.トラブルシューティングも参照の事.
    (hd0)   /dev/sda
    (hd1)   /dev/sdb
    
  4. grubを再インストールする.以下では,root-directoryを/mntに設定している./mntを/とみなした時の/boot(つまり/mnt/boot)以下にgrubのステージ2以降(?)をインストールする.最後の引数はgrubのステージ1(?)のインストールデバイスである.以下では,/dev/sdbのMBRにgrubのステージ1(?)をインストールしている.ちなみに,ステージ1.5はステージ1と同一のところ(次のセクタ)にインストールされると思ってほぼ問題なさそう.通常は,BIOSからブートされるデバイスを指定すれば良いと思う.ブートフラグの要不要に関する調査はしていない.
    grub-install.unsupported --root-directory=/mnt /dev/sdb

    grubコマンドのrootと--root-directoryオプションが混乱しやすいな.--root-directoryは単にgrub(ステージ2以降)の設定の出力先と思って良さそう.

    man grub-install
           --root-directory=DIR
                  install  GRUB images under the directory DIR instead of the root directory
    

grubの再インストール2回目

grubコマンドのみで再インストール

grub-installの代わりに以下を入力する.最後のinstallコマンドが見えるので,結局こちらの方が分かりやすいかもしれない.(以下,しげふみメモ : SLES10を内蔵ディスクから高速インストールより)

# grub --config-file=/mnt/boot/grub/menu.lst --device-map=/mnt/boot/grub/device.map
grub> root (hd1,0) (注:--root-directoryとは異なり,書き込み先ではなく,読み込み先?stage2を探すとき,ここが/になるのかな.)
 Filesystem type is xfs, partition type 0x83
grub> setup (hd1)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/xfs_stage1_5" exists... yes
 Running "embed /boot/grub/xfs_stage1_5 (hd1)"...  18 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd1) (hd1)1+18 p (hd1,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.

トラブルシューティング

does not have any corresponding BIOS drive.エラーが出る
上記のエラーは、高確率で出ます。原因は、grubのdevice.mapとデバイス情報が一致しないため。OpenSUSEでは、HDDのデバイス名が製品番号になっていて、一般的なsda、sdb等の名前と合わない。
1./boot/grub/device.mapを開き、HDDの名前を/dev/sda に変更する。HDDとデバイス名の関係をみるには、fdiskコマンドを用いてHDDを調べる。

device.mapでgrubのインストール先が決まるので,下手にいじると,既存のブートローダを上書きしてしまい,大変なことになる.grub-installに--recheckというオプションがあるが,USBの外付けHDDにOSを入れるようなケースでは,原則使わない方が良さそう.内蔵HDDと外付けHDDのどちらがhd0になるかが混乱しやすいので,操作者が良く分かった上で実行すべき.

grubの再インストール3回目

grubの設定

デバイスの対応付け
/boot/grub/device.map
(hd0) /dev/sda
(hd1) /dev/sdb

これらはgrubのインストールの時に使われる.

grubのsetupの設定
lv /etc/grub.conf
 
setup stage2=/boot/grub/stage2  --force-lba (hd1) (hd1,1)
quit

hd1のMBRにstage1が書き込まれ,hd1,1にstage2があるよ(書くよ)というのを教えていることになるのかな.(そもそも,grub-installコマンドの最終引数と重なっている様に思うが,どうなんだろ.印象としては,grub-installコマンドの最終引数がdevice.mapを見て/dev/xxxからhdxに変換されて,setupに渡されているのではないかと思うが.)

menu.listのチェック
lv /boot/grub/menu.list
 
root (hd0,1)
kernel /boot/vmlinuz-3.1.9-1.4-desktop root=/dev/sdb2

BIOSから直接USB HDDを起動するとUSB HDDはhd0となる.それでも,USB HDDは/dev/sdbにマウントされる様だ(内蔵HDDが/dev/sdaになっていた).このメニューリストの編集はgrubのインストールより後に行っても良いはず.

grubのインストール

# hdxという表記は使えなかった.
# grub-install.unsupporetd --root-directory=/mnt hd1
# no device.
 
grub-install.unsupporetd --root-directory=/mnt /dev/sdb
/usr/sbin/grub-install.unsupported: line 444: /usr/sbin/grub-set-default: No such file or directory
/usr/sbin/grub-install.unsupported: line 484: 2761 Bus error
$grub_shell --batch $no_floppy --device-map=$device_map > $log_file << EOF
root $root_drive
setup $force_lba --stage2=$grubdir/stage2 --prefix=$grub_prefix $install_drive
quit
EOF
 
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script 'grub-install'.
 
(hd0) /dev/sda
(hd1) /dev/sdb

紆余曲折を経たまとめ

# パターンA
 
device (hd0) /dev/sdb  # /dev/sdbとして認識されている外付けHDDを(hd0)とする.
root (hd0,1)                # (hd0,1)を/としてstage2がインストールされる.
setup (hd0)                 # (hd0)のMBRにstage1がインストールされる.
# パターンB
 
device (hd1) /dev/sdb  # /dev/sdbとして認識されている外付けHDDを(hd1)とする.
root (hd1,1)                # (hd1,1)を/としてstage2がインストールされる.
setup (hd1)                # (hd1)のMBRにstage1がインストールされる.

BIOSから外付けHDDをブートデバイスとして起動すると,パターンAでもパターンBでも外付けHDDのMBRからブートがはじまることになるので,stage1は実行される.

パターンAでは,stage1に「stage2は(hd0,1)を/とした時の/boot/grubに格納されている」と書かれている.パターンBでは,stage1に「stage2は(hd0,1)を/とした時の/boot/grubに格納されている」と書かれている.BIOSから外付けHDDをブートデバイスとして起動すると,外付けHDDはhd0として認識されるので,前者の設定をしないとstage2を見失う.stage2をロードするまでは,grubは(hdn,m)という指定で生きていくしかないんだな.ちなみに,(hdn,m)と書いたとき,nをハードドライブ番号,mをパーティション番号と言う.

参考ページ

  • ブート全体のお話し.オススメ.grubもstage1.5がない場合の説明だけど分かりやすい.
    ブート ストラップ コンピュータの起動手順
    grub の動作概要
    grub のインストール位置を MBR に指定すると、インストーラは /boot/grub/stage1 に次の編集を施して MBR へ書き込む。
    ・元々 MBR に記録されていた BPB とパーティション テーブルを反映する。
    ・ブート ドライブの種別を記録する。
    ・/boot/grub/stage2 の先頭セクタ位置 (LBA) 情報を記録する。
    
  • grubの説明.図があって分かりやすい.grub回りの知識の確認にオススメ.
    エンタープライズ:Linux How-To 第3回:「GRUBによるブートのカスタマイズ」
  • /etc/grub.confの説明.grubコマンドによりstage2をインストールする場所は,/etc/grub.confに書くか,grubに--boot-deviceや--install-partitionを与える様だ. openSUSE 12.2: 第7章 ブートローダ GRUB
    7.1.3. /etc/grub.conf ファイル
    menu.lst と device.map に続く 3 番目に重要な GRUB の設定ファイルとして、 /etc/grub.conf ファイルがあります。このファイルには GRUB シェルに対するコマンドとパラメータが含まれていて、ブートローダを 正しくインストールするのに必要なファイルです:
    setup --stage2=/boot/grub/stage2 --force-lba (hd0,1) (hd0,1)
       quit
    上記の例では GRUB に対し、最初のハードディスクにある 2 番目のパーティション (hd0,1) にブートローダをインストールし、起動イメージが同じパーティション内に 存在していることを示しています。 --stage2=/boot/grub/stage2 パラメータは、マウント済みのファイルシステムから 第 2 ステージ のイメージをインストールするために 必要なパラメータです。また、 BIOS によっては LBA サポートの実装が誤っている 場合があるため、 --force-lba を指定してその間違った実装を 無視するように指定しています。
    
  • 2段階ブートとgrubの説明.
    Tips: grub2とgrub1の扱い方(様々な再セットアップ方法等) - disklessfun’s Wiki*
    2段階ブートの場合、たとえばこのように、
    # grub
    grub> root (hd1,0)  ←rootで指定するのはmenu.lst(grub.conf),stage2等の場所  (注:--root-directoryとは異なり,書き込み先ではなく,読み込み先?)
    grub> setup (hd1,0)  ←setupで指定するのはgrub(grubのstage1)の書き込み先
    setupで指定するデバイスをハードディスク(の先頭)ではなくパーティション(の先頭)とします。
    上は母艦上の作業としてのサンプルですが、
    普通にLinuxをブートし、そのOS上でブートの方式を1段階ブートから2段階ブートに変更する場合であれば、たとえば、
    # grub
    grub> root (hd0,0)  ←rootで指定するのはmenu.lst(grub.conf),stage2等の場所
    grub> setup (hd0,0)  ←setupで指定するのはgrub(grubのstage1)の書き込み先
    こんな感じになります。もちろん詳細は適宜自身の環境に合わせて下さい。
    マルチブート環境の場合、↑このように、grubをPBR(パーティションの先頭セクタ)にセットアップすることを強く推奨します。
    
  • grubの説明
    Gentoo Linux ドキュメント -- ブートローダを設定する
    コード表示 2.8: GRUBをMBRにインストールする
    grub> root (hd0,0)          (/bootパーティションの場所を指定します)
    grub> setup (hd0)           (MBRにGRUBをインストールします)
    grub> quit                  (GRUBシェルを終了します)
    注意: GRUBをMBRではなく、特定のパーティションにインストールしたいなら、 setupコマンドの部分を編集して、それが正しいパーティションを指すようにします。 例えば、GRUBを/dev/sda3にインストールしたい場合、setup (hd0,2)というコマンドになります。しかしながら、こういうことをしたいユーザはあまりいません。
    
  • grubコマンドの実行例あり.
    しげふみメモ : SLES10を内蔵ディスクから高速インストール
  • USBメモリからブート
    めも - Grub曰く"/dev/*d* does not have any corresponding BIOS drive"
  • openSUSE
    grubを復旧する方法 - 悠々自適に
  • Ubunts
    GRUBブートローダの再インストール | Nibelungen Code
  • device.mapを直せという話し.
    grub の corresponding エラー
    grub-install /dev/hda
    Installation finished. No error reported.
    This is the contents of the device map /boot/grub/device.map.
    Check if this is correct or not. If any of the lines is incorrect,
    fix it and re-run the script `grub-install'.
    (fd0) /dev/fd0
    (hd0) /dev/hda
    (hd1) /dev/hdb
    
  • LinuxRAID1Transition ? アクセンスのおまけ
  • GRUB 用語
    2.4.3. ルートファイルシステムとGRUB
    GRUB で言うルートファイルシステムは違う意味の用語になります。GRUB のルートファイルシステムは Linux のルートファイルシステムとは無関係であると覚えておいてください。
     
    GRUB ルートファイルシステムは指定デバイスの最上位部です。例えば、イメージファイル (hd0,0)/grub/splash.xpm.gz は、(hd0,0)パーティション (実際はシステムの/boot/パーティション) の最上位(又はroot)にある /grub/ ディレクトリに格納されます。
     
    次ぎに、オプションとしてカーネルファイルの場所を持ったkernel コマンドが実行されます。Linux カーネルがブートすると、Linux ユーザーに馴染みのルートファイルシステムを設定します。オリジナルの GRUB ルートファイルシステムとそのマウントは無視されます。これらはカーネルファルをブートするためだけに存在します。
     
    詳細については、項2.6のrootコマンドとkernelコマンドを参照してください。
    
  • Windows boot - GNU GRUB Manual 0.97
    このページの設定は他のサイトのマルチブートの設定と異なる.分かるような分からないような.mapの効果の範囲がわからん.結局分からん.grubからコマンドを叩く,grub.confに書く,menu.listに書くの場合で,(mapのタイミングなどにより)設定の仕方が異なるのか?
       map (hd0) (hd1)
       map (hd1) (hd0)
       rootnoverify (hd0,0)   ← 後者でなく,こっちの設定は納得.
       # hideしたりしなかったり
       chainloader +1
       boot
    
       title Windows
       # map (hd0) (hd1)    ← この記述は無くても動作する(むしろ,あったら動作しなくない?)
       map (hd1) (hd0)
       rootnoverify (hd1,0)  ← 上がコメントアウトされていない場合,このhd1ってmapされる前とされた後のどっちや.rootコマンドを叩く位置を変えたら検証できそうだな.mapの効果は,boot以降なのかな.
       chainloader +1          ←  (hd1,0)のチェーンローダが呼ばれるってことだよな.
    
  • 異なるHDDでデュアルブート - ソフトエンジニア現役続行
    これは (hd0,0)を書く流儀.
  • map - GNU GRUB Manual 0.97
    "map to_drive from_drive"なことに注意.
  • DualBoot
    よくまとまっている.
  • openSUSE 12.2: 第7章 ブートローダ GRUB
    Windows を 2 台目のハードディスクから起動する方法
    Windows のようなオペレーティングシステムでは、 1 台目のハードディスクからのみ 起動することができます。 1 台目以外のハードディスクにそのようなオペレーティング システムをインストールした場合は、関連するメニュー項目を編集することで、論理的な 変更を行なうことができます。
    ...
    title windows
       map (hd0) (hd1)
       map (hd1) (hd0)
       chainloader(hd1,0)+1
    ...
    上記の例では、 Windows が 2 台目のハードディスクから始まっていることを示して います。ハードディスクの論理的な順序は map コマンドで 変更することができます。この仕組みは、 GRUB のメニューファイルには影響 しません。そのため、 2 台目のハードディスクは chainloader に指定しなければなりません。
    
    最後の1行が重要だと思うけど,意味がはっきりとは分からん.mapコマンド以降に発行されているが,上記のchainloader(hd1,0)+1は(入れ替えとかを考える前の)2台目のHDDの第1パーティションのローダを呼び出しているって事だよな.
  • In menu option when booting. - Win7PE - reboot.pro, Grub4dos Guide - Map Command grub4dosの"map --hook"みたいなのがあると分かりやすい.腑に落ちない点もあるが,あとはケースバイケースで対応するか.

2011-12-10(Sat) [長年日記] 編集

[backup][Linux] pdumpfsの代わりを検討

ネットワーク越しのpdumpfsみたいなことがしたいので,rsyncに代えたいな.sshfs+pdumpfsでもいいのかもしれないけど.


2011-12-11(Sun) [長年日記] 編集

[iPad/iPodTouch/iPhone] iPad(iPhone/iPod Touch)で複数のGoogleカレンダーを同期,表示する

iPad(iPhone/iPod Touch)で複数のGoogleカレンダーを扱いたい,Googleアカウントに結びつけられたデフォルトカレンダー以外のカレンダーを扱いたいときは,以下の手順を踏めば良い.

Microsoft Exchangeとして,Googleアカウントと結びつける

  • 設定->メール/連絡先/カレンダーを選択
  • アカウントの追加→Microsoft Exchange
  • メールアドレス:ipadと同期したいGoogleアカウント
    ドメイン:
    ユーザー名:ipadと同期したいGoogleアカウント
    パスワード:対応するパスワード
    
    OKを押す.
    サーバ:m.google.com
    
  • 同期する内容としてカレンダーをオンにする.必要があれば,連絡先やメールもオンにする.

同期する内容の設定

  • iPadからhttp://m.google.com/sync/へアクセス.
  • ご利用頂けませんとあるので,言語を変更を選択して,Englishにする.
  • 使用するデバイスや,読み込みたいカレンダーを選択して,設定終了

参考ページ


2011-12-12(Mon) [長年日記] 編集

[KVM][Xming] gnome+Xming+puttyでvirt-managerが起動しない

下記のページに紹介されていたコマンドで起動できた.

gnome な環境で virt-manager を動作させる場合には、なんの問題もなく動作するのですけれど、 いざ、Xming のみの環境、もしくは Xming + putty (ssh) を使った接続で実行しようとすると、 dbus 関連のエラーが表示され、動作してくれなかった。

しかし、なにかやってるうちに、virt-manager を実行すれば、dbus-launch が動作するようになってしまった。 違いは .dbus か? とか .gconf か? などと思い、ディレクトリを削除したうえで実行してみたが問題なし。 最後に試していたのは

eval `/usr/bin/dbus-launch --sh-syntax --close-stderr` virt-manager

2011-12-13(Tue) [長年日記] 編集

[Linux][command] ユーザのコマンド履歴や操作履歴を残す

ユーザのコマンド履歴や操作履歴を残すときは,以下のコマンドが有用.手順をマニュアル化したいとき,ある特定ユーザの振る舞いを記録したいときなどに使っている.


トップ «前月 最新 翌月» 追記 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|