#はじめに
ZFS on LinuxでZFSを使い始めたのですが、自動的にスナップショットを作成し、一定期間経過したら削除したくなりました。cronで自動運用する方法を公開します。
#ファイル作成
$ touch /etc/cron.daily/zfs-snapshot
$ chmod u=rwx,g=rx,o=rx /etc/cron.daily/zfs-snapshot #実行属性を付ける
#ファイル内容
#!/bin/bash
snapshot () {
#第1引数: ファイルシステムまたはボリュームを指定
#第2引数: スナップショットの先頭に付ける文字列を指定
date=$(date -u +'%Y%m%dT%H%M%SZ') #20151231T235959Z形式
zfs snapshot ${1}@${2}${date}
}
snapshot_destroy () {
#第1引数: ファイルシステムまたはボリュームを指定
#第2引数: スナップショットの先頭に付ける文字列を指定
#第3引数: 保存期間を指定(この場合30日間保存)
date=$(date -u -d "${3}" +%Y%m%dT%H%M%SZ)
for snapshot in $(zfs list -H -o name -t snapshot -r ${1}); do #スナップショットの一覧を取得
snapshot_date=${snapshot#*@${2}} #日付部分を切り出し
if [[ ${snapshot_date} =~ ^[0-9]{8}T[0-9]{6}Z$ ]]; then #日付の形式を正規表現で確認
if [[ ${snapshot_date} < ${date} ]]; then #保存期間を過ぎていたら
echo "destroy ${snapshot}"
zfs destroy ${snapshot} #破棄
fi
fi
done
}
snapshot 'tank/home' 'auto'
snapshot_destroy 'tank/home' 'auto' '30 days ago'
SambaからWindowsのエクスプローラーでスナップショットを開いていると cannot destroy snapshot tank/home@20151231T235959Z: dataset is busy と表示され破棄できませんでしたが、エクスプローラーを閉じれば破棄できました。