2010年1月12日火曜日

FreeBSD で ZFS

・8.0-RELEASE からプロダクション品質
・8.0-STABLE にZFS version 14 が取り込まれた

ってことで、ZFS を少しおさわり。初。もし Solaris で育ってたら、早々にさわってたことだろうな。
実マシンは無いので、VMware Fusion 上の FreeBSD 8.0-STABLE で /usr/{src,obj,ports} を zfs にした。ディスクは、、、2Gのファイルを SCSI で 4つ作成、それらを raidz にした特に面白く(?)ない構成。

以下、設定したことなどなど。

dmesg には次のように出力される
ZFS NOTICE: Prefetch is disabled by default if less than 4GB of RAM is present;
to enable, add "vfs.zfs.prefetch_disable=0" to /boot/loader.conf.
ZFS filesystem version 14
ZFS storage pool version 14

メモリは 2G で設定しているため ZFSプリフェッチというのが無効になっている。これはなんだろうな。。

また、/boot/loader.conf で vm.kmem_size を 512MB に設定する前は次の出力もあった。
ZFS WARNING: Recommended minimum kmem_size is 512MB; expect unstable behavior.
Consider tuning vm.kmem_size and vm.kmem_size_max
in /boot/loader.conf.

そのため、/boot/loader.conf には
vm.kmem_size="536870912"
を書いて、再起動。

ZFS 領域に移す/usr/src と /usr/ports の容量は以下の通り。
% du -shc /usr/src
512M /usr/src
512M total
% du -shc /usr/ports
746M /usr/ports
746M total

man zfs や man zpool して、軽く使い方を確認。まず zpool で create。前述のとおり SCSI 4つを raidz 。
% sudo zpool create tank raidz da0 da1 da2 da3

% zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 7.94G 132K 7.94G 0% ONLINE

% zpool status tank
pool: tank state: ONLINE scrub: none requested
config:

NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
da3 ONLINE 0 0 0

errors: No known data errors

作成した時点で mount されるらしい(この時点では zfs mount コマンドでもみられる、ということには気づかなかった)
% df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 11G 5.4G 4.4G 55% /
devfs 1.0K 1.0K 0B 100% /dev
tank 5.8G 0B 5.8G 0% /tank

% mount
/dev/ad0s1a on / (ufs, local, soft-updates)
devfs on /dev (devfs, local, multilabel)
tank on /tank (zfs, local)

src, ports 領域を ストレージプール tank 以下に作成
% sudo zfs create tank/src
% sudo zfs create tank/ports
% df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 11166944 5625798 4647792 55% /
devfs 1 1 0 100% /dev
tank 6128512 0 6128512 0% /tank
tank/src 6128512 0 6128512 0% /tank/src
tank/ports 6128512 0 6128512 0% /tank/ports
これも、zfs create した時点で mount された。

移す先が作成できたので、ごそっと rsync
% sudo rsync -Hau /usr/src/ /tank/src/ ; sudo rsync -Hau /usr/ports/ /tank/ports/

rsync 中、ZFS の場合の書き込みはある程度のチャンク毎(?)に行われるのかなと思った。df でみるみるうちに使用領域が経るものかとおもったら、そうでもなかったような・・・。
(軽く調べてみたところ、そのような振る舞いのようだ。)

rsync 後の確認
% df -h -t zfs
Filesystem Size Used Avail Capacity Mounted on
tank 4.7G 0B 4.7G 0% /tank
tank/src 5.2G 522M 4.7G 10% /tank/src
tank/ports 5.3G 688M 4.7G 13% /tank/ports

その後、同様にして/usr/obj の後釜 tank/obj も作成。同期は必要ないので create だけ。
% mount -t zfs
tank on /tank (zfs, local)
tank/src on /tank/src (zfs, local)
tank/ports on /tank/ports (zfs, local)
tank/obj on /tank/obj (zfs, local)

で、mount 先が /tank/{src,ports,obj} のままだと symlink 貼ったりしてなんかなー、と思ったので一度 umount し(後で気づいたけど、アンマウントしなくてもできる。)mountpoint を設定後、再度 mount。
% zfs set mountpoint=/usr/src tank/src
% zfs set mountpoint=/usr/ports tank/ports
% zfs set mountpoint=/usr/obj tank/obj

再 mount (zfs mount -a)後
% df -h -t zfs
Filesystem Size Used Avail Capacity Mounted on
tank 3.0G 0B 3.0G 0% /tank
tank/obj 4.7G 1.7G 3.0G 36% /usr/obj
tank/ports 3.7G 688M 3.0G 18% /usr/ports
tank/src 3.5G 523M 3.0G 15% /usr/src
% zfs mount
tank /tank
tank/obj /usr/obj
tank/ports /usr/ports
tank/src /usr/src

あと、/etc/rc.conf に zfs_enable="YES" を書いておしまい。

make buildkernel buildworld しガリガリ書かせてみて、パニックしないことを確認。

実用する場合はデカーイストレージをくっつけて、sharenfs なぞするのが普通なのかなぁ。 例えば VMware, Xen のイメージ置き場に使えるレベルなのかしらん・・・。ううむ。

0 件のコメント:

コメントを投稿