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"