RSnapshotを使用して変更が発生した場合にのみバックアップ

RSnapshotを使用して変更が発生した場合にのみバックアップ

rsnapshotのシステムのファイルシステムをリモートサーバーに頻繁にバックアップします。

rsync(おなじみの人が慣れていない人のための仕組みを簡単に説明します。バックアップは、結果rsnapshotと非常によく似たソースファイルシステムツリーのファイル固有のコピーです。「現在」バックアップは次のとおりです。常に、古いcp -a名前hourly.0はです。hourly.1は各バックアップの開始時に循環し、変更されていないファイルを古いバックアップツリーの対応するエントリにハードリンクするためにrsnapshot使用されます。rsync --link-desthourly.0hourly.1

バックアップが失敗すると、以前のバックアップはcp -al現在のバックアップにコピー(リンク)され、常にバックアップが行われているように見えます。

私が望むのは、最後のバックアップ以降に変更がなければバックアップを実行しないことです。これには、失敗したバックアップが含まれている場合や、最後のバックアップ以降にソースファイルシステムが変更されていない場合も含まれます。 (必要に応じて、「バックアップの作成」を「不要なバックアップの削除」に置き換えて表現することもできます。)

hourly.0他の場所にハードリンクされていないファイルをツリー内で参照し、存在しない場合はバックアップツリーのみを削除する方法も検討しました。これは、バックアップの他の場所に有効にリンクされたファイルを処理せず、ディレクトリへの変更は考慮されません。 2つのバックアップツリー比較を使用してその出力を確認することも検討しましたが、rsync --dry-run少し気分が悪いです。

より良い解決策はありますか?

答え1

スナップショットを撮った後、rsnapshot diffwhich呼び出しを使用してrsnapshot-diff2つのスナップショットの違いを記録できます。単に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。しかし、私の目的のためにこれは許可されています。

関連情報