変更されたファイルのバックアップ中にrsyncにソースディレクトリへのハードリンクを作成させるにはどうすればよいですか?

変更されたファイルのバックアップ中にrsyncにソースディレクトリへのハードリンクを作成させるにはどうすればよいですか?

バックアップサーバー上の同じファイルシステムに2つのバックアップディレクトリがあります。最初は「Clone」と呼ばれます。これには、毎晩rsyncを介してリモートで更新される私のラップトップのレプリカが含まれています。 2番目は「バックアップ」と呼ばれ、レプリカの重要な部分の毎週のrsyncスナップショットです。スペースを節約するには、--link-dest を使用してコピーへのハードリンクではなく、レプリカとして「バックアップ」を作成します。

rsync -avum --link-dest=/clone /clone/ /backup

ここで、--backupオプションを使用して、変更されたファイルの以前のバージョンをバックアップから保存領域にコピーしたいと思います。必要な場合や誤って重要な項目を削除した場合です。 --link-destなしでうまく動作します。

rsync -avumb --backup-dir=/holding/2016_10_22 /clone/ /backup

ただし、これによりバックアップに変更されたファイルのコピーが作成され、スペースが無駄になります。ハードリンクが必要です。しかし、--link-dest parmを再度追加した場合:

rsync -avumb --backup-dir=/holding/2016_10_22 --link-dest=/clone /clone/ /backup

...それでは削除済みファイルがバックアップされました。変更されたファイルは自動的にハードリンクされます。その理由は、 --link-dest が --copy-dest のロジックを共有するためです。すなわち、コピー先(またはリンク先)ファイルに基づいてソースファイルが変更されていない場合は、送信されずにコピー/リンク先ディレクトリから宛先ディレクトリにコピー/リンクされる。ソースディレクトリをリンク先ディレクトリとして使用するため、削除されていないファイルはすべて「変更されていない」状態に自動的に処理されます。

これは2つのステップで実行できます。まず --link-dest なしで --backup を実行し、 --backup なしで --link-dest を実行します。 (最新バージョンのrsyncは同じファイルをハードリンクに置き換えます)。

ハードリンクのみを生成しながら --backup を実行する方法はありますか? (私が本当に欲しいのは、ファイル転送の代わりにハードリンクを使用する「一般的な」rsyncです。

ボーナスの質問:マニュアルページには、空のターゲットにのみ--link-destを使用することをお勧めします。

既存のファイルのプロパティを調整することができ、これはハードリンクを介して代替ターゲットファイルに影響を与える可能性があるため、このオプションは空のターゲットレイヤにコピーするときに最適です。さらに、変更を項目別に分類することは多少混乱する可能性があります。

「めちゃくちゃ」をアイテム化する部分は少しあいまいです。ファイル属性にあまり気にしないと仮定すると、null以外のターゲットで--link-destを使用することは実際に「危険」ですか?誰でも例をあげることができますか?

答え1

上記のように、プロセスは2つのステップに進んだ。

src = the "live" clone directory, a mirror of my laptop = primary backup
dst = the weekly snapshot of important parts clone
trashdir = the items from src that don't exist in dst, because they have since been deleted, sorted into date-stamped directories

cmd = ("rsync -avumb --stats --delete --delete-excluded --filter='merge %s' --backup-dir=%s %s %s" %
       (filterfile, trashdir, src, dst))

cmd = ("rsync -avum --stats --delete --delete-excluded --filter='merge %s' --link-dest=%s %s %s" %
       (filterfile, src, src, dst))

最初のステップは、レプリカの重要な部分をバックアップし、最後のバックアップ以降に削除されたファイルをごみ箱に保存することです。 (何らかの理由で選択したファイルの中間バックアップのみを行い、週に一度だけ更新したいと思います。)

2 番目のステップでは、バックアップのファイルをレプリカへのハードリンクに変換します。その結果、バックアップは物理スペースをまったく占有しません。定義によると、ごみ箱にはクローンとバックアップから削除されたファイルのみが含まれているため、ハードリンクファイルではありません。

--delete-excludedフラグが必要かどうかはわかりません(特に2番目のコマンド)。バックアップを作成するときに無視するレプリカ部分を定義するフィルタファイルを変更する場合は、そのままにしておきます。

私は5年以内にゴミ箱がクローンサイズと同じくらい大きくなったので、合計サイズ=クローンx2であることを発見しました。これは、削除されたファイルの記録が6年間であり、日付ごとに簡単に整理することができたために許可することができました。

上記に加えて、cp -al日付が表示され、循環してハードリンクされた約1ヶ月前のスナップショットのレプリカを実行するスクリプトがあります。これには変更されたが削除されていないファイルが含まれます。月の全体のサイズは、クローンサイズの約半分程度であるようです。

したがって、合計ディスク容量はレプリカの約2.5倍です。

  • 自己複製、毎晩更新
  • 選択したファイルのバックアップ、1週間安定
  • バージョン指定クローンの1ヶ月スナップショット
  • 6年間の削除されたファイル

これは、元のディスクの紛失、ファイルの上書き、以前のバージョンの必要性、ファイルの削除後に後で必要性を防ぐための良い方法だと思います。

少し複雑でサードパーティ製のソフトウェアを使用することで達成できますが、私にとっては効果的でなくなったり、機能が大幅に変更される可能性がない低レベルのツールに基づいて構築されました。

(@ gsl - 実際に更新をリクエストしていただきありがとうございます。python3で更新したときにスクリプトの1つが破損して数ヶ月間実行されないことがわかりました。エラーログにもっと注意を払う必要があります!)

しかし、私はこれを単純化する方法にまだ興味があります。したがって、私がやっていることをより簡単な方法で行うことができる場合は、いつでもコメントしてください。

関連情報