gmirrorでデータを守る

geom(4)FreeBSDのディスク管理システムで、積み木を重ねるようにデ
バイスを組み合わせて簡単に新しい機能を作り出せる機構のようだ。例えば、
暗号化ファイルシステムのgeliとミラーイングのgmirrorを合せて暗号化された
ミラーが作れたりする。 netgraphの機能をディスクにで実現したようなものと言える。
gmirror(8)はこのgeomフレームワークのものとにミラーを実装する。通勤の電車でこの機能を試してみた。

synopsis


$ man gmirror
$ gmirror label important ad0s1e ad1s1e
$ mount /dev/mirror/important /important

/homeをミラーする

ミラーは普通、複数の物理的ディスクでやらなくては意味無いが、今この作業をしているラップトップには一つしな
ないので、md(4)に二つ目のディスクの代りをしてもらう。後にデスクトップで
実装するときにはmd0をad1s1eなどに置き換えればいい。


$ dd if=/dev/zero of=/usr/var/home-mirror.md bs=1m count=1000
$ sudo mdconfig -a -t vnode -f /usr/var/home-mirror.md -u 0
$ sudo mdconfig -l
/dev/ad0s1fに乗っかっている/homeをad0s1fとmd0をデバイスとしたミラーに
乗せ替える。geom用語ではこれらをプロバイダーと呼ぶ。
ad0s1fにあるデータは消されるので、まずバックアップを取っておく。

$ sudo dump -a -0 -f - /dev/ad0s1f | gzip > /usr/var/home.dump.gz

マウントしたファイルシステムをダンプするときは-Lを使わないと叱られる。
さて、バックアップができたので、ミラーを作る。

$ gmirror load

$ gmirror label home ad0s1f md0

「ad0s1fは忙しいから駄目」と叱られた。確かにマウントしているデバイスから
ミラーを作るのは無謀だ。どうやら、ルートでログインするか
シングルユーザモードでやらなければいけないようだ。

$ shutdown

$ gmirror label home ad0s1f md0

ラベルと呼ばれるサブコマンドでデバイスが初期化されるのはちょっとふに落ちなが、
これでミラーデバイスの構築が始まる。二つの「プロバイダー」のad0s1fとmd0
がsyncされる。これには少々時間がかかるが、このコマンドでその状況が見れる:

$ gmirror status

上手くいくと、gmirror labelコマンドで指定した名のデバイスが現れる。

$ ls -l /dev/mirror/


crw-r----- 1 root operator 0, 90 Jul 10 17:15 home


$ mount /dev/mirror/home /home

バイスができたので、データを入れ直す。

$ cd /home

$ zcat /usr/var/home.dump.gz | restore -r -f -

あとは、再起動した際にちゃんと/homeがこのデバイスにマウントされるようにするだ。
多分、rc.confに「gmirror_hoge=hoge」とでもすれば、勝手にやってくれる筈。
rc.conf(5)でサポートされている変数を見ると、、gmirrorが無い。
仕方がないのでrc.local(8)で実装。

/etc/rc.local
mdconfig -a -t vnode -f /usr/var/home-mirror.md -u 0
gmirror load
gmirror label home ad0s1f md0
mount /dev/mirror/home /home
さて上手くいくか?

$ reboot

驚いたことに一発で成功。

結論

gmirrorはシステムとよくインテグレートされ、ドキュメントも十分なので、簡単に
使える。以前vinumでやろうとしたときは、ディスクのgeometryなんかを手作業で
設定した記憶があるが、それに比べると本当に簡単に設定できた。他のgeomの機能、例えば
暗号化してくれるgeli(8)なんかと組み合わせて、複合ファイルシステムもやってみたい。
また、gmirrorはルートやスワップもサポートしているので、全パーティッションをミラー化できる。
これからまだ、勉強してみたいシステムだ。