犬でも分かるrsync(1): rsyncの基本

IT

Linuxにおいてユーザデータをバックアップするならrsyncを使うのがお勧めです。rsyncは、どんなLinuxディストリビューションにおいても提供されているバックアップツールであり、ディレクトリ配下をまるごとフルバックアップすることも、更新した分だけを効率よく差分バックアップすることもできます。同一ホスト内でのバックアップ(ローカルバックアップ)にも、別のホストへのバックアップ(リモートバックアップ)にも対応している便利なツールです。

rsyncの基本

ローカルバックアップ

まずはローカルバックアップの方法です。同一ホスト内で、ディレクトリ src 配下の全てのディレクトリ及びファイルを、ディレクトリ dest にフルバックをする方法は以下の通りです。

# rsync -av src dest

この指定方法では、バックアップは、ディレクトリdestの下にsrc配下の全てがバックアップされます(destが存在しなければ自動的に作成されます)。

次に、バックアップ元のディレクトリの末尾に「/」を付けてバックアップしてみましょう。

# rsync -av src/ dest

すると今度は、ディレクトリdestの下にsrc配下がバックアップされるのではなく、srcがdestという名前でバックアップされます。不思議な挙動ですが、こういう仕様なので覚えておきましょう。

リモートバックアップ

次は、リモートホストへのバックアップの方法です。rsyncという名前なのだから、リモートホストにバックアップするケースのほうが多いんじゃないでしょうか。
ウチにはbase0とbase1という2台のホストがあります。base0上のsrcディレクトリをbase1のbackupディレクトリにバックアップするには、base0上で以下のようにrsyncコマンドを実行します。

# rsync -av src base1:/backup

srcディレクトリの末尾に「/」を付けていないので、バックアップ先ディレクトリbackupの下にsrcディレクトリ配下の全てがバックアップされます。

さて、リモートホストへのバックアップでは、データ転送にsshが使用されています。したがって、鍵認証によってパスワードの入力を省く設定をしていなければ、rsyncコマンド実行直後に、認証のためのパスワード入力が求められます。

rsyncの基本的なオプション

rsyncのオプションとして覚えておいたほうが良いものを以下に示します。

オプション機能
-a または –archiveアーカイブモード。指定したディレクトリ配下を再帰的にバックアップする。パーミッション情報や更新時刻を保持する。また、過去のバックアップが存在する場合は差分バックアップを行う。
このオプションは包括的なオプションで、-rlptgoD というオプションが指定されたのと等しい。
-v または –verboseバックアップしたファイルの一覧や転送情報のサマリ(送信データ量,転送速度)を表示する。
-z または –compress圧縮して転送を行う。テキストファイルが多い場合やネットワークの帯域が小さい場合には有効。
–delete転送先の不要なファイルを削除して、完全に同期をとる。
–c または –checksumファイルのチェックサム(MD5など)を使って転送元と転送先を比較する。バックアップの品質は高くなるが転送速度は遅くなる。
-u または –updateバックアップ先に対象が存在し、バックアップ元の対象よりも更新時刻が新しい場合は、バックアップされない。両者の更新時刻が同じ場合は、サイズが異なる場合のみバックアップされる。バックアップ先でファイルを更新した場合に、新しいほうをバックアップ先に残す、というような場合に使用する。
–dry-run実際にはバックアップの転送は行わない。何がバックアップされるのかを事前に確認するのに使用する。
-v (–verbose)オプション

バックアップしたファイルの一覧や転送情報のサマリ(送信データ量,転送速度)を表示します。
-vオプションを付けると以下のようなメッセージを表示します。付けなければ全くメッセージは表示されません。

# rsync -av src base1:/backup
sending incremental file list
src/
src/file1
src/file2
src/subdir/
src/subdir/file3
src/subdir/file4

sent 25,285,401 bytes received 108 bytes 16,857,006.00 bytes/sec
total size is 25,278,904 speedup is 1.00

src配下の全てのファイルの合計 25,285,401 bytes を転送して、速度は 16,857,006.00 bytes/sec であることを示しています。

-z (–compress)オプション

圧縮して転送を行います。ネットワークの帯域が小さい場合や、テキストファイルが多い場合には有効です。

# rsync -avz src base1:/backup
sending incremental file list
src/
src/file1
src/file2
src/subdir/
src/subdir/file3
src/subdir/file4

sent 2,821,056 bytes received 108 bytes 5,642,328.00 bytes/sec
total size is 25,278,904 speedup is 8.96

同じsrcディレクトリ配下をバックアップしていますが、圧縮しているので転送量は 2,821,056 bytes なので元のデータ量の 1/8.96 となっています。speedupに表示されている数字は転送速度ではなく、転送量の圧縮率ということですね。

–dry-runオプション

実際のバックアップ転送は行わず、何がバックアップされるのかを事前に確認するのに使用します。

# rsync -av --dry-run src base1:/backup
sending incremental file list
src/
src/file1
src/file2
src/subdir/
src/subdir/file3
src/subdir/file4

sent 193 bytes received 36 bytes 152.67 bytes/sec
total size is 25,278,904 speedup is 110,388.23 (DRY RUN)

バックアップデータの転送を行っていないので、送信データは 193 bytesです。
speedup 110,388.23 という表示は意味がないですね。

rsyncの差分バックアップの仕様

アーカイブモード(-aオプション)では、指定したディレクトリ配下を再帰的にバックアップするのと同時に、更新されたデータのみを差分バックアップします。もちろん初回は、フルバックアップとして動作します。
差分バックアップされるのは、以下の属性を比較して、変更があったものが対象です。
・ファイルサイズ
・最終更新時刻(mtime)

差分バックアップのテストをしてみましょう。

ディレクトリsrc配下のファイルfile2の最終更新時刻を更新して、ファイルfile5を新規に作成します。file2のファイルの内容は変更していません。
この状態で、アーカイブモードでバックアップを行います。

# rsync -av src base1:/backup
sending incremental file list
src/file2
src/subdir/
src/subdir/file5

sent 6,331,605 bytes received 15,163 bytes 12,693,536.00 bytes/sec
total size is 31,598,630 speedup is 4.98

file2とfile5のファイルサイズは同じで、それぞれ 6,319,726 bytes です。2つ分のファイルが転送されているのであれば、12,639,452 bytesとなるところですが、6,331,605 bytes しか転送されていません。どうやら、新規に作成されたfile5と、差分チェックのための情報しか転送していないようです。

全くファイルを更新していない状態の転送データ

上記のバックアップが完了した直後に、もう一度差分バックアップを実行すると、バックアップは行われないですが、実際には 220 bytes の送信と 18 bytes の受信が行われていました。
これが差分チェックに必要となる情報なのでしょう。

# rsync -av src base1:/backup
sending incremental file list

sent 220 bytes received 18 bytes 158.67 bytes/sec
total size is 37,918,356 speedup is 159,320.82

ファイルのmtimeを更新しただけの場合の転送データ

src/file2のmtime(最終更新時刻)のみ更新して、差分バックアップを実行してみます。

# touch src/file2
# rsync -av src base1:/backup
sending incremental file list
src/file2

sent 10,327 bytes received 15,133 bytes 50,920.00 bytes/sec
total size is 37,918,356 speedup is 1,489.33

file2のファイルサイズは 6,319,726 bytes に対して送信データは 10,327 bytes なので、差分チェックに必要な情報とファイルのメタデータが送信されているのだと思います。

ファイルを1byteだけ更新した場合の転送データ

src/file2の内容を、同じサイズのまま1byteだけ内容を書き換えて、差分バックアップを実行してみます。

# rsync -av src base1:/backup
sending incremental file list
src/
src/file2

sent 12,376 bytes received 15,136 bytes 55,024.00 bytes/sec
total size is 37,918,356 speedup is 1,378.25

file2のファイルサイズは 6,319,726 bytes に対して送信データは 12,376 bytes なので、ファイル内容が全て送信されている訳ではないことが分かります。file2の差分データと、file2とディレクトリsrcのメタ情報が転送されていると思われます。

rsyncの差分バックアップの仕様とは..

これらの挙動から分かるrsyncの差分バックアップの仕様は、
・更新時刻をチェックして、更新時刻が変化しているものはバックアップ対象となる
・バックアップ対象となったファイルは、差分データとメタデータが転送される

ということのようです。更新時刻に変化のあったものは、ファイル内容の全てを転送しているのだと思っていたけど、差分のみの転送なんですね。すげえな、rsync。

完全な同期

今までの差分バックアップの仕様だと、バックアップ元でファイルやディレクトリを削除しても、バックアップ先には残ったままとなるので、(バックアップ元でファイルやディレクトリを削除した場合は)バックアップ元とバックアップ先のファイルとディレクトリの構成が同じにならなくなってしまいます。
バックアップの考え方は人それぞれだと思いますが、バックアップ元とバックアップ先の構成を同一に保ちたいのであれば、「–delete」オプションを追加することで、完全な同期をとるのが良いかと思います。

テストをしてみましょう。バックアップ元で src/subdir/file5 を削除してから、今までと同じように(–deleteオプションなしで)差分バックアップを実行してみましょう。

# rm -f src/subdir/file5
# rsync -av src base1:/backup
sending incremental file list
src/subdir/

sent 207 bytes received 21 bytes 456.00 bytes/sec
total size is 31,598,630 speedup is 138,590.48

ディレクトリsubdirのメタ情報は転送されているっぽいですね。
しかし、バックアップ先にはfile5は残ったままでした。

今度は、「–delete」オプション付きで差分バックアップを実行してみましょう。

# rsync -av --delete src base1:/backup
sending incremental file list
deleting src/subdir/file5

sent 212 bytes received 38 bytes 166.67 bytes/sec
total size is 31,598,630 speedup is 126,394.52

deleting src/subdir/file5 というメッセージでfile5が削除されたことが分かります。
バックアップ先からもfile5が削除されたことも確認できました。

興味本意ではありますが、ファイル名が変更された場合はどうなるでしょうか。
src/file2 を src/file21 にmvしてから、差分バックアップを実行してみます。

# mv src/file2 src/file21
# rsync -av --delete src base1:/backup
sending incremental file list
deleting src/file2
src/
src/file21

sent 6,321,517 bytes received 53 bytes 4,214,380.00 bytes/sec
total size is 31,598,630 speedup is 5.00

mvコマンドによる変名なので、ファイルの実体は全く同じなのですが、rsyncはファイルの有無で比較をするので、src/file21の内容はまるごとバックアップ先に転送されています。また、転送先のsrc/file2は「–delete」オプションによって削除されています。
すなわち、バックアップ運用においては、ユーザがファイル名を変名したり、格納しているディレクトリを変更したりすることは、効率がとても悪いということですね。

ファイルの更新をmtimeではなくチェックサムで判定する

「-c または –checksum」オプションを付けてrsyncを実行すると、バックアップ対象の判定をmtimeの比較ではなく、ファイルのチェックサムの値で比較してくれます。
さて、注意しておきたいのは、チェックサムの比較をするのはバックアップ前であって、バックアップ後ではないということです。
むむ、そう考えると「–checksum」オプションって、どういう用途で使うんだ??

もしかして、初回のフルバックアップ(–checksumは指定しない)をとったあとで、その直後に、–checksumを指定して差分バックアップをとる、そのように使うのか。。。
このようにすることで、フルバックアップ後の、バックアップ元とバックアップ先のファイル内容をチェックサムで比較できますね。

「–checksum」オプションを付けることによって、rsyncの処理速度はとても遅くなるようです。どのくらい遅くなるのかは、次の機会に測定してみようと思います。

広告主へのリンク




ミニPCのお勧め

おウチでLinuxを勉強するのに、ミニPCはどうですか。
仮想環境(KVM)使えば、仮想マシンを複数起動できますし、とても安価にシステム構築の練習ができます。ミニPCはとっても静かで消費電力も小さいので部屋で常時起動させています。

このブログにおける関連リンク

犬でも分かるrsync(2): バックアップの性能

コメント

タイトルとURLをコピーしました