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

続く?

とりあえずストレージプールの作成は出来た。ストレージプールにハードディスク追加したりするのは、またの機会に書く……かも。