古いファイルがすでに存在する場合は、--link-destオプションを使用して同じファイルをリンクするようにrsyncにどのように通知できますか?

古いファイルがすでに存在する場合は、--link-destオプションを使用して同じファイルをリンクするようにrsyncにどのように通知できますか?

--link-dest「同じファイルへのアクセス」がすべての場合に適用されると考えることもできます。ただし、ファイルが存在する場合、ファイルが期限切れになったり内容が異なる場合でも発生しません。

そのため、rsyncのマニュアルページで次の操作を行います--link-dest

このオプションは、空のターゲットレイヤーにコピーするのに最適です。なぜなら、rsyncは既存のファイルを明確なファイルとして扱うからです。rsync は、ターゲットファイルがすでに存在する場合、リンク先ディレクトリを探しません。)」

つまり、y/fileソースと同じものがありz/file、古い場合、

rsync -a --del -link-dest=y source:/file z

y/fileこれにより、2つのinodeが使用され(ディスクスペースも倍増)、z/file同じ内容と日付スタンプがあります。

デフォルトでは、バックアップを実行するためにこのスクリプトを1日1回実行したため、この問題が発生しました。

mv $somedaysago $today; 
yest=$today; today=`date +%Y%m%d`;
rsync -avPShyH --del --link-dest=../$yest host:/dirs $today

バックアップは最大10Mファイルにわたっているため、時間がかかりすぎますrm -rf $olddir; rsync source:$dir newdir(特に毎日ファイルの0.5%しか変更されない場合は、50,000個の新しいファイルまたは変更されたファイルを処理するだけでも1,000万個の削除および作成ディレクトリエントリが発生するため、バックアップこれは不可能になります)。翌日の時間に合わせて完了します。)

以下は状況を示しています:

aソースは番号1付き4バックアップです。

$ mkdir -p 1 2; echo foo > 1/foobar; cp -lrv 1/* 2
`1/foobar' -> `2/foobar'
$ ls -i1 */foobar
1053003 1/foobar
1053003 2/foobar

$ mkdir a; echo quux > a/foobar
$ mv 1 3; rsync -avPhyH --del --link-dest=../2 a/ 3
sending incremental file list
./
foobar
           5 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 105 bytes  received 34 bytes  278.00 bytes/sec
total size is 5  speedup is 0.04

$ ls -i1 */foobar
1053003 2/foobar
1053007 3/foobar
1053006 a/foobar

$ mv 2 4; rsync -avPhyH --del --link-dest=../3 a/ 4
sending incremental file list
./
foobar
           5 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 105 bytes  received 34 bytes  278.00 bytes/sec
total size is 5  speedup is 0.04


$ ls -il1 */foobar
1053007 -rw-r--r-- 1 math math 5 Mar 30 00:57 3/foobar
1053008 -rw-r--r-- 1 math math 5 Mar 30 00:57 4/foobar
1053006 -rw-r--r-- 1 math math 5 Mar 30 00:57 a/foobar

$ md5sum [34a]/foobar
d3b07a382ec010c01889250fce66fb13  3/foobar
d3b07a382ec010c01889250fce66fb13  4/foobar
d3b07a382ec010c01889250fce66fb13  a/foobar

a/foobarこれで、タイムスタンプを含むすべての点で同じですが、異なるinodeを占める2つのバックアップがあります。

1つの解決策は--delete-before増分チェックの利点を取り除くことであると思うかもしれませんが、ファイルは削除されず、可能な増分コピーの基礎として使用されるため役に立ちません。

私たちはこの増分コピーヘッジをオフにすることができると推測するかもしれませんが、--whole-fileこれはどのような方法でもアルゴリズムには役立ちませんし、私たちが望むものを得る方法ではありません。

私はこの動作をrsyncの別のバグだと思います。これはさまざまなコマンドパラメータを慎重に選択して説明できますが、そうでない場合は目的の結果が得られます。

残念ながら、解決策は単一のrsyncをアトミックジョブとして使用してドライランを使用し-n、記録し、そのログを入力として処理して変更されたすべてのファイルを手動で事前に削除し、次に必要なものをrsync --link-dest得るために実行することです。単一のクリーンなrsyncと比較して大きな混乱です。

付録:本番ボックスをバックアップする前にバックアップサーバーから事前接続しようとしましたが、$yesterday結果は同じです -$todayrsync --link-dest=../$yesterday $yesterday/ $today何らかの方法で存在するすべてのファイルは、長さがゼロであっても削除されず、ターゲットにリンクされません。代わりに、新しいinodeを使用してsourcedirからまったく新しいコピーが作成され、より多くのディスク領域が使用されます。

pax(1)可能な事前バックアップ辞書リンクソリューションを探しています。

答え1

(質問編集から変換)

この問題は、rsyncをアップグレードすることで解決される可能性があります。バージョン3.1.1以降では、--link-destターゲットとディレクトリの同じファイルをハードリンクされたファイルに置き換えます。多くのスペースを節約します。

関連情報