rdiff-backupを使ってバックアップしてみた

rdiff-backupとは

rdiff-backupとはファイルやディレクトリのバックアップを取ることが出来るツールです。 rsync差分バックアップ機能をつけたもの、というイメージでだいたいあってます。

(内部的にはrsyncを使っているわけではなく、rsyncの差分ファイルを作成するのに使われるrdiffというプログラムを共通で用いているだけなので、細かい差はある。)

rdiff-backup は、ネットワーク対応のディレクトリバックアップツールです。ディレクトリの完全なコピーが保存されるとともに、特別なサブディレクトリに逆差分ファイルが保存され、過去に失われてしまったファイルを復元することが出来ます。すなわち、ミラーと差分バックアップのいいところ取りです。rdiff-backup は、サブディレクトリ、ハードリンク、デバイスファイル、パミッション、所有者のユーザー/グループID、ファイル変更時間、拡張属性、アクセスコントロールリスト、リソースフォークを保存します。

気まぐれサーバー - rdiff-backup - ローカル/リモートのミラーと差分バックアップ-rdiff-backup-気まぐれ Wiki http://web.archive.org/web/20100328234759/http://seki.jpn.org/modules/pukiwiki/index.php?rdiff-backup

機能

  • ネットワーク経由でのバックアップ

    rsyncと同様に、リモートシェル経由でのバックアップに対応しています。 その場合、サーバー・クライアント双方にrdiff-backupをインストールする必要があります。 rsyncと同様に、バックアップを置くターゲット側、バックアップをとるソース側のどちらからでもバックアップは行えます。

  • ミラーリング

    バックアップ先にはディレクトリの完全なコピーが作成されます。

  • 逆増分バックアップ

    差分を逆方向に、すなわち差分a,b,c,...を

    最新→(a)→一つ前→(b)→2つ前→(c)→3つ前...

    みたいにとっていき、保存するのは最新のファイル全体と差分のみにするという方法。 完全バックアップに比べ、使用するディスク容量、バックアップ時間等を抑えられます。

rsyncに比べると遅くなる、各種機能(例えばcopy-links,copy-unsafe-linksなど)が使えないなどのデメリットがあります。 また、増分バックアップはバックアップファイルのうち1つでも壊れるとすぐに過去のバックアップが読めなくなってしまいます。 増分の作成中やファイルの更新中にバックアップが中断した場合容易に過去のバックアップが消えうるため、容量に余裕がある場合には 数世代の完全バックアップ行うことを強く勧めておきます。

ディスクに余裕がないけど複数世代のデータのバックアップが欲しいとか、バックアップの頻度が多く増分バックアップが必要という人にはオススメ。

使い方

$ rdiff-backup dir1 dir2

を実行すると、dir1の内容がdir2にバックアップされます。

dir2にはdir1の直下にあるディレクトリ・ファイルがミラーリングされ、またrdiff-backup-dataというメタ情報を格納したディレクトリが作られる。 ここにはパーミッション、所有者のユーザー/グループIDなんかが入っています。

これらの情報をファイルとは別に管理するため、rsyncと違いバックアップにroot権限が要らないのは結構な利点。

実行結果

$ mkdir dir1 dir2
$ touch dir1/foo
$ tree .
.
|-- dir1
|   `-- foo
`-- dir2

2 directories, 1 file
$ rdiff-backup dir1 dir2
$ tree .
.
|-- dir1
|   `-- foo
`-- dir2
    |-- foo
    `-- rdiff-backup-data
        |-- access_control_lists.2014-06-30T13:37:23+09:00.snapshot
        |-- backup.log
        |-- chars_to_quote
        |-- current_mirror.2014-06-30T13:37:23+09:00.data
        |-- error_log.2014-06-30T13:37:23+09:00.data
        |-- extended_attributes.2014-06-30T13:37:23+09:00.snapshot
        |-- file_statistics.2014-06-30T13:37:23+09:00.data.gz
        |-- increments
        |-- mirror_metadata.2014-06-30T13:37:23+09:00.snapshot.gz
        `-- session_statistics.2014-06-30T13:37:23+09:00.data

4 directories, 11 files

以下のように指定すると、ネットワーク越しに同期ができます。

rdiff-backup dir1 user@system::/dir2

詳しい使い方を知りたければmanを参照するのが一番わかりやすい。 あまり日本語の情報量は多くはありませんでした。

rdiff-backup: Documentation

実際の運用

個人的に運用しているサーバーのバックアップとして導入しました。 そもそも以前はミラーリングだけしか行っておらず、バックアップとしては不十分な状態でした。

これを導入することで、増分バックアップとはいえ複数世代分のバックアップを残せるようになったのは大きいと思っいます。

バックアップはソース側となる公開サーバー上でcronを実行してターゲット側となるバックアップマシンに同期を行うようにしています。 これに関してはどちらから同期を行っても良かったのだけれど、root権限がないと読み出せないデータをバックアップしている以上、 公開サーバー上のSSHに(forced-commands-only,IP制限等はかけるとはいえ)rootで入れるようにするよりは、バックアップサーバー上の 一般ユーザーに入れるようにしたほうが良いと考えこのようにしました。

もし定石のようなものがあれば教えて下さい。

また、SSHのforced commandを使って次のように鍵の設定を行うことで、この鍵で接続した場合相手の入力に関わらずcommandが実行され、 rdiff-backup以外のプログラムを走らせること、rdiff-backupが/backup以外のディレクトリにアクセスすることを制限できます。

# authorized_keys
command="/usr/bin/rdiff-backup --server --restrict /backup"
,no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa (公開鍵)

参考

rdiff-backup: Main

気まぐれサーバー - rdiff-backup - ローカル/リモートのミラーと差分バックアップ-rdiff-backup-気まぐれ Wiki

rdiff-backup をもう少し使いこなす - いますぐ実践! Linuxシステム管理 / Vol.155

rdiff-backup の使い方 | サイト運営の私的メモ

P.S.

今のところ順調にrdiff-backupは動いているが、海外のフォーラム等ではデータが壊れた旨の報告を相当数見つけた。

データが壊れたらまたエントリにするかもしれない。