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"
以上