rsync --deleteは削除されたすべてのファイルを削除しません。

rsync --deleteは削除されたすべてのファイルを削除しません。

私はrsyncを使用して、複数のシステムを外部ハードドライブまたはネットワーク経由で別のシステムにバックアップします。アイデアは、/dev、/proc、/mntなどの一部のコンテンツを含む、除外されていない元のファイルシステムのコピーを保持し、ターゲットからスナップショットを撮ることです(例:btrfsやzfsを使用)。これを行うには、次のコマンドを使用します。

rsync -avP --delete --exclude /dev/* --exclude /proc/* --exclude /mnt/* etc. etc. / backup@fileserver:/mnt/array/backup/machine/

効果はかなり良いです。しかし、rsyncがターゲットのコンテンツを確実に削除しないことがわかりました。その結果、いつでもソースに存在するよりもターゲットに多くのファイルがあり、場合によってはバックアップはソースより100 GB大きかった。残りのファイルは、ほとんどの場合、さまざまなソフトウェアとライブラリの以前のバージョンのようです。たとえば、元のシステムでは、/usr/include/qt/QtWidgets/には次のものが含まれます。

5.9.2
QAbstractButton
qabstractbutton.h
....

ただし、バックアップ先の同じフォルダには次のものが含まれます。

5.6.0
5.6.1
5.7.0
5.7.1
5.8.0
5.9.0
5.9.1
5.9.2
QAbstractButton
qabstractbutton.h

rsyncは新しいファイルをうまくコピーしているようですが、古いファイルをすべて削除するのを忘れました。奇妙なことに、一部のファイルは削除されますが(rsyncは常に同期中に削除された多くのファイルが報告されます)、多くのファイルは削除されないようです。その結果、私のバックアップは必要以上のスペースを占有し、すべての追加ファイルが元のパーティションよりも多くのスペースを占有するため、直接復元することはできず、フラットファイルパッケージデータベースなどのものがあります。問題があり、以前のバージョンのパッケージの重複エントリがたくさん含まれています。

ここで何が起こっているのかというアイデアはありますか? rsyncが実際に削除する必要があるすべてのエントリを削除するには、他のフラグをrsyncに渡す必要がありますか?

答え1

試してみるためのいくつかの提案は、マニュアルページ(情報セクション--delete)にあります。多くの警告と注意事項があります。これらすべてを考えてみましたか?

  • 「同期されるディレクトリ」にのみ適用されます。私はこれが彼らが親/祖先ディレクトリをコピーする必要があることを意味すると思います。

  • 同様に、明示的に除外された項目には適用されません。

--delete-excluded 転送から除外されたファイルも、このオプションを使用するか、転送側でのみ一致するようにルールを表示しない限り削除されません。

  • 送信者がI / Oエラーを検出すると、ターゲット上のすべてのファイルの削除は自動的に禁止されます。で覆います--ignore-errors

  • まず試してみてください--dry-run--verbose問題ディレクトリで発生したすべてを組み合わせて再確認してください。

    このオプションは誤って使用すると危険です。 --dry-runオプション(-n)を使用して最初に実行しようとして削除するファイルを確認するのはとても良い考えです。

したがって、試みを検討してください--delete-excluded--ignore-errorsおよび/または--dry-run...--verbose必ずしも「修正」ではなく、少なくとも潜在的に有用なデータを収集してみてください。

そして--delete-before旗も見てください。実際の送信前に受信者の削除を実行する必要があります。繰り返しますが、これはすべての問題を解決するわけではないかもしれませんが、ある程度明らかにすることができます。ディスク領域の使用量を減らすのにも役立つかどうかを調べることも興味深いでしょう。

関連情報