« || »

 rsyncでの–link-destオプション使用時の挙動概要

2020. 2. 24 (月)

rsyncで--link-destオプションを使って差分履歴バックアップを取るときの挙動概要
バックアップ元(sourceディレクトリ内)にfile1~3のファイルがあるものとします。

1回目のバックアップを取ってみます。
(各パスは実際には正確に指定するものとします)

rsync -va --link-dest=../dest ./source/ ./backup1
初回バックアップ
backup1

file1
file2
file3

すべてのファイルがバックアップされます。
--link-destオプションにdestディレクトリを指定していますが、存在しないディレクトリなので無視されます。

バックアップ元のファイルを一切更新せず、1回目のバックアップをlink-destの対象として2回目のバックアップを取ってみます。

rsync -va --link-dest=../backup1 ./source/ ./backup2
バックアップ2回目
backup1

file1
file2
file3

backup2

バックアップ元のファイルは更新されていないので(backup1の中の各ファイルと同一)、全てのファイルに対してハードリンクのみが作成されます。
ハードリンクはファイルパス(ディレクトリエントリ)は複数存在しますがファイルの実体とiノードは同一のものを指している状態になります。
例えとして適切かは分かりませんが、電車のドア(ディレクトリエントリ)が複数あっても車内(iノード、実体)は同一と考えると分かりやすいかもしれません。
この状態で例えば backup1/file1 を書き換えると、backup2/file1 も同じiノードを指しているため backup2/file1 の内容も同じように変わりますが、backup1/file1 を削除しても backup1/file1 のディレクトリエントリが削除されるのみで、backup2/file1 は残ります。

バックアップ元のfile1を更新してから、2回目のバックアップをlink-destの対象として3回目のバックアップを取ってみます。

echo test >> ./source/file1
rsync -va --link-dest=../backup2 ./source/ ./backup3
バックアップ3回目
backup1

file1
file2
file3

backup2
backup3

file1(new)

バックアップ元のfile1が更新されているのでfile1のみ新たな実体ファイルとしてコピーされ、残りのファイルは引き続きハードリンクのみが作成されます。
「file1(new)」と書いていますが内容が更新されているという意味で、ファイル名に「(new)」が付加されているということではありません。

バックアップ元からfile2を削除、新たにfile4を作成したあとで、3回目のバックアップをlink-destの対象として4回目のバックアップを取ってみます。

rm ./source/file2
touch ./source/file4
rsync -va --link-dest=../backup3 ./source/ ./backup4
バックアップ4回目
backup1

file1
file2
file3

backup2
backup3

file1(new)

backup4

file4

file2は作成されず、3回目のバックアップには無かったfile4がバックアップ元からコピーされ、残りのファイルはハードリンクのみが作成されます。

ここで、1回目のバックアップを削除してみます。

1回目のバックアップ削除
rm -r ./backup1
backup2

file1
file2
file3

backup3

file1(new)

backup4

file4

backup1にあったfile1~3のハードリンクは削除されましたが、他のbackupディレクトリのファイルはこれまで通り残っています。

3回目のバックアップを削除してみます。

rm -r ./backup3
3回目のバックアップ削除
backup2

file1
file2
file3

backup4

file1(new)
file4

backup3のfile1(new)、file2、file3のハードリンクが削除されました。
他のbackupディレクトリのファイルはこれまで通り残っています。

2回目のバックアップを削除してみます。

rm -r ./backup2
2回目のバックアップ削除
backup4

file1(new)
file3
file4

backup2内のfile1、file2の実体と、file3のハードリンクが削除されました。
backup4ディレクトリのファイルはこれまで通り残っています。

バックアップ元のfile3を更新して、4回目のバックアップをlink-destの対象として5回目のバックアップを取ってみます。

echo test >> ./source/file3
rsync -va --link-dest=../backup4 ./source/ ./backup5
バックアップ5回目
backup4

file1(new)
file3
file4

backup5

file3(new)

file1(new)とfile4はハードリンクが作成され、file3(new)が新たにコピーされました。

これらの動作から、一番古いバックアップを削除し、最新のバックアップをlink-destの対象としてrsyncでバックアップすることで、上手い具合にローテーションさせつつ差分履歴バックアップが取れることがわかります。
ハードリンクの特徴をうまく利用した機能だと思います。

« || »

Comments are closed.