FreeBSDにZFS
Solaris10は既にインストーラーでZFS ROOTにできる。余裕のよっちゃんである(ROOTをRAIDZなどで組む方法は詳しく検証していないけど)。
さて、Linuxのbtrfsは遠い未来になりそうだし、かと言ってSolaris10で自宅サーバーなんて言っちゃ悪いがダメ鯖缶のあんもちには荷が重過ぎる。
ところでFreeBSDには8.0-RELEASEからZFSが実運用できそうな雰囲気をかもし出している。ところがインストーラー(おなじみ/usr/sbin/sysinstall)ではZFSによるスライシングやフォーマット(ファイルシステムを作る事)はできないみたい。では、面倒じゃないところでどこまでファイルシステムをZFS化できるか試してみた。
基本方針1:live-cdなど、FreeBSDのインストール前や後に「CDから別のOSを立ち上げてHDDのファイルシステムや設定ファイルをごにょごにょする」事はしない。最低限single user modeでできる範囲の作業で行う。
基本方針2:インストール後にスライスやパーティションをごにょごにょしない。
基本方針3:無理せず(ZFS化)できる場所だけZFSにする。とりあえず/は捨てて/home、/tmp、/usr、/varの4つを目標にする。SWAPをZFS化しないのはするメリットが見つからないから。
まぁ、要するに楽してZFSできるとこだけZFSという事だが、結論から言うと/usr(と、後はひょっとしたら/var)はZFSのマウントポイントをlegacyにして/etc/fstabでマウントするのが良いのではないかと。それ以外は普通にzfs mount -aで問題ない。
手順1:普通にFreeBSD-8.0 RELEASEのDVDで起動し、STANDARDでもEXPRESSでもCUSTOMでも好きなようにインストールする。
この時、2GBのスライスをad0s1に、残りをad0s2に取って、スライス1は1GBにUFS2で/、1GBはSWAPとして取る。ad0s2は空っぽ。海外の参考サイトではほとんどad0s1aを/に、ad0s1dをそれ以外として取っているけど、何でだろうね。何か意味があるんだろうか。
ちなみにZFSプールはUFSと同様にad0(ディスク全体)でもad0s1(スライス全体)でもad0s1a(パーティション)にでも作成する事ができる。なのでスライス1でディスク全部とって、パーティションで少しずつZFS化していく事もできるかも知れない。今回スライスを2つに分けたのは、HDDのパーティションテーブルの破壊にひょっとしたら強くなるかなぁなんて思っただけで1スライスの3パーティション(/とSWAPとダミーの/tmp)でももちろんかまわない。
もうひとつちなみに最小構成でFreeBSD 8.0 RELEASEをインストールすると/と/usrが130MBずつくらいになる。
手順2:single user modeでハードディスクから起動して、/を再マウントする。ad0s2をZFSプールにしてhomeとusrとtmpとvarを取る。
# mount -o rw / # zpool create zpool0 /dev/ad0s2 # zfs create zpool0/home # zfs create zpool0/tmp # zfs create zpool0/usr # zfs create zpool0/var
手順3:cpやtar&tarで/usrと/varの中身を抜く。
# cd /usr # tar cf - * | tar xf - -C /zpool0/usr # cd /var # tar cf - * | tar xf - -C /zpool0/var
ここまでは/usrは元の/usrのままで作業しないと、tarコマンドが/usr配下の共有ライブラリに依存しているのでtarが動かなくなる。
手順4:/usrと/varを/uと/vなどにリネーム。
# cd / # mv usr u # mv var v
なんかスマートじゃないよね。うまい方法はないものか。/usrと/varを別パーティションにしておいて、ZFSに移動した後にそのパーティションをZFSプールに加えてやれば良いのかな(最初ad0s1dをUFS2の/usr、ad0s1eをUFS2の/varでとっておき、手順3でZFSに移動させた後でzpool0に加えてやる感じ)。
手順5:マウントポイントの調整とfstabの設定を行う。
# zfs set mountpoint=none zpool0 # zfs set mountpoint=legacy zpool/usr # zfs set mountpoint=legacy zpool/var # zfs set mountpoint=legacy zpool/home # zfs set mountpoint=legacy zpool/tmp
ZFSのマウントポイントのnoneとlegacyはパッと見どっちも自動マウントを行わなくする風に見えるが、legacyだとmount -t zfs zpool0 /mntでマウントできるのに対してnoneだとできなくなる。
fstabは以下のようなのを追加
zpool0/usr /usr zfs 0 0 zpool0/var /var zfs 0 0 zpool0/home /home zfs 0 0 zpool0/tmp /tmp zfs 0 0
後ろの二つ(DUMPとFSCK)はともに0にしておく。特にFSCKを1や2にすると、fsck_zfsを探しにいったりでえらい事です。
後は再起動でウマーのはず。ZFSになった/usrにXでも何でも好きなものを追加すれば良い。
なお、legacyでfstab的に(起動時に)マウントしているため、/boot/loader.confにzfs_load=”YES”や/etc/rc.confにzfs_enabled=”YES”やrc.localにzfs mount -aは不要である。
ネットをあさるとZFSで使うメモリ量を抑制すると良い(安定するというかこうしないとカーネルパニックで落ちるらしいというか実際に何回か落ちた)という風に書かれていた。以下、パクリ。
/boot/loader.conf vm.kmem_size="192M" vm.kmem_size_max="256M" vfs.zfs.arc_max="40M" vfs.zfs.vdev.cache.size="5M"