rsync でファイルのスナップショットを取る

2018.03.17

rsync は--link-destを指定すると 前にバックアップしたときから変更されていないファイルをハードリンクとして保持することができる.

概要

rsync をバックアッププログラムとして使うと,次に示すメリットがある.

  1. 変更があったファイルのみコピーをするため,時間の短縮,通信帯域の節減
  2. 変更がなかったファイルについて,前回実行したバックアップのファイルへのハードリンクを貼れるため,記憶容量の節減
  3. 1., 2. を合わせて世代バックアップができる(スナップショットが撮れる)
  4. 復元するときプログラムの依存がない
  5. ログファイル,進捗を出力できる
  6. 圧縮して転送

デメリットは次の通り

  1. 通信は圧縮されるが,保存は圧縮されない
  2. rsync は属性をメタファイルで保存しないため,オーナーの変更には通常通り root が必要
  3. 進捗状況の表示書式はあまりいじれない

使用しているオプションは次の通り

-a: お決まり
-z: 圧縮通信
-C: バージョン管理システムが無視する
--delay-updates: 処理の最後に実際にファイルを反映させることができる(が,atomicではない)
--info=progress2: 全体の進捗表示
-h: 人間にとって読みやすい単位表示
--info=name0: 処理中のファイル名は表示しない
--remote-option=--log-file=$dest/log/$date.log": ログをリモートに保存
--link-dest: 変更がないファイルはハードリンクを貼る(フルバックアップのときを除く)
--exclude-from: 除外するファイルリスト

ハードリンクである以上,毎回フルバックアップを取っていると言えると思うが, ここではフルバックアップは「ローカルからファイルを必ずコピーしてバックアップすること」とする.

例として,バックアップを1回実行してバックアップサーバに

0001 /1/a
0003 /1/b/c
0004 /1/b/d

があったとして(左はinode,右はバックアップサーバのパス), /b/cのみが変更されたときに2回目のバックアップを取るとき,

0001 /1/a
0003 /1/b/c
0004 /1/b/d
0001 /2/a
0005 /2/b/c
0004 /2/b/d

のように,変更がなかった/aおよび/b/dは 前に取ったスナップショットと同じinodeになっていることから, /2/aおよび/2/b/d/1/へのハードリンクを貼っていることがわかる.

出力

出力については,-h --info=progress2 -h --info=name0 --remote-option=--log-file=... で,端末上には全体の進捗を表示しつつ,リモート側でログを取ることができる.

端末上は

        20.85G  80%    9.21MB/s    0:35:58 (xfr#133034, to-chk=31133/188255)

リモートのログファイルは

2018/03/17 02:33:48 [5115] >f+++++++++ YukariAkiyamaHubotSlack/bin/hubot

の形式で保存される.

プログラム

$HOME以下をリモートにバックアップするプログラム:

dotfiles/backup at master · noyuno/dotfiles

手動での使い方

一般にcronで毎日定期的にバックアップを取るのが望ましいが,そうでないときは次のようにする.

はじめにbackup -nと叩いてどの程度のバックアップサイズになるか計算する. つぎにbackupと叩いてバックアップを実行する.


新しい記事: オレオレ証明書を作成する 2018.04.17
古い記事: 湿度センサ 2018.03.05