NetBSDのfss(4)を利用した Xen Dom_U イメージの引っ越し

NetBSDをDom_0とした仮想化サーバを利用していて Dom_Uマシンの引っ越しをしたくなったとする。もちろん Dom_UのOSイメージファイルをNFSの先に持っていれば migrate で引っ越しするんだろうが、「NFSにイメージ」ってそんなにやってる人いるのかな? NFS先のイメージだと遅いよねえ? うちはやってない。 そういう場合の「できるだけダウンタイムを短くするDom_0引っ越しの仕方」 の話。

さて、もしDom_Uで起動しているものが、 事前にログインさせないよう手配しておくことで 2、3時間くらい停めていいクライアント的役割の仮想マシンなら、

とかで気づかれないように作業できる。ああ簡単。では、 サーバ的役割があって、5分くらい止まっただけで悲鳴が出そうなDom_Uは どうするか。うちの場合は、OpenVPNサーバをしているのがあって、 これが落ちると学生が開いてる廃人誘導ゲームやグダグダ誘導動画が止まって 彼等が遭難する(ただし、 あまりに長時間繋ぎっぱなしのものは負荷軽減と「教育的」配慮で vpnセッションをkillしたりすることもある)。 で、重要な前提をひとつ。

前提: 作業中の接続ログくらいは引っ越しできなくてもいいことにする。

どしても重要ならあとで該当ログだけコピーすればいいってことで。

さて作業に入ろう。こんなイメージファイルがある。

ls -lF
-rw-r-----  1 root  wheel   8589934592 Aug 24 17:46 www-k.img

スナップショットを取る。fssconfig(8) の出番。/opt がイメージファイルのあるパーティションだとする。

fssconfig -cx fss0 /opt /usr/tmp/DUMMY

これで /usr/tmp/DUMMY にスナップショットファイルができるが、 実際には /dev/fss0 経由で利用するので要らない。 消し忘れると無駄なので-xオプションを付けて勝手に消しておいてもらう。 このファイルを将来的に何度も使い回ししたいなら -x なしでfssconfigする。

スナップショットファイルを同じパーティションに指定した場合 それは "persistent snapshot" となり、永続的に利用できるスナップショット となるが、作成に結構時間がかかる(とはいえ800GBパーティションで2分弱)ので、 今回のようにある一瞬のスナップショットを捕まえたいだけなら 別パーティションに取るのがよい。

続いてスナップショットの取り出し。デバイスファイルをマウントするだけ。 read only マウントされる。

mount /dev/fss0 /mnt

稼動中でマウントしているファイルシステムのスナップショットの場合は not clean のメッセージが出るが気にしない。 スナップショットを取った瞬間にリセットボタンを押したような状態の ファイルシステムになっている。wapbl(logオプション)が有効になっていれば ほとんど問題は出ないはず。 もしそれも気にする場合は、Dom_Uマシンを一瞬shutdownしたすきに fssconfigすればよろし。 で、マウント場所からイメージファイルをコピー。

scp /mnt/xen/img/www-k.img NewXen0Server:/opt/xen/img/

けっこう時間がかかるはずなのでその間にxenのDom_Uの起動設定ファイル なんかもコピーして編集しておく。

scp /usr/pkg/etc/xen/www-k NewXen0Server:/usr/pkg/etc/xen

イメージファイルコピーが終わったら即座にxen0の置き換え。

(古いサーバで)
xm shutdown www
(新しいサーバで)
xl create -c www
(とかなんとか)

うまくいったら、fss0の取り外し。

umount /mnt
fssconfig -u fss0

これは気楽でござるよ。もしscpしている最中に書き込まれた ログファイルを同期したかったら、scp先の方でいったんvnconfigして rsyncするよろし。たとえばこんな感じ。

(新サーバ)
vnconfig -c vnd2 www-k.img
(ログのありそうなパーティションをマウント)
mount /dev/vnd2a /mnt
mount /dev/vnd2e /mnt/var
(旧サーバ上の仮想OSをshutdown)
shutdown now
(networkは生きている。必要ならsshdを起動する)
/etc/rc.d/sshd start
(新サーバから仮想OS内のログファイルをrsyncとか、もちろん別手段でも)
rsync -avxH --delete VirtWWW:/var/log /mnt/var
umount /mnt/var
umount /mnt
vnconfig -u vnd2
(旧サーバ上の仮想OSを完全に停止)
halt -p
(新サーバで仮想OSを起動)
xl create -c www-k

まとめ

NetBSD FFSでもスナップショットが取れて、それなりに便利。 ZFSのスナップショットは一瞬で取れて勝手にマウントされて消すのも一瞬。 ただ、zfsの場合はスナップショットを消すのが zfs destroy ... で、 普通のファイルシステムを 消すのと同じ操作で間違えたら大惨事なので 手動で打ち込むときはものすごく緊張する。 NetBSD fssconfig だとマウントしないと使えないし、 persistent snapshot の場合まあまあ時間もかかるし 面倒と言えば面倒なんだが、大元のファイルシステムを消す操作と 間違う可能性はないので、割と気軽に使える気がする。 もっとも、persistent snapshot を置いたままにしておくと、 ファイルシステムの速度がものすごく落ちるので 自動バックアップ的な常用には向かない。