- blogs:
- cles::blog

ZFS を使ってリモートのサーバにお手軽バックアップをとる



僕がファイルサーバに ZFS を使っているのは、ネットワーク越しにスナップショット転送ができるからと言っても過言ではありません。
しかも差分転送に対応しているので、ファイルが膨大に入っていても rsync などのように重くなるということがありません。
問題はこのスナップショットを定期的に作成したり、転送するためのジョブをいちいち書く必要があること。
これまではサーバを立てる度にスクリプトを手作りしていたのですが、いい加減面倒になってきたので、汎用的なものを作成してみました。
このスクリプトを使えばいちいちスナップショットの名前を調べたりする必要なくリモートにボリュームのコピーが作れるようになります。
† 設定方法
このスクリプトを送信元、受信先それぞれのサーバの適当な場所に仕込みます。
各スクリプトの先頭にある REMOTE_HOST, REMOTE_TANK, LOCAL_TANK や main() 内にあるボリューム名(スクリプト内では hoge )の部分については環境に合わせて書き換える必要があります。また、受信先 -> 送信元の間は ssh の公開鍵認証の設定を行って、パスワードなしでログインできるようにしておいてください。
送信元では以下の2つのタスクを cron などで定期的に実行してやります。
- createsnap.sh で定期的にスナップショットの作成を行う
- oldsnapdelete.shで古いスナップショットの削除を行う
受信先では以下の3つのタスクを実行します(cron で定期実行する必要があるのは下の2つ)
- (初回のみ)fullrecv.sh でスナップショットの受信を行う
- (2回目以降) inclrecv.sh で差分のスナップショットの受信を行う
- oldsnapdelete.shで古いスナップショットの削除を行う
† 実行例
以下が inclrecv.sh の実行例になります。
送信元と受信先のスナップショット名を調べて、共通するスナップショット(snap-20170317-030004)を検出し、それよりも新しいスナップショット(snap-20170318-030005)を転送しています。差分転送できない場合には "No common snapshot found" というエラーが表示されるようにしてありますので、この場合には fullrecv.sh を使ってください。また、転送すべきスナップショットがない場合には "Local volume is up-to-date" というメッセージを出して終了するようにしてあります。
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/9219
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112680)
3 . 年次の人間ドックへ(112140)
4 . 2023 年分の確定申告完了!(1つめ)(111710)
5 . 三菱鉛筆がラミーを買収(111589)