web-dev-qa-db-ja.com

編集時にハードリンクが新しいファイルに送られる `cp -al`スナップショット

大規模なフォルダのスナップショットを定期的に取得しようとしています。

私はここを読みました: http://www.mikerubel.org/computers/rsync_snapshots/#Incremental
それ cp -alは、ハードリンクをコピーするだけでフォルダのスナップショットを取得します。

それはすばらしいことですが、問題は、このスナップショットでファイルを変更すると、すべてのスナップショットで変更されることです。代わりに私が欲しいのは、システムが変更時に新しいファイルを作成し、代わりにそれにリンクすることです。そうすれば、最初のファイルの編集時に各スナップショットが無効になることはありません。

どうすればそれを達成できますか?

pS私は試した rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/ですが、同じ問題があります。

11

これがハードリンクのしくみです。しかし、それを回避する方法はいくつかあります。

いくつかのオプションが思い浮かびます:

  • btrfsなどのコピーオンライトファイルをサポートするファイルシステムを使用します。もちろん、btrfsを使用していた場合は、そのネイティブスナップショットを使用します...ファイルシステムがそれをサポートしている場合は、cp --reflink=alwaysを使用できます。残念ながら、ext4はこれをサポートしていません。
  • オリジナルではなく、スナップショット間でのみハードリンクを共有します。つまり、特定のバージョンのファイルを初めて表示したときに、そのファイルをスナップショットにコピーします。ただし、次回は、以前のスナップショットのスナップショットにリンクします。 (10年前、私がこれを行うために使用したプログラムはわかりませんが、検索を行うと、dirvish、obnam、storebackup、およびrsnapshotが表示されます)
  • ファイルの変更方法によっては、書き込みの一時変更/名前変更を使用してファイルを変更することを保証できる場合があります。これにより、ハードリンクが破損するため、スナップショットのバージョンは元の状態のままになります。ただし、バグによってスナップショットが破損する可能性があるため、安全性は低くなります。
  • ファイルシステム全体のLVMスナップショットを作成します。

もちろん、他のオプションがあります。適切なバックアップシステムを使用します。それらのほとんどすべては、変更されたファイルのバックアップのみを管理できます。

7
derobert

あなたが探しているのは copy-on-write の形式です。同じコンテンツを持つ複数のファイルは、そのうちの1つが変更されるまでディスク上の同じスペースを使用します。ハードリンクは、書き込みを行うアプリケーションがファイルを削除し、同じ名前で新しいファイルを作成する場合にのみコピーオンライトを実装します(通常、別の名前で新しいファイルを作成してから、ファイルを所定の場所に移動することによって行われます)。使用しているアプリケーションは明らかにこれを行っていません。既存のファイルを上書きしています。

一部のアプリケーションは、置換戦略を使用するように構成できます。一部のアプリケーションはデフォルトで置換戦略を使用しますが、ハードリンクを壊さないように、複数のハードリンクを持つファイルを表示する場合は上書き戦略を使用します。現在のスナップショット手法は、アプリケーションを上書きする代わりに置き換えるように構成できる場合に機能します。

Fl-cow は、プログラムを変更して、複数のハードリンクを持つファイルに対して置換戦略を体系的に使用します。

または、コピーオンライトまたは重複排除を実行するファイルシステムにファイルを保存するか、スナップショット機能を備えていて、ハードリンクについて心配する必要はありません。 Btrfs または Zfs 。パーティション設定スキームによっては、LVMスナップショットの使用がオプションになる場合があります。

適切なスナップショットツールを使用することをお勧めします。信頼性の高いバックアップを作成することは驚くほど困難です。おそらく rsnapshot が必要です。

以下はRubyスクリプトですが、 "cp -al"とrsyncを手動またはcron経由で実行できるNiceスクリプトにラップします。宛先はローカルまたはリモート(ssh経由)です。 ):

ゲットータイムマシン

前のコメントで述べたように、質問に対する基本的な答えは、ソースをハードリンクから離しておく必要があります。たとえば、ホームディレクトリの毎日のバックアップを想定します。

ソース:

  • / home/flakrat

先:

  • /data/backup/daily
    • /月曜
    • /火曜日
    • /水曜日
    • /木曜日
    • ...

ハードリンクは、昨日のバックアップに対して「cp -al」を実行することによって作成されます。火曜日の朝に実行するとします。

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

rsync -a --delete /home/flakrat /data/backup/daily/tuesday/

2
FlakRat

rdiff-backupはあなたが望むことをするようです、それをチェックしてください。

Rsyncを使用する場合は、最初にハードリンクを使用せずに完全バックアップを作成する必要があります。次のバックアップは、以前のバックアップをポイントし、それにハードリンクすることができます。これにより、バックアップが作業ファイル(変更中のファイル)にハードリンクされなくなります。例。以前のバックアップがフォルダbackup.01であった場合、バックアップスクリプトはまずフォルダの名前を1つ増やし、backup.01がbackup.02になるようにします。次に、スクリプトはbackup.01という名前の新しい空のフォルダーを作成します。次に、新しいバックアップを新しいフォルダにrscyncし、backup.02へのハードリンクを設定します。これにより、新しいファイルのみがバックアップ内の領域を占有します。 rsyncコマンドは次のようになります。rsync -rlt sourcepath backuppath/backup.01 --link-dest = backuppath/backup.02

ご覧のとおり、すべてのハードリンクはバックアップパスで発生しています。これにより、ソースパスのファイルを変更するときに、コピーオンライトを心配する必要がなくなります。

0
Marty