FreeBSDでzfsを試してみた その4

jailの構築が終わったのでjail内でzfsを試してみる。

jailの設定

まず、jailでマウントが出来るようにする。

# sysctl security.jail.mount_allowed=1

これだと、再起動した時にもう一回やらないといけないので、/etc/sysctl.confに書いておく

# echo'sysctl security.jail.mount_allowed=1' >> /etc/sysctl.conf

次にjail内でzfsコマンドを使用できるようにする。

# vim /usr/local/etc/ezjail/sample01
- export jail_sample01_devfs_ruleset="devfsrules_jail"
+ export jail_sample01_devfs_ruleset="zfsenable"

前回ezjailをインストールした時に/usr/local/etc/ezjail.confに以下の様に書いておけば上のはいらなかったぽい。

# vim /usr/local/etc/ezjail.conf
ezjail_devfs_enable="YES"
ezjail_devfs_ruleset="zfsenable"

ezjail.confがezjail-adminでjail作るときにしか意味がないのに気づかずにしばらくここで苦戦した><

zfsの設定

次はzfsのファイルシステムをjailで操作できるように設定する。

# zfs create zpool0/jail
# jls
   JID  IP Address      Hostname                      Path
    1  192.168.0.82    sample01                      /usr/local/jails/sample01
# zfs jail 1 zpool0/jail
# zfs set jailed=on zpool0/jail

これでjail内でzfsが使用できるようになったはず。

検証

動いているか確認をする。

# jexec 1 /bin/tcsh
sample01# zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
zpool0           513M  1.44G    20K  /zdevel
zpool0/jail       18K  1.44G    18K  /zdevel/jail
sample01# ls /zdevel
jail

zfs createコマンドを試してみる。

sample01# zfs create zpool0/jail/sample01
sample01# zfs create zpool0/sample01
cannot create 'zpool0/sample01': permission denied

ちゃんとjailの設定がされているzpool0/jailにはzfsのボリュームを作れて、設定がされてないzpool0には作られない。

速度比較

sample01# dd if=/dev/urandom of=/zdevel/jail/random.dat count=131072 bs=1024
131072+0 records in
131072+0 records out
134217728 bytes transferred in 12.411375 secs (10814090 bytes/sec)
# dd if=/dev/urandom of=/zdevel/random.dat count=131072 bs=1024
131072+0 records in
131072+0 records out
134217728 bytes transferred in 12.342206 secs (10874695 bytes/sec)

普通にファイルの作成とかも出来るし、速度もjail内と外で大差ない。

まとめ

これで大体FreeBSDで出来ることは終わりかな?
USBメモリを2本挿すだけで簡単にテストできるのは嬉しかった。ただ、やっぱりUSBメモリなのでちゃんとしたHDDで速度とかのテストをしたいところ。
FreeBSDでiSCSIが利用可能になるのはいつになるんだろう……

zfsで圧縮機能を試してみる

とりあえずこんな感じで3つほどファイルシステム作成して試してみた。

# zpool create -m /zdevel zpool0 da0s1 da0s2 da1s1 da1s2
# zfs create zpool0/hamaco
# zfs create zpool0/jack
# zfs create zpool0/rucifer

圧縮を有効にする

zfs setコマンドを使って圧縮機能を有効にする。

# zfs set compress=on zpool0/jack
# zfs set compress=gzip zpool0/rucifer

compressにはが使用可能。このうちonとlzjbは同じ動作をする。gzipは多分gzip-6と同じだと思う。

5.5Mのファイルをコピーしてみる。

# cd /zdevel
shana# time cp /usr/local/www/public/sample.bmp hamaco/
0.006u 0.012s 0:00.01 100.0% 48+1892k 0+0io 0pf+0w
shana# time cp /usr/local/www/public/sample.bmp jack/
0.000u 0.016s 0:00.02 50.0% 32+1696k 0+0io 0pf+0w
shana# time cp /usr/local/www/public/sample.bmp rucifer/
0.005u 0.011s 0:00.01 100.0% 48+1892k 0+0io 0pf+0w

この程度だと圧縮してても速度は殆ど大差がない。

ディスク使用量を見てみる。

# zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
zpool0          9.82M  1.93G    22K  /zdevel
zpool0/hamaco   5.52M  1.93G  5.52M  /zdevel/hamaco
zpool0/jack     2.51M  1.93G  2.51M  /zdevel/jack
zpool0/rucifer  1.65M  1.93G  1.65M  /zdevel/rucifer

shana# zfs get compressratio
NAME            PROPERTY       VALUE           SOURCE
zpool0          compressratio  1.71x           -
zpool0/hamaco   compressratio  1.00x           -
zpool0/jack     compressratio  2.21x           -
zpool0/rucifer  compressratio  3.37x           -

ちゃんと圧縮されて保存されているみたい。compressratioで圧縮率が分かる。

速度比較

/dev/urandomを使って128MBのファイルを作成する。

shana# dd if=/dev/urandom of=hamaco/random.dat count=131072 bs=1024
131072+0 records in
131072+0 records out
134217728 bytes transferred in 10.760321 secs (12473394 bytes/sec)

shana# dd if=/dev/urandom of=jack/random.dat count=131072 bs=1024
131072+0 records in
131072+0 records out
134217728 bytes transferred in 12.353089 secs (10865115 bytes/sec)

shana# dd if=/dev/urandom of=rucifer/random.dat count=131072 bs=1024
131072+0 records in
131072+0 records out
134217728 bytes transferred in 23.177062 secs (5790972 bytes/sec)

圧縮率がよくなるにつれて、速度が低下しているのが分かる。

/dev/zeroで128MBのファイルを作ると、逆に圧縮しているほうが速くなる。

shana# dd if=/dev/zero of=hamaco/zero.dat count=131072 bs=1024
131072+0 records in
131072+0 records out
134217728 bytes transferred in 8.296105 secs (16178403 bytes/sec)
shana# dd if=/dev/zero of=jack/zero.dat count=131072 bs=1024
131072+0 records in
131072+0 records out
134217728 bytes transferred in 4.481962 secs (29946200 bytes/sec)
shana# dd if=/dev/zero of=rucifer/zero.dat count=131072 bs=1024
131072+0 records in
131072+0 records out
134217728 bytes transferred in 4.336304 secs (30952103 bytes/sec)

最後に

FreeBSDzfsだとshareiscsiが使えない>

sharenfsも

#zfs set sharenfs=on {pool_name}

だけだと、動かないし……
時間のある時にでもOpenSolaris入れて試してみるか~

FreeBSDでzfsを試してみた その4

今回はスナップショットのクローン作成とかその辺。前回の続きなので今はこんな構成。

# zpool status
  pool: zpool0
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zpool0      ONLINE       0     0     0
          da0s1     ONLINE       0     0     0
          da1s1     ONLINE       0     0     0

errors: No known data errors
# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
zpool0               64.2M   912M    20K  /zdevel
zpool0/hamaco        64.0M   912M  64.0M  /zdevel/hamaco

全部スナップショットを削除してしまったので作る。

# zfs snapshot zpool0/hamaco@first

スナップショットのクローン

さっき作ったスナップショットのクローンを作成してみる。

# zfs clone zpool0/hamaco@first zpool0/hmc_first
# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
zpool0               64.2M   912M    21K  /zdevel
zpool0/hamaco        64.0M   912M  64.0M  /zdevel/hamaco
zpool0/hamaco@first      0      -  64.0M  -
zpool0/hmc_first         0   912M  64.0M  /zdevel/hmc_first

クローンもスナップショットと同様作成しただけではディスクを消費しない。
クローンにファイルを追加したりするとその分だけディスクを消費する。

# mkfile 32M /zdevel/hmc_first/fugafuga
# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
zpool0               96.2M   880M    21K  /zdevel
zpool0/hamaco        64.0M   880M  64.0M  /zdevel/hamaco
zpool0/hamaco@first      0      -  64.0M  -
zpool0/hmc_first     32.0M   880M  96.0M  /zdevel/hmc_first

クローンに対してzfs promoteコマンドを使うと、元データとの関係を逆転させることが出来る。

# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
zpool0               96.2M   880M    21K  /zdevel
zpool0/hamaco        64.0M   880M  64.0M  /zdevel/hamaco
zpool0/hamaco@first      0      -  64.0M  -
zpool0/hmc_first     32.0M   880M  96.0M  /zdevel/hmc_first
# zfs promote zpool0/hmc_first
# zfs list
NAME                     USED  AVAIL  REFER  MOUNTPOINT
zpool0                  96.2M   880M    21K  /zdevel
zpool0/hamaco               0   880M  64.0M  /zdevel/hamaco
zpool0/hmc_first        96.1M   880M  96.0M  /zdevel/hmc_first
zpool0/hmc_first@first    17K      -  64.0M  -

スナップショットのバックアップ

zfs sendコマンドを使うと、スナップショットのデータが標準出力に書き出される。

# zfs send zpool0/hmc_first@first > snapshot
# ls -lh snapshot
-rw-r--r--  1 root  wheel    64M Apr 18 18:11 snapshot

定期的にバックアップをとる時などは、-iオプションを付けると差分だけとれるので便利。

# zfs snapshot zpool0/hmc_first@second
# zfs send -i zpool0/hmc_first@first zpool0/hmc_first@second > snapshot2
# ls -lh snapshot2
-rw-r--r--  1 root  wheel    32M Apr 18 18:11 snapshot2

zfs receiveコマンドでスナップショットのバックアップファイルから復元出来る。

# zfs send zpool0/hmc_first@second > snapshot
zfs receive zpool0/hmc_second < snapshot
# zfs list
NAME                       USED  AVAIL  REFER  MOUNTPOINT
zpool0                     192M   784M    22K  /zdevel
zpool0/hamaco                 0   784M  64.0M  /zdevel/hamaco
zpool0/hmc_first          96.1M   784M  96.0M  /zdevel/hmc_first
zpool0/hmc_first@first      17K      -  64.0M  -
zpool0/hmc_first@second       0      -  96.0M  -
zpool0/hmc_second         96.0M   784M  96.0M  /zdevel/hmc_second
zpool0/hmc_second@second      0      -  96.0M  -

sendとreceiveをパイプラインで組み合わせると、こんなことも出来る。(ごちゃごちゃしてたので、最初の状態に戻してある)

# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
zpool0               64.2M   912M    20K  /zdevel
zpool0/hamaco        64.0M   912M  64.0M  /zdevel/hamaco
zpool0/hamaco@first      0      -  64.0M  -
# zfs send zpool0/hamaco@first | zfs receive zpool0/hamaco_bk
# zfs list
NAME                     USED  AVAIL  REFER  MOUNTPOINT
zpool0                   128M   848M    21K  /zdevel
zpool0/hamaco           64.0M   848M  64.0M  /zdevel/hamaco
zpool0/hamaco@first         0      -  64.0M  -
zpool0/hamaco_bk        64.0M   848M  64.0M  /zdevel/hamaco_bk
zpool0/hamaco_bk@first      0      -  64.0M  -
# mkfile 32M /zdevel/hamaco/fugafuga
# zfs snapshot zpool0/hamaco@second
# zfs send -i zpool0/hamaco@first zpool0/hamaco@second | zfs receive zpool0/hamaco_bk
# zfs list
NAME                      USED  AVAIL  REFER  MOUNTPOINT
zpool0                    192M   784M    21K  /zdevel
zpool0/hamaco            96.1M   784M  96.0M  /zdevel/hamaco
zpool0/hamaco@first        17K      -  64.0M  -
zpool0/hamaco@second         0      -  96.0M  -
zpool0/hamaco_bk         96.1M   784M  96.0M  /zdevel/hamaco_bk
zpool0/hamaco_bk@first     17K      -  64.0M  -
zpool0/hamaco_bk@second      0      -  96.0M  -

標準出力に書き出されているので、sshコマンドを使って外部に送ることも出来る。

# zfs send zpool0/hamaco@second | ssh localhost zfs receive zpool0/remote
Password:
# zfs list
NAME                      USED  AVAIL  REFER  MOUNTPOINT
zpool0                    385M   591M    23K  /zdevel
zpool0/hamaco            96.1M   591M  96.0M  /zdevel/hamaco
zpool0/hamaco@first        17K      -  64.0M  -
zpool0/hamaco@second         0      -  96.0M  -
zpool0/hamaco_bk         96.1M   591M  96.0M  /zdevel/hamaco_bk
zpool0/hamaco_bk@first     17K      -  64.0M  -
zpool0/hamaco_bk@second      0      -  96.0M  -
zpool0/remote            96.0M   591M  96.0M  /zdevel/remote
zpool0/remote@second         0      -  96.0M  -

ただ、FreeBSDの一般ユーザ権限でzfsを動作させる方法が分からないので、PermitRootLoginを有効にして試してみた。

まとめ

とりあえず基本的な所は大体終わりかな?
次はiSCSIとかjailとかをやってみる予定。

FreeBSDでzfsを試してみた その3

今回はスナップショットを使ってみる。

とりあえず普通にストレージプールとディレクトリの作成。

# zpool create -m /zdevel zpool0 da0s1 da1s1
# zfs create zpool0/hamaco

スナップショット作成

zfs snapshotコマンドでスナップショットを作成できる。適当にファイルを作ってスナップショットを作成してみる。

# mkfile 64M /zdevel/hamaco/hogehoge
# zfs snapshot zpool0/hamaco@first

ストレージプール名@スナップショット名という形で指定する。出来上がったスナップショットの中身を見る場合は、以下の様にスナップショットを作成したディレクトリの下にあるzfsディレクトリを見れば良い。

# ls /zdevel/hamaco/.zfs/snapshot/first
hogehoge

スナップショットを作成しても、ストレージプールの使用量に変化はない。もちろんスナップショットなのでファイルの追加とかの操作は一切出来ない。

# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
zpool0               64.2M   912M    19K  /zdevel
zpool0/hamaco        64.0M   912M  64.0M  /zdevel/hamaco
zpool0/hamaco@first      0      -  64.0M  -

元のディレクトリに何かファイルを追加してもスナップショットの中身には全く変化なし。ただ、何か情報が増えたのか微妙にUSEDは増えている。それにしてもzfs listで見ると、容量表示がおかしい。

shana# mkfile 32M /zdevel/hamaco/fugafuga
shana# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
zpool0               88.6M   887M    19K  /zdevel
zpool0/hamaco        88.4M   887M  88.4M  /zdevel/hamaco
zpool0/hamaco@first    17K      -  64.0M  -

# df -h /zdevel /zdevel/hamaco /zdevel/hamaco/.zfs/snapshot/first
Filesystem            Size    Used   Avail Capacity  Mounted on
zpool0                880M      0B    880M     0%    /zdevel
zpool0/hamaco         976M     96M    880M    10%    /zdevel/hamaco
zpool0/hamaco@first   944M     64M    880M     7%    /zdevel/hamaco/.zfs/snapshot/first
# ls /zdevel/hamaco
fugafuga hogehoge

# ls /zdevel/hamaco/.zfs/snapshot/first
hogehoge

とりあえず、この時点でもスナップショットを作成しておく。

# zfs snapshot zpool0/hamaco@second
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
zpool0                96.2M   880M    19K  /zdevel
zpool0/hamaco         96.1M   880M  96.0M  /zdevel/hamaco
zpool0/hamaco@first     17K      -  64.0M  -
zpool0/hamaco@second      0      -  96.0M  -

スナップショットからの復元

zfs rollbackコマンドでスナップショットから復元が出来る。この時に指定したスナップショットよりも新しいスナップショットがある場合警告が出る。

# zfs rollback zpool0/hamaco@first
cannot rollback to 'zpool0/hamaco@first': more recent snapshots exist
use '-r' to force deletion of the following snapshots:
zpool0/hamaco@second
  • rオプションを付ければ復元することが出来るが、新しいスナップショットは全て消えてしまう。
# zfs rollback -r zpool0/hamaco@first
shana# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
zpool0               64.2M   912M    20K  /zdevel
zpool0/hamaco        64.0M   912M  64.0M  /zdevel/hamaco
zpool0/hamaco@first      0      -  64.0M  -

# ls /zdevel/hamaco
hogehoge

スナップショットの破棄

zfs destroyコマンドで破棄出来る。

# zfs destroy zpool0/hamaco@first

また、そのディレクトリのスナップショットを全て破棄したい場合は以下の様に-rオプションを付ければ良い。

# zfs destroy -r zpool0/hamaco

まとめ

zfsでは凄く簡単にスナップショットが作成出来る。なにか影響のありそうな事をやる前にとっておけば、なにかあった時にすぐに戻せて便利。
次はスナップショットのバックアップとかをやってみる。

FreeBSDでzfsを試してみた その2

前回の続き。
今回はmirror環境でハードディスクの追加とか削除とかをやってみる。多分raidzとかでも同じ様に出来ると思う。

# zpool create -m /zmirror 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

適当なデータの書き込み

とりあえず、なにか適当なデータを書き込んでおく。

# vim /zmirror/helloworld.rb
#!/usr/bin/env ruby

p "Hello world!"
# ruby /zmirror/helloworld.rb
"Hello world!"

ついでに、ベンチマークをかねて128MBのファイルを作成する。mkfileコマンドがなかったのでついでにインストールした。timeコマンドはcshの内部コマンドを使用しているので、zshとかでやるとちょっと出力のされかたが違うかもしれない。

# portinstall /usr/ports/sysutils/mkfile

# time mkfile 128M sample
0.000u 0.318s 0:09.48 3.2%        5+1566k 0+0io 0pf+0w

128MBのファイルを作成するのに約10秒くらい。別にmkfileをインストールしなくてもddコマンドでも出来る。

# dd if=/dev/zero of=zero.dat count=131072 bs=1024
131072+0 records in
131072+0 records out
134217728 bytes transferred in 7.488602 secs (17922935 bytes/sec)

countの計算が面倒くさいけど、とくになにもインストールしなくていいからddのが楽だと思う。時間しか分からないけど。
参考までに、librettoのハードディスクに作成した時の結果。

# time mkfile 128M sample
0.000u 0.321s 0:07.57 4.2%        5+1661k 0+1021io 0pf+0w

ハードディスクの追加

ハードディスクを追加するにはzpool attachコマンドを使用する。とりあえず、2台でのミラーリングから3台でのミラーリングにしてみる。

# zpool attach zpool0 da0s1 da0s2

確認してみる。データの同期が完了していないとstatusとかにちゃんと出てくる。

# zpool status
  pool: zpool0
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress, 86.40% done, 0h0m to go
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
            da0s2   ONLINE       0     0     0

errors: No known data errors

同期が完了するまでしばらく待つ。同期が完了したらこんな感じ。

# zpool status
  pool: zpool0
 state: ONLINE
 scrub: resilver completed with 0 errors on Wed Apr 16 14:17:43 2008
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
            da0s2   ONLINE       0     0     0

errors: No known data errors
# df -h /zmirror
Filesystem    Size    Used   Avail Capacity  Mounted on
zpool0        472M    128M    344M    27%    /zmirror

ちゃんとmirrorに1台追加されていて、容量も変化していない。とりあえず、最初に作ったrubyファイルを実行してみる。

# ruby /zmirror/helloworld.rb
"Hello world!"

ちゃんと動いた。この状態でまたベンチマークをかねて128MBのファイルを作成する。

# time mkfile 128M sample2
0.000u 0.300s 0:13.53 2.2%        5+1464k 0+0io 0pf+0w

2台の時と比べると、4秒程遅くなっている。CPU使用時間とかは殆ど変っていないので、純粋にハードディスクへの書き込み分遅くなっているのかな?

ハードディスクの削除

ハードディスクの削除にはzpool dettachコマンドを使用する。さっき追加したのとは違うハードディスクを削除してみる。

# zpool detach zpool0 da0s1

確認してみる。

# zpool status
  pool: zpool0
 state: ONLINE
 scrub: resilver completed with 0 errors on Wed Apr 16 14:17:43 2008
config:

        NAME        STATE     READ WRITE CKSUM
        zpool0      ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            da1s1   ONLINE       0     0     0
            da0s2   ONLINE       0     0     0

errors: No known data errors
# df -h /zmirror
Filesystem    Size    Used   Avail Capacity  Mounted on
zpool0        472M    256M    216M    54%    /zmirror

ちゃんと2台のミラーリングになっている。で、最初に作ったrubyファイルを実行してみる。

# ruby /zmirror/helloworld.rb
"Hello world!"

ちゃんと動いている。

ハードディスクの交換

ハードディスクの交換にはzpool replaceコマンドを使用する。

# zpool replace zpool0 da1s1 da0s1

交換中のzpool statusはこんな感じ。

# zpool status
  pool: zpool0
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress, 50.00% done, 0h0m to go
config:

        NAME           STATE     READ WRITE CKSUM
        zpool0         ONLINE       0     0     0
          mirror       ONLINE       0     0     0
            replacing  ONLINE       0     0     0
              da1s1    ONLINE       0     0     0
              da0s1    ONLINE       0     0     0
            da0s2      ONLINE       0     0     0

errors: No known data errors

しばらく待つと交換が完了した。ただ、同じUSBメモリの別パーティション同士でやったら75%辺りで固まってしまった。再起動してもう一回やったら大丈夫だったけど。

# zpool status
  pool: zpool0
 state: ONLINE
 scrub: resilver completed with 0 errors on Wed Apr 16 15:12:11 2008
config:

        NAME        STATE     READ WRITE CKSUM
        zpool0      ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            da0s1   ONLINE       0     0     0
            da0s2   ONLINE       0     0     0

errors: No known data errors
# df -h /zmirror
Filesystem    Size    Used   Avail Capacity  Mounted on
zpool0        472M    256M    216M    54%    /zmirror

まとめ

ハードディスクの追加とかがコマンド一発で出来るのは楽でいい感じ。時間のある時にでもハードウェアRAIDとの速度比較をやってみたい。ただ、それをやれるマシンがない……
次はスナップショットとかその辺をやってみる予定。

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

続く?

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