LennyでiSCSI 【その4】Xen環境の移行と自動マウント | 雲の上はいつも青空

雲の上はいつも青空

不思議な経歴をもつエンジニア!?の徒然なブログです。
お仕事関係の話が多いと思いますが、コメントとかもらえると中の人はとても喜びます(^O^)/

前頁でiSCSIの接続がうまくいったので、今回はXen環境の移行とiSCSI論理ドライブの自動マウントについて書いてみます。
私が構築したテスト環境では、複数のイニシエーターが単一のターゲットへ接続するという形態なので、本来、排他制御の関係からもなんらかのクラスター系のミドルウェアが必要となります。
しかし、今回検証を行った環境下では、通常のiSCSI接続を用いても、いまのところ問題はおきていませんので、排他制御についてページを改めて書こうと思っています。


まずは稼動している仮想サーバを停止します。
これは、xm shutdown サーバ名 になります。

xm list で、すべての仮想サーバが停止していること確認したら、/home/xen/domeins以下に展開されている仮想サーバのディスクイメージを、iSCSIの論理ドライブへコピーします。
/mnt/iscsi にマウントされていると仮定すると、cp -r /home/xen/domains /mnt/iscsi で、すべてのイメージがコピーされます。

次にトラブルがあった時の為に、今コピーした内容をバックアップします。
任意のディレクトリーへ仮想サーバのディスクイメージをコピーしましたら、/home/xen/domains以下はすべて削除します。
cd /home/xen/domains
rm -Rf *

それでは、iSCSIの論理ドライブをいったんアンマウントして、/home/xenにマウントすることにします。
umount /dev/sdc1   ←iSCSIの論理ドライブと仮定
mount /dev/sdc1 /home/xen

ls /home/xen/domains で、仮想サーバ用のディレクトリーが見えることを確認してから、xm create コマンドで、仮想サーバを起動します。
※各サーバが立ち上がったら、正常に起動したかどうかそれぞれのサーバにログインして確認してみてください。


このままでは、Domain-0(Xenホスト機)を再起動すると、マウントが外れてしまうので、/etc/fstabを編集します。

fstabの編集するときの注意点です。
・マウントするドライブ名は、論理ドライブ名をつかわずUUIDを使うこと。
・マウントオプションは、_netdev を指定する。

論理ドライブ名は、固定されたものではなく、状況によって変わってしまうので、一意に指定できるUUIDで書くようにすると良いです。

UUIDの調べ方…
・まずiSCSIとして接続されている状態で、fdisk -l を実行しその時点での論理ドライブ名を確認する。
ls -l /dev/disk/by-uuid/ を実行すると、ドライブ名毎にUUIDが表示される。

次に_netdevというマウントオプションですが、この設定にするとネットワーク関連の設定完了を待ってから、マウント動作を実行するよう、マウントを待たせるオプションです。
※通常は、INIT処理の最初で一気にマウント処理が実行されます。

ですので、fstabの設定はこんなかんじになります。
UUID=8a24c3e5-9a8f-4325-9786-353c19ecfca7 /home/xen ext3 _netdev 0 0


以上の設定で、再起動時に自動的にマウントする筈なのですが、私のテスト環境では問題がでました。
毎回ではないのですが、再起動時にマウントできない時がたまにあるという、いやらしい障害です。
しかも、再現性がなく設定をいろいろ変更してみてもあまり効果がありませんでした。
これには三日ほど苦しみましたが、以下の設定変更で障害はおさまりました。

きっかけは、自動的にiSCSIにログオンするスクリプトを作った時にありました。
ログオフして再度ログオンしたりと、テスト中は頻繁に行ったので、以下の簡単なスクリプトを作りました。
#!/bin/sh
iscsiadm -m discovery -t st -p 192.168.0.155
iscsiadm -m node -p 192.168.0.155 -l

これに、先ほど書いたUUIDを表示するスクリプトを追加すると…
#!/bin/sh
iscsiadm -m discovery -t st -p 192.168.0.155
iscsiadm -m node -p 192.168.0.155 -l
ls -l /dev/disk/by-uuid/
この一行追加したスクリプトを実行すると、ログインしている筈のiSCSIの論理ディスク名が見えません!
あれ? っと思い、マニュアルでls -l /dev/disk/by-uuid/を実行すると、今度はちゃんと見えます。

もう一度、iscsiadm -m node -p 192.168.0.155 -u で一度ログオフして、再度スクリプトを実行してみても同じです。実行後に手入力すると見えるので、sleepを入れてすこし待ってみることにしました。
#!/bin/sh
iscsiadm -m discovery -t st -p 192.168.0.155
iscsiadm -m node -p 192.168.0.155 -l
sleep 3
ls -l /dev/disk/by-uuid/
今度は大丈夫! ちゃんとスクリプトを実行させてもiSCSIの論理ドライブのUUIDが表示されます。

↑↑↑↑↑↑↑↑↑↑↑↑
このスクリプトを思い出し、もしやと思いながら、open-iscsiの起動スクリプトにちょっと待ちを入れてみることにしました。

元の/etc/init.d/open-iscsi にある起動スクリプトです。
starttargets() {
log_daemon_msg "Setting up iSCSI targets"
echo
$ADM -m node --loginall=automatic
log_end_msg 0
}
この起動部分の前後に5秒(たぶん3秒で十分)ほどsleepを入れました。
starttargets() {
log_daemon_msg "Setting up iSCSI targets"
echo
sleep 5
$ADM -m node --loginall=automatic
sleep 5
log_end_msg 0
}

■この変更で、サーバの起動時にiSCSIの論理ドライブのマウント失敗という障害は、ピタッとおさまりました。