HDDを増設してZFSを作ったのでメモ。
一本のHDDにpool、zfsを作成し、圧縮、重複排除機能の有効化まで。
環境は(残念ながら10.0-Rではなく)FreeBSD 9.2-RELEASE-p1。

lz4でzfsの圧縮機能を気軽に試せるように

ファイルシステムで圧縮機能を有効にすると、読み書きのいずれにもCPUパワーが必要で、要するに遅くなる。
非力なCPUを使っているとなかなか使いにくい機能なのだが、圧縮方法にlz4が選べるようになってハードルは下がったように思う。
lz4はここでも触れたが、めっぽう速い圧縮アルゴリズムである。
これはぜひとも使ってみなければ。

ディスクの確認とzfs機能の確認

物理ディスクを追加し、ブートしたらdmesgを確認する。

$ uname -r
9.2-RELEASE
$ dmesg|grep ada
ada2 at ahcich2 bus 0 scbus2 target 0 lun 0
ada2: <WDC WD30EZRX-00D8PB0 80.00A80> ATA-9 SATA 3.x device
ada2: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada2: Command Queueing enabled
ada2: 2861588MB (5860533168 512 byte sectors: 16H 63S/T 16383C)
ada2: quirks=0x1<4K>
ada2: Previously was known as ad8

ada2とのこと。

作業前にzfs, zpoolのバージョンを確認しておいてもいいかも。
zfs, zpoolそれぞれにupgradeオプションを与えればよい。
upgradeという名前の通り、upgradeのためのコマンドだが、バージョン確認にも使える。

$ zfs upgrade
This system is currently running ZFS filesystem version 5.

All filesystems are formatted with the current version.
$
$ zpool upgrade
This system supports ZFS pool feature flags.

The following pools are formatted with legacy version numbers and can
be upgraded to use feature flags.  After being upgraded, these pools
will no longer be accessible by software that does not support feature
flags.

VER  POOL
---  ------------
28   vault

Use 'zpool upgrade -v' for a list of available legacy versions.
Every feature flags pool has all supported features enabled.

zfsはバージョン5、zpoolはバージョン28。
このバージョンであれば、lz4による圧縮機能(LZ4 Compression algorithm support)と、重複排除機能(Deduplication)を使える。

pool、zfsの作成

warehouseというzpoolを作り、そこからbackupというボリュームを切り出す。

まずzpoolを作る。
ほんと簡単で速くて助かる。

$ sudo zpool create backup /dev/ada2
$

で確認。

$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault/itunes on /itunes (zfs, local, noatime, nfsv4acls)
vault/chamber on /chamber (zfs, local, noatime, nfsv4acls)
backup on /backup (zfs, local, nfsv4acls)

$ zpool status
pool: backup
state: ONLINE
scan: none requested
config:

NAME        STATE     READ WRITE CKSUM
backup      ONLINE       0     0     0
ada2      ONLINE       0     0     0

errors: No known data errors

pool: vault
state: ONLINE
(略)

$ df
 Filesystem     1K-blocks      Used      Avail Capacity  Mounted on
 /dev/ada0p2    239436440  20822200  199459328     9%    /
 devfs                  1         1          0   100%    /dev
 vault/itunes  1436646199 598670122  837976077    42%    /itunes
 vault/chamber 1796007595 958031518  837976077    53%    /chamber
 warehouse     2873622450        31 2873622419     0%    /warehouse

ではzpoolからzfsの切り出し。
先ほど作成したwarehouseからbackupという名前で。

$ sudo zfs create warehouse/backup
$
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault/itunes on /itunes (zfs, local, noatime, nfsv4acls)
vault/chamber on /chamber (zfs, local, noatime, nfsv4acls)
warehouse on /warehouse (zfs, local, nfsv4acls)
warehouse/backup on /warehouse/backup (zfs, local, nfsv4acls)
$ df
Filesystem        1K-blocks      Used      Avail Capacity  Mounted on
/dev/ada0p2       239436440  20823572  199457956     9%    /
devfs                     1         1          0   100%    /dev
vault/itunes     1436646199 598670122  837976077    42%    /itunes
vault/chamber    1796007595 958031518  837976077    53%    /chamber
warehouse        2873622404        32 2873622372     0%    /warehouse
warehouse/backup 2873622403        31 2873622372     0%    /warehouse/backup

あとは/etc/fstabに書くだけ。
warehouse/backupを/backupにマウントするとして以下のように書いておき。

warehouse/backup        /backup zfs     rw      0       0

/warehouse/backupをいったんunmountしてそれからmount。

$ sudo umount /warehouse/backup
$
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault/itunes on /itunes (zfs, local, noatime, nfsv4acls)
vault/chamber on /chamber (zfs, local, noatime, nfsv4acls)
warehouse on /warehouse (zfs, local, nfsv4acls)
$
$ sudo mount /backup
$
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault/itunes on /itunes (zfs, local, noatime, nfsv4acls)
vault/chamber on /chamber (zfs, local, noatime, nfsv4acls)
warehouse on /warehouse (zfs, local, nfsv4acls)
warehouse/backup on /backup (zfs, local, nfsv4acls)

圧縮機能と重複排除機能を有効に

ではさっそく圧縮機能と重複排除機能を有効にする。
といっても、すっごく簡単なんだけどね。

$ sudo zfs set dedup=on warehouse/backup
$
$ sudo zfs set compression=lz4 warehouse/backup
$

確認。
zfs getで対象zfsの属性を確認できる。

$ zfs get dedup warehouse/backup
NAME              PROPERTY  VALUE          SOURCE
warehouse/backup  dedup     on             local
$
$ zfs get compression warehouse/backup
NAME              PROPERTY     VALUE     SOURCE
warehouse/backup  compression  lz4       local
$

タイプが面倒ならzfs get allですべての属性を表示させ、grepすればよい。

$ zfs get all warehouse/backup|egrep "compre|ded"
warehouse/backup  compressratio         1.00x                    -
warehouse/backup  compression           lz4                      local
warehouse/backup  dedup                 on                       local
warehouse/backup  refcompressratio      1.00x                    -

書き込んでみる

今回追加したHDDはもともとバックアップ用途のつもり。
ここにスナップショットを流しこんでみる。

以下のようにしてスナップショットを作成する。

$ sudo zfs snapshot vault/itunes@`date +%Y%m%d`
$
$ sudo zfs snapshot vault/chamber@`date +%Y%m%d`

スナップショットのサイズは以下のとおりである。

$ zfs list -t snapshot
NAME                     USED  AVAIL  REFER  MOUNTPOINT
vault/chamber@20131121      0      -   914G  -
vault/itunes@20131121       0      -   571G  -

これらスナップショットをバックアップのHDDに流し込む。
zfs sendとzfs recvをパイプで繋ぐ必要がある。
sudoを使う場合にはsh -cで。

$ sudo sh -c "zfs send vault/chamber@20131121 | zfs recv warehouse/backup/chamber"

注意点がある。
以上のようにsnapshotを送ると、受け側では:
①warehouse/backup/chamber ができ、さらに;
②warehouse/backup/chamber@20131121 つまり;
実ディレクトリで言えばwarehouse/backup/chamber/.zfs/snapshot/20131121ができる。

漠然とvault/chamber@20131121の内容がwarehouse/backup/chamberに書き込まれる思っていたので驚いた。

また、ロードアベレージを監視するような仕組みは特に入れていなかったので、topの出力を見たところ5を超えてた。ちょっと怖い。

last pid: 10483;  load averages:  5.37,  2.84,  1.36           up 2+23:24:54  22:01:40
45 processes:  3 running, 42 sleeping
CPU:  0.0% user,  0.0% nice, 56.8% system,  0.3% interrupt, 42.9% idle
Mem: 20M Active, 96M Inact, 1592M Wired, 11M Cache, 200M Buf, 120M Free
ARC: 1039M Total, 58M MFU, 826M MRU, 103M Anon, 11M Header, 40M Other
Swap: 907M Total, 10M Used, 897M Free, 1% Inuse

そしてたかだか913GBのsnapshotの転送にかかった時間であるが。

real    3756m59.109s
user    0m0.048s
sys     192m3.897s

まる二日半て…。
これは圧縮か重複排除か、どちらか止めた方がいいかもわからんね。

差分snapshotの転送

オリジナルディスクで複数回snapshotを作成した場合、バックアップディスクにはその差分を送ることができる。
zfs sendに-iを与え、二つのsnapshotを指定すればよいだけ。

$ sudo sh -c "zfs send -i vault/chamber@20131121 vault/chamber@20131125 | zfs recv warehouse/backup/chamber"

以上