
バックアップ サーバーの同じファイル システム上に 2 つのバックアップ ディレクトリがあります。1 つ目は「clone」と呼ばれ、rsync 経由で夜間にリモート更新されるラップトップのクローンが含まれています。2 つ目は「backup」と呼ばれ、クローンの重要な部分のみの週次 rsync スナップショットです。スペースを節約するために、「backup」は --link-dest を使用して、コピーではなくクローンへのハード リンクとして作成されます。
rsync -avum --link-dest=/clone /clone/ /backup
ここで、必要になった場合や誤って重要なものを削除した場合に備えて、--backup オプションを使用して、変更されたファイルの古いバージョンをバックアップから保持領域にコピーしたいと思います。これは、--link-dest がなくても正常に機能します。
rsync -avumb --backup-dir=/holding/2016_10_22 /clone/ /backup
ただし、これによりバックアップ内の変更されたファイルのコピーが作成され、スペースが無駄になります。ハードリンクが必要です。ただし、--link-dest パラメータを再度追加すると、次のようになります。
rsync -avumb --backup-dir=/holding/2016_10_22 --link-dest=/clone /clone/ /backup
...それから削除されましたファイルはバックアップされます。変更されたファイルは、暗黙的にハードリンクされます。その理由は (私が思うに)、--link-dest が --copy-dest のロジックを共有しているためです。つまり、ソース ファイルがコピー先 (またはリンク先) ファイルに対して変更されていない場合、そのファイルは転送されず、代わりにコピー先/リンク先ディレクトリからターゲット ディレクトリにコピー/リンクされます。ソース ディレクトリをリンク先ディレクトリとして使用しているため、削除されていないすべてのファイルは「変更されず」、暗黙的に処理されます。
これを 2 つのステップで実行できます。最初に --backup を --link-dest なしで実行し、次にもう一度 --link-dest を --backup なしで実行します。(rsync の新しいバージョンでは、同一のファイルがハード リンクに置き換えられます。) ただし、すべてを一度に実行したいのです。
ハード リンクのみを作成しながら --backup を実行する方法はありますか? (実際に必要なのは、ファイル転送ではなくハード リンクを使用した「通常の」rsync です。そのオプションの意図されたロジックを考えると、--link-dest の使用はちょっとしたハックのように思えます。)
ボーナスの質問: man ページでは、空のターゲットに対してのみ --link-dest を使用することが推奨されているようです。
このオプションは、既存のファイルの属性が調整され、ハードリンクを介して代替の宛先ファイルに影響を与える可能性があるため、空の宛先階層にコピーする場合に最適です。また、変更の項目化が少し混乱する可能性があります。
項目化が「混乱」するという部分は少し曖昧です。ファイル属性をあまり気にしないとして、空でないターゲットで --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))
最初のステップでは、クローンの重要な部分のバックアップを作成し、最後のバックアップ以降に削除されたファイルを trashdir に保存します。(選択したファイルのみのこの中間バックアップが必要で、毎週のみ更新する必要があるのには理由があります。)
2 番目のステップでは、バックアップ内のファイルをクローンを指すハード リンクに変換します。その結果、バックアップは実際のスペースをまったく占有しなくなります。trashdir は、クローンおよびバックアップから削除されたファイルのみで構成されているため、定義上、ハード リンク ファイルではありません。
--delete-excluded フラグが必要かどうかはよくわかりません (特に 2 番目のコマンド)。バックアップを作成するときにクローンのどの部分を無視するかを定義する filterfile を変更した場合に備えて、フラグを残しておきました。
5 年間で、trashdir はクローンとほぼ同じサイズにまで成長したことがわかりました。つまり、合計サイズ = クローン x2 となり、削除されたファイルの履歴が 6 年分あり、日付によって簡単に整理できることを考えると、これは私にとって許容できる範囲です。
上記に加えて、cp -al
クローンを約 1 か月分の日付スタンプ付きのローテーション ハードリンク スナップショットにコピーするスクリプトがあります。これにより、削除されたファイルではなく変更されたファイルがカバーされます。1 か月分の合計サイズは、クローンの約半分のサイズになるようです。
したがって、合計ディスク容量はクローンの約 2.5 倍になり、次のようになります。
- クローン自体は毎晩更新される
- 1週間安定した選択されたファイルのバックアップ
- 1か月分のバージョン付きクローンスナップショット
- 6年間分の削除されたファイル
これは、元のディスクの損失、ファイルの上書きによる古いバージョンの必要性、ファイルの削除による後からの必要性などに対する、かなり優れた保護であると感じています。
これは少し複雑で、サードパーティのソフトウェアでも実現できたかもしれませんが、私にとってはうまく機能し、消えたり機能が大幅に変更される可能性が低い低レベルのツール上に構築されています。
(@gsl - 実際のところ、アップデートをリクエストしていただきありがとうございます。Python3 にアップデートしたときにスクリプトの 1 つが壊れ、数か月間実行されていなかったことがわかりました。エラー ログにもっと注意を払う必要があります!)
ただし、これを効率化する方法にはまだ間違いなく興味があります。したがって、私が行っていることをもっと簡単な方法で実現できる場合は、遠慮なくコメントしてください。