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で始まるスナップショットは作成しないほうが無難。