増分バックアップ用のLinuxバックアップユーティリティ

増分バックアップ用のLinuxバックアップユーティリティ

私は増分バックアップ機能を持っていますが、より洗練された方法でバックアップユーティリティを探しています。

rsyncを試しましたが、私が望むことを実行できないようです。

以下は、私が達成したいものの例です。次のファイルがあります。

testdir
├── picture1
├── randomfile1
├── randomfile2
└── textfile1

バックアップユーティリティを実行し、デフォルトで他のディレクトリにこれらのすべてのファイルのアーカイブ(またはtarball)を作成したいと思います。

$ mystery-command testdir/ testbak
testbak
└── 2020-02-16--05-10-45--testdir.tar

次に、次の日に構造が次のようにファイルを追加するとします。

testdir
├── picture1
├── randomfile1
├── randomfile2
├── randomfile3
└── textfile1

ミステリーコマンドを実行すると、今日の別のタールボールが表示されます。

$ mystery-command testdir/ testbak
testbak
├── 2020-02-16--05-10-45--testdir.tar
└── 2020-02-17--03-24-16--testdir.tar

picture1鍵は次のとおりです。バックアップユーティリティがrandomfile1最後のバックアップ以降に変更されていないことを検出し、randomfile2新しいファイル/変更されたファイルのみをバックアップしたいと思います。この場合、次のようになります。textfile1randomfile3

tester@raspberrypi:~ $ tar -tf testbak/2020-02-16--05-10-45--testdir.tar 
testdir/
testdir/randomfile1
testdir/textfile1
testdir/randomfile2
testdir/picture1
tester@raspberrypi:~ $ tar -tf testbak/2020-02-17--03-24-16--testdir.tar 
testdir/randomfile3

最後の例として、翌日私が変更し、textfile1次を追加したとしますpicture2picture3

$ mystery-command testdir/ testbak
testbak/
├── 2020-02-16--05-10-45--testdir.tar
├── 2020-02-17--03-24-16--testdir.tar
└── 2020-02-18--01-54-41--testdir.tar
tester@raspberrypi:~ $ tar -tf testbak/2020-02-16--05-10-45--testdir.tar 
testdir/
testdir/randomfile1
testdir/textfile1
testdir/randomfile2
testdir/picture1
tester@raspberrypi:~ $ tar -tf testbak/2020-02-17--03-24-16--testdir.tar 
testdir/randomfile3
tester@raspberrypi:~ $ tar -tf testbak/2020-02-18--01-54-41--testdir.tar 
testdir/textfile1
testdir/picture2
testdir/picture3

このシステムを使用すると、各バックアップ間の増分変更(明らかにすべての初期ファイルを含むマスターバックアップ)のみをバックアップしてスペースを節約できます。たとえば、2日以内に変更した場合は増分変更もバックアップします。 3日目に同じ内容を再度変更すると、2日目の変更を含むファイルを引き続き取得できますが、3日目が変更される前には可能です。

私はこれがGitHubの仕組みと少し似ていると思います:)

diffを実行してから、結果に基づいてバックアップするファイルを選択するスクリプトを作成できることを知っています(またはより効率的にチェックサムをインポートして比較することです)。しかし、これを簡単に実行できるユーティリティがあるかどうか疑問に思います。少し:)

ベストアンサー1

rsyncを試しましたが、私が望むことを実行できないようです。

diffを実行してから、結果に基づいてバックアップするファイルを選択するスクリプトを作成できることを知っています(またはより効率的にチェックサムをインポートして比較することです)。しかし、これを簡単に実行できるユーティリティがあるかどうか疑問に思います。少し:)

rsync違いに基づいて複製するプログラムです。デフォルトでは、最終修正時間またはサイズに違いがある場合にのみコピーされますが-c

ここで問題はtarバックアップしていることです。それ以外の場合、これは簡単になります。私はあなたがなぜそのようなことをしたのかわかりません。圧縮すると意味があるかもしれませんが、そうしません。

これ増分バックアップに関するウィキペディア記事rsync次のコマンド例があります。

rsync -va \
  --link-dest="$dst/2020-02-16--05-10-45--testdir/" \
  "$src/testdir/" \
  "$dst/2020-02-17--03-24-16--testdir/"

ファイルがソースから変更されていない場合は、以前のバックアップのファイルをハードリンクします。--copy-destコピーする場合($dstリモートまたは高速ドライブにいる場合はまだ高速です)。

btrfsなどのサブボリュームを持つファイルシステムを使用している場合は、rsyncの前に以前のバックアップからスナップショットを作成することもできます。スナップショットは即時であり、余分なスペースを占有しません[1]。

btrfs subvolume snapshot \
  "$dst/2020-02-16--05-10-45--testdir" \
  "$dst/2020-02-17--03-24-16--testdir"

または、参照リンクをサポートするファイルシステムを使用している場合でも、これを行うことができます。参照リンクは新しいinodeを生成しますが、ソースファイルと同じブロックを参照してCOWサポートを有効にすることによって実行されます。データの読み書きは行われず、余分なスペースも必要ないため、通常のコピーよりも高速です[1]。

cp --reflink -av \
  "$dst/2020-02-16--05-10-45--testdir" \
  "$dst/2020-02-17--03-24-16--testdir"

とにかく、そのようなことをした後は、通常のrsyncコピーdiffを実行できます。

rsync -va \
  "$src/testdir/" \
  "$dst/2020-02-17--03-24-16--testdir/"

--deleteただし、これにより、rsyncがソースに存在しなくなったファイルをターゲットから削除することを追加できます。

別の有用なオプションはまたは-iです--itemize-changes。 rsyncが実行する変更を説明する簡潔で機械可読出力を生成します。私は通常そのオプションを追加し、次のようにパイプします。

rsync -Pai --delete \
  "$src/testdir/" \
  "$dst/2020-02-17--03-24-16--testdir/" \
|& tee -a "$dst/2020-02-17--03-24-16--testdir.log"

簡単なファイルで変更を記録しますgrep|&stdoutとstderrをパイプすることです。

はandの略です-P。部分的に転送されたファイルを保持しますが、より重要なことは、各ファイルの進行状況を報告することです。--partial--progress--partial--progress

tarを使用して変更をアーカイブするのとどのように比較されますか?

上記の回避策を使用すると、ディレクトリにすべての内容が含まれているように見えます。この場合でも、バックアップの回数/頻度に関係なく、変更のみを実行する通常のtarアーカイブとほぼ同じスペースを占めます。これは、ハードリンク、リファラーリンク、およびスナップショットの動作方法によるものです。バックアップを作成するときの帯域幅使用量は同じです。

利点は次のとおりです。

  • rsyncはバックアップの違いのみを転送するため、rsyncを使用するとバックアップを復元するのが簡単で迅速です。
  • 必要に応じて検索して編集する方が簡単です。
  • ファイルの削除は、新しいバックアップにファイルがないと自然にエンコードできます。 tarアーカイブで作業するときは、ファイルの削除foo、タグ付け、foo.DELETEDまたは複雑な操作の実行などのハッキング方法に頼る必要があります。たとえば、二重性を使用したことはありませんが、その文書を見ると、新しいtarに同じ名前の空のファイルを追加し、そのファイルの元の署名を別の.sigtarファイルに保存して削除をエンコードするようです。ファイルの削除と実際の空のファイルの変更を区別するために、元の署名を空のファイルの署名と比較するようです。

それでも異なる(追加または変更された)ファイルのみを保存するように各バックアップを設定したい場合は、--link-dest上記の回避策を使用してから次の方法を使用してハードリンクを削除できます。

find $new_backup -type f ! -links 1 -delete

[1]厳密に言えば、ファイル名などの重複メタデータの形で追加のスペースを使用します。しかし、誰でもこれを些細なものと考えると思います。

おすすめ記事