私rsnapshot
のシステムのファイルシステムをリモートサーバーに頻繁にバックアップします。
rsync
(おなじみの人が慣れていない人のための仕組みを簡単に説明します。バックアップは、結果rsnapshot
と非常によく似たソースファイルシステムツリーのファイル固有のコピーです。「現在」バックアップは次のとおりです。常に、古いcp -a
名前hourly.0
はです。hourly.1
は各バックアップの開始時に循環し、変更されていないファイルを古いバックアップツリーの対応するエントリにハードリンクするためにrsnapshot
使用されます。rsync --link-dest
hourly.0
hourly.1
バックアップが失敗すると、以前のバックアップはcp -al
現在のバックアップにコピー(リンク)され、常にバックアップが行われているように見えます。
私が望むのは、最後のバックアップ以降に変更がなければバックアップを実行しないことです。これには、失敗したバックアップが含まれている場合や、最後のバックアップ以降にソースファイルシステムが変更されていない場合も含まれます。 (必要に応じて、「バックアップの作成」を「不要なバックアップの削除」に置き換えて表現することもできます。)
hourly.0
他の場所にハードリンクされていないファイルをツリー内で参照し、存在しない場合はバックアップツリーのみを削除する方法も検討しました。これは、バックアップの他の場所に有効にリンクされたファイルを処理せず、ディレクトリへの変更は考慮されません。 2つのバックアップツリー比較を使用してその出力を確認することも検討しましたが、rsync --dry-run
少し気分が悪いです。
より良い解決策はありますか?
答え1
スナップショットを撮った後、rsnapshot diff
which呼び出しを使用してrsnapshot-diff
2つのスナップショットの違いを記録できます。単にinode番号を比較するので、非常に効率的です。
または、バックアップツリーの外側にファイルを作成して各バックアップ前の時間を記録し、新しいバックアップの前にtouch timestamp
新しいタイムスタンプを作成touch timestamp.new
し、古いタイムスタンプより新しい時間を持つファイルまたはディレクトリがあるかどうかをテストします。
find tree -newer timestamp
そうでない場合は、バックアップを作成しないでください。とにかくmv timestamp.new timestamp
次回。これは、ファイルとディレクトリのタイムスタンプを操作するアプリケーションがないと仮定します。
答え2
私もこれが可能だと思います。優れているよりも一般的です。提案私は次から受け入れました。まあ。
listfiles()
{
(
# List attributes of file tree, discarding inode number
cd "$1" 2>/dev/null && find . -type f -ls | sed -r 's/^ *[1-9][0-9]*//' | sort
)
}
listfiles hourly.1 >/tmp/list1
listfiles hourly.0 >/tmp/list0
cmp -s /tmp/list1 /tmp/list0 && echo "the same" || echo "different"
また、.txtでリストされていないファイルに関連するACLおよび拡張属性も無視されますfind -ls
。しかし、私の目的のためにこれは許可されています。