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


11

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

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

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

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

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

回答:


7

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

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

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

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


大規模なフォルダーをバックアップする方法として何をお勧めしますか?
Hermann Ingjaldsson 2013年

私はスナップショットのために定期的にcp -alを実行するcronjobがあるサーバーに対してrsyncを使用することを考えていました。どうですか?
Hermann Ingjaldsson 2013年

@HermannIngjaldssonよく、それはあなたがあなたのバックアップをどのように行うかに依存します。個人的には、それを自分のBaculaセットアップに追加するだけですが、バックアップするマシンがたくさんあるか、Baculaをすでに知っているのでない限り、お勧めしません。だから、最初にrsnapshotを試してみることをお勧めします。
derobert 2013年

rsnapshot良い
developerbmw

4

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

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

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

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

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


2

以下は、「cp -al」とrsyncを手動またはcron経由で実行できる素敵なスクリプトにラップする、私が作成したRubyスクリプトです。宛先はローカルまたはリモート(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/


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.