FreeBSD Snapshot Management Environmentを使ってZFSのスナップショットを簡単に使う

ZFSのスナップショットは、2^64個作成可能な上、作成・削除は高速で大変使いやすい。さらに、スナップショットはZFSファイルシステムごとに作成可能だから、同じzpoolから切り出したファイルシステムの一部だけスナップショットを作成することが可能である。これはUFSでいうと、ディレクトリごとにスナップショットを作成する・しないが決められることに相当し、大変使いやすい。

# zfs list
NAME                         USED  AVAIL  REFER  MOUNTPOINT
users                        270K  16.5G    22K  /users
users/home                    76K  16.5G    22K  /users/home
users/home/markm              18K  16.5G    18K  /users/home/markm
users/home/markm@yesterday      0      -    18K  -
users/home/marks              18K  16.5G    18K  /users/home/marks
users/home/neil               18K  16.5G    18K  /users/home/neil

この例で言うと、/users/homeにはmarkm、marks、neilの3つのディレクトリ(ファイルシステム)が存在して、markmのみスナップショットを作成している。UFSだと/users/homeがひとつのファイルシステムになっていて、丸ごとスナップショットを作成するか、markm、marks、neilを別々のファイルシステムにするかになる。前者はスナップショットの範囲が狙いより広くなるし、後者はあらかじめディスク容量をそれぞれのファイルシステムに割り当てる必要があって、ディスク使用量の予想が外れた場合に悲しいことになる。ZFSなら3つのディレクトリは同じzpoolから作成されたファイルシステムだから、ディスク容量は共通になり、使用量の予想に気を遣う必要がない。すばらしい、ZFS++。
ところで、実際にスナップショットを使う場合、定期的にスナップショットを作成し、古いスナップショットは適宜削除することが多い。そんな作業を楽にするには、FreeBSD UFS/ZFS Snapshot Management Environmentがおすすめ。元はUFS Snapshot用のツールだけど、ZFSにも対応してる。使い方は、以前書いたエントリが参考になるはず。
まずはportsからsysutils/freebsd-snapshotをインストールしてcrontabに以下を追加し定期的に起動するように設定する。

0	*	*	*	*	root	/usr/local/sbin/periodic-snapshot hourly
0	0	*	*	*	root	/usr/local/sbin/periodic-snapshot daily
0	0	*	*	0	root	/usr/local/sbin/periodic-snapshot weekly

次に/etc/periodic.confにスナップショットを作成する設定を追加する。

snapshot_enable="YES"
snapshot_schedule="/home:2:10:0"

スナップショットの一覧は、snapshot(8)を使えばOK。UFSと違って一般ユーザ権限でも実行可能。

> zfs list -t snapshot
NAME                    USED  AVAIL  REFER  MOUNTPOINT
zroot/home@weekly.1    21.6M      -  46.3G  -
zroot/home@weekly.0    11.5M      -  46.8G  -

ZFS Snapshotへアクセスするには、自動的に生成されるファイルシステム直下の隠しファイル.zfs/snapshot/hogehogeを使うので、amdによる自動マウントの設定は不要。なんて楽ちん。

> ls -l /home/.zfs/snapshot 
total 18
drwxr-xr-x  5 root  wheel  6  1月 16 00:00 weekly.0
drwxr-xr-x  5 root  wheel  6  1月  9 00:00 weekly.1

ただし、FreeBSD Snapshot Management Environmentを使うファイルシステムでは、名前がhourly、daily、weeklyで始まるスナップショットは作成しないほうが無難。