FreeBSDでzfsを試してみた
家で絶賛放置中のlibretto U100にFreeBSD7.0のベータが入っていたので、その辺に転がってるUSBメモリ2本を利用してzfsを試してみた。
使用したUSBメモリは、IO-DATAのTB-BH2G。RAID6とかを試したかったので、両方共512MBずつ3つにスライスした。
参考サイト
zfsを有効にする
とりあえずzfsを試すだけなら以下のコマンドを実行すればすぐにzfsが使えるようになる。
# zfs
kldstatコマンドを実行してzfs.koが表示されていればzfsは有効になっている。
# kldstat Id Refs Address Size Name 1 5 0xc0400000 906518 kernel 2 1 0xc0d07000 b86fc zfs.ko 3 1 0xc0dc0000 2464 accf_http.ko 4 1 0xc0dc3000 6a32c acpi.ko
もちろん、この方法だとFreeBSDの終了時に毎回ちゃんとアンマウントをしないといけないし起動時に手動で有効化してマウントしないといけない。それが面倒くさい場合はrc.dを利用すればその辺を自動でやってくれる。
# echo 'zfs_enable="YES"' >> /etc/rc.conf # /etc/rc.d/zfs start
rc.dを利用すると、FreeBSDの終了時に勝手にアンマウントしてくれるので、アンマウントを忘れてデータが壊れることがなくなるはず。ただ、rc.confに書いただけだとzfs.koがロードされないので、下記のように/boot/loader.confを編集して起動時にロードされるようにする。
# echo 'zfs_load="YES"' >> /boot/loader.conf
ストレージプールの作成
通常のストレージプール作成
単純なストレージプールを作成するには以下のコマンドを実行すれば良い。この方法で作成すると、RAID0と同じ様にストライプされる。RAID0と同様のストレージプールなので、ハードディスクが1台でも壊れるともうどうしようもないはず。
# zpool create -m /zdevel zpool0 da0s1 da0s2 da1s1 da1s2
pool: zpool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da0s2 ONLINE 0 0 0 da1s1 ONLINE 0 0 0 da1s2 ONLINE 0 0 0 errors: No known data errors
ミラーリングされたストレージプール作成
ミラーリングしたい場合はmirrorって付けて実行すれば良い。基本RAID1と同じ様な感じにミラーリングされるけども、チェックサムとの比較を行なってエラーがあるともう片方から壊れた部分を読み取って直してくれるらしい。
# zpool create -m /zdevel zpool0 mirror da0s1 da1s1
# zpool status pool: zpool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 mirror ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da1s1 ONLINE 0 0 0 errors: No known data errors
シングルパリティなストレージプール作成
raidzキーワードを付けるとRAID5と同じ様なストレージプールができる。mirrorと同じ様にエラーがあると正常なデータに自動で直してくれるらしい。また、zfsのraidzは普通のRAID5と違って可変幅のストライプを使用しているのでRAID5にある書き込みホールというのが起きないらしい。
# zpool create -m /zdevel zpool0 raidz da0s1 da0s2 da1s1 da1s2
# zpool status pool: zpool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da0s2 ONLINE 0 0 0 da1s1 ONLINE 0 0 0 da1s2 ONLINE 0 0 0 errors: No known data errors
ダブルパリティなストレージプール作成
raidzキーワードを付けるとRAID6と同じ様なストレージプールができる。これもシングルパリティなストレージプールと同様エラーを自動修復してくれて、書き込みホールが起きないらしい。
# zpool create -m /zdevel zpool0 raidz2 da0s1 da0s2 da1s1 da1s2
# zpool status pool: zpool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 raidz2 ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da0s2 ONLINE 0 0 0 da1s1 ONLINE 0 0 0 da1s2 ONLINE 0 0 0 errors: No known data errors
ミラーリングされたストレージプールをストライピングする
ミラーリングされたストレージプール作成後、zpool addでミラーリングされたストレージプールを追加すると、RAID10と同じ様なストレージプールができる。
# zpool create -m /zdevel zpool0 mirror da0s1 da1s1 # zpool add zpool0 mirror da0s2 da1s2
# zpool status pool: zpool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 mirror ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da1s1 ONLINE 0 0 0 mirror ONLINE 0 0 0 da0s2 ONLINE 0 0 0 da1s2 ONLINE 0 0 0 errors: No known data errors
ホットスペア付きストレージプール作成
spareキーワードを付けるとホットスペア付きのストレージプールを作れる。通常のストレージプール以外全てで使用可能。
# zpool create -m /zdevel zpool0 raidz da0s1 da0s2 da1s1 da1s2 spare da0s3 da1s3
# zpool status pool: zpool0 state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM zpool0 ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0s1 ONLINE 0 0 0 da0s2 ONLINE 0 0 0 da1s1 ONLINE 0 0 0 da1s2 ONLINE 0 0 0 spares da0s3 AVAIL da1s3 AVAIL errors: No known data errors
続く?
とりあえずストレージプールの作成は出来た。ストレージプールにハードディスク追加したりするのは、またの機会に書く……かも。