ZFS のバックアップ

バックアップでことなきを得た

と書いたけど、ことなきというわけでもなく、 死んだ PC を使っていた間はバックアップを取っていなかったので 半年ほどいろいろやったことが失われてしまった。 それでも死んだ PC に移す前にとっていたバックアップはあって、そこからいろいろ書き戻したのだった。 そんなわけで、失われたデータは半年ほどの分で済んだということでだいぶ助かった。

FreeBSD における ZFS のバックアップ

みなさんどうしているのかなと思うけれども、聞く機会もないので ports から探した結果近年は以下で落ち着いている。

zfs-periodic でスナップショットを取る

zfs-periodic はその名の通り定期的に指定した pool の各ファイルシステムのスナップショットを取ってくれるもので、 /etc/periodic.conf に設定を書くだけで以下のことをやってくれる。

  • 毎日、毎週、毎月のうち指定したものについてスナップショットを取る
  • 各期間のスナップショットは指定した数を残して、古いものを削除する

私の設定はこんな感じ。 バックアップのプールがちょっと小さいので警戒して年単位のバックアップは取っておいていないけれど、 一年前、二年前のデータを拾い出すという需要はあるそうなので、 月ごとのスナップショットはもっとたくさん残しておいてもよいかもしれない。

hourly_zfs_snapshot_enable="YES"
hourly_zfs_snapshot_pools="samd"
hourly_zfs_snapshot_keep=12
daily_zfs_snapshot_enable="YES"
daily_zfs_snapshot_pools="samd"
daily_zfs_snapshot_keep=7
weekly_zfs_snapshot_enable="YES"
weekly_zfs_snapshot_pools="samd"
weekly_zfs_snapshot_keep=5
monthly_zfs_snapshot_enable="YES"
monthly_zfs_snapshot_pools="samd"
monthly_zfs_snapshot_keep=6

zxfer でバックアップに転送する

スナップショットを取るのはいいが、これを定期的にバックアップに転送しなければ pool がぶっ壊れた(あるいは、pool をぶっ壊した) 時に救われない。

その用途には zxfer を使っている。 説明によれば rsync と組み合わさってリモートホストへ送ることもできて、 それが欲しい人も多いとは思うが、私は外付けのハードディスクにバックアップ用の pool を設けてそこに転送している。

具体的なことはまた面倒なので飛ばすが、だいたいこの人がやっていることをスケールダウンした感じである。

32TB分のHDDを買った

同じガチャベイシリーズでも HDD 4台のやつだし、HDD は余っているものの中から容量が少ない方から集めて raidz2 にしたものだし。 eSATA が不安定と書いているが、私の感触では eSATA のコネクタがいまいちで外れやすいわりに、 一度外れると FreeBSD ではもう見えてくれないというのがつらい感じ。 PC の裏でごそごそなんかすると pool が消えていて再起動ってのを何回かやったので気をつけている。

で、zxfer の設定は /etc/daily.local にこんな感じで書いている。 poudriere とか iocage とかは別に飛んでもまた作り直せばいいのでバックアップはしていない。 システム部分も、raidz2 の冗長性を乗り越えて飛んだら、その時点の stable を入れ直すから別によし。

# backup zfs filesystems
zxfer -dFkPv -R samd/exports/data bkup/filesystems
zxfer -dFkPv -R samd/home bkup/filesystems

個々のオプションの説明は man を読んでいただくとして、 -d で送り元にないスナップショットは消してくれるので、スナップショットが貯まっていって溢れてしまうということはない。 -R で指定したファイルシステム以下の(サブディレクトリ的な)ファイルシステムをまとめて転送してくれる。

その他

もう詳細は思い出せないが、初期には zfs-replicate も試したけど、あんましよくなかった。

zrep というのもあって、 サイトの説明を読むとなかなかよさげに見える。 ただ、バックアップの単位が filesystem のようで、 それより下の filesystem (サブディレクトリのイメージ)も一緒にバックアップしてくれるかよくわからなかったのと、 ライセンスがユーザーによる承認が必要なタイプで BATCH でビルドできないので poudriere に頼りきりな私はパスした。