編集時に新しいファイルにリンクするハードリンクを含む `cp -al` スナップショット

編集時に新しいファイルにリンクするハードリンクを含む `cp -al` スナップショット

大容量フォルダのスナップショットを定期的に撮影しようとしています。

私はここで読んだ:http://www.mikerubel.org/computers/rsync_snapshots/#Incremental
cp -alフォルダのスナップショットを撮るには、ハードリンクをコピーしてください。

これはすべて素晴らしいですが、問題は、このスナップショットで1つのファイルを変更すると、すべてのスナップショットで変更されることです。私が望むのは、システムが変更されたときに新しいファイルを作成してそのファイルに接続することです。これにより、最初のファイルを編集するときに各スナップショットが無効になりません。

どうすればいいですか?

ps試してみましたが、rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/同じ問題が発生しました。

答え1

これがハードリンクがどのように機能するかです。ただし、この問題を解決するにはいくつかの方法があります。

いくつかのオプションが思い浮かんだ。

  • たとえば、書き込み中にコピーファイルをサポートするファイルシステムを使用しますbtrfs。もちろん、btrfsを使用している場合はデフォルトのスナップショットしか使用できません...ファイルシステムがそれをサポートしている場合、cp --reflink=alwaysext4はサポートされません。これはちょっと。
  • ハードリンクは、元のスナップショットではなくスナップショット間でのみ共有されます。つまり、特定のバージョンのファイルが最初に表示されると、そのバージョンはスナップショットにコピーされます。ただし、次回は前のスナップショットのリンクにリンクしてください。 (10年前にどのプログラムを使用したのかわかりませんが、検索結果はdirvish、obnam、storebackup、rsnapshotでした)
  • ファイルの変更方法に応じて、一時書き込み/名前変更を使用してファイルの変更を保証できます。これにより、ハードリンクが削除され、スナップショットのバージョンが元のままになります。ただし、エラーによってスナップショットが破損する可能性があるため、これは非常に安全ではありません。
  • ファイルシステム全体のLVMスナップショットを撮ります。

もちろん別のオプションがあります。適切なバックアップシステムを使用することです。ほとんどの人は変更されたファイルのみをバックアップできます。

答え2

あなたが探しているのはフォームです書き込み中のコピー、同じ内容を持つ複数のファイルは、ファイルの1つが変更されるまでディスク上の同じスペースを使用します。ハードリンクは、書き込みを実行しているアプリケーションがファイルを削除し、同じ名前の新しいファイルを生成する場合にのみ書き込み中にコピーを実装します(通常は別の名前の新しいファイルを作成してからその場所に移動します)。使用しているアプリケーションは明らかにこれを行いません。既存のファイルを上書きします。

一部のアプリケーションは、交換ポリシーを使用するように構成できます。一部のアプリケーションはデフォルトで交換ポリシーを使用しますが、ハードリンクが壊れないように、複数のハードリンクを持つファイルを表示するときに上書きポリシーを使用します。上書きせずに交換するようにアプリケーションを構成できる場合は、現在のスナップショット技術が機能します。

フロント複数のハードリンクを持つファイルに対して代替戦略を体系的に使用するようにプログラムを変更します。

あるいは、ハードリンクについて心配することなく、記録中にコピーまたは重複排除を実行したり、スナップショット機能を備えたファイルシステムにファイルを保存したりすることもできます。BTRFSまたはジブス。パーティションスキームによっては、LVMスナップショットを使用することがオプションかもしれません。

私のアドバイスは、適切なスナップショットツールを使用することです。安定したバックアップを作成するのは難しいです。欲しいかもしれませんスナップ写真

答え3

以下は、「cp -al」とrsyncを手動で実行したり、cronを介して実行できるクールなスクリプトにラップした私が書いたRubyスクリプトです。ターゲットはローカルでもリモートでもかまいません(Ssh経由)。

ゲットータイムマシン

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

源泉:

  • /家/プラクラット

目的地:

  • /データ/バックアップ/毎日
    • /月曜日に
    • /火曜日
    • /水曜日
    • /木曜日
    • ...

ハードリンクは、昨日のバックアップで「cp -al」を実行して作成されます。ランタイムが火曜日の朝だとします。

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

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

答え4

rdiff-backupが好きなように動作するようです。確認してみてください。

rsyncを使用するには、ハードリンクを使用するのではなく、最初にフルバックアップを作成する必要があります。次のバックアップは、前のバックアップを指してハードリンクすることができます。これにより、バックアップは作業ファイル(変更中のファイル)にハードリンクされません。はい。以前のバックアップがbackup.01フォルダの場合、バックアップスクリプトは最初にフォルダ名を1に変更し、backup.01がbackup.02になるようにフォルダを増やします。その後、スクリプトは新しいbackup.01という空のフォルダを作成します。次に、新しいバックアップを新しいフォルダに同期し、backup.02へのハードリンクを作成して、新しいファイルだけがバックアップ領域を占有します。 rsync コマンドは次のとおりです。 rsync -rlt sourcepath backuppath/backup.01 --link-dest=backuppath/backup.02

これにより、すべてのハードリンクがバックアップパスで発生していることがわかります。これにより、ソースパスのファイルを変更するときに書き込み中のコピーを心配する必要がなくなります。

関連情報