バックアップ前にLinuxで移動または名前変更されたファイルを検出するツールまたはスクリプト[終了]


15

基本的に、移動または名前変更されたファイルを検出できるツールまたはスクリプトが存在するかどうかを検索して、名前変更または移動されたファイルのリストを取得し、帯域幅を節約するためにネットワークの反対側で同じ操作を適用できます。

基本的にディスクストレージは安価ですが、帯域幅はそうではなく、問題はファイルが頻繁に再編成されるか、より良いディレクトリ構造に移動されるため、rsyncを使用してバックアップを行うと、rsyncが名前の変更や反対側に同じファイルがあるにもかかわらず、ファイルを移動し、ネットワークを介して再送信します。

したがって、すべてのファイルの場所とその名前を記録できるスクリプトまたはツールが存在するかどうか疑問に思っています。バックアップの直前に、移動または名前変更されたファイルを再スキャンして検出し、そのリストを取得して再適用できます反対側の移動/名前変更操作。

ファイルの「一般的な」機能のリストは次のとおりです。

  1. 大きな不変ファイル
  2. 名前を変更したり、移動したりできます

[編集:]これらはすべて良い答えであり、結局私がやることはすべての答えを見ることであり、これに対処するためのコードを書くつもりです。基本的に私が今考えている/取り組んでいるのは:

  1. 「最初の」スキャンにAIDEのようなものを使用し、ファイルが変更されることはないため、ファイルのチェックサムを保持できるようにすることで、破損の検出に役立ちます。
  2. これらのファイル/ディレクトリを監視するinotifyデーモンを作成し、名前の変更とファイルのログファイルへの移動に関する変更を記録します。
  3. inotifyがファイルシステムに何かが発生したことを記録できないエッジケースがいくつかあるため、最後のバックアップよりも後の変更時刻を持つファイルをファイルシステムで検索するためにfindを使用する最後のステップがあります。

これにはいくつかの利点があります。

  1. 一部のメディアが破損していないことを確認/確認できるようにするためのAIDEのチェックサム/など
  2. Inotifyはリソース使用量を低く抑え、ファイルシステムを何度も再スキャンする必要がありません
  3. rsyncにパッチを当てる必要はありません。パッチを適用する必要がある場合でも、パッチの適用を避けて負担を軽減することをお勧めします(更新があるたびにパッチを再適用する必要はありません)。
  4. 私は以前にUnisonを使用しましたが、本当に素晴らしいのですが、Unisonはファイルシステム上にコピーを保持し、その「アーカイブ」ファイルはかなり大きくなる可能性があると誓うことができましたか?

回答:


7

Unison http://www.cis.upenn.edu/~bcpierce/unison/は、移動と名前の変更を検出できると主張しています。

移動/名前変更の検出を追加するために、rsyncにいくつかのパッチがあります。

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed-lax.diff;h=1ff593c8f97a97e8970d43ff5a62dfad5abddd75;hb=master

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed.diff;h=c3e6e846eab437e56e25e2c334e292996ee84345;hb=master

この問題を追跡するBugzillaエントリ:https : //bugzilla.samba.org/show_bug.cgi?id=2294


6
これらのパッチが統合されないのはなぜですか?フラグを追加するだけで、邪魔になりません。別の興味深いパッチはrsyncsumsで、rsyncの実行間でチェックサムを保持できます。
東武

5

これは少し奇妙な解決策ですが、... gitはファイルの内容に基づいて移動と名前の変更を検出するため、問題のディレクトリをバージョン管理下に置くと、gitは移動などを検出し、転送を回避できます。ツリー内で物事を動かしながら、コンテンツ(既にワイヤの両側にあるため)。

ちょっとした考え。


2
はい、私はこれを考慮しました。ファイルが小さく、テキストベースである場合、これはおそらくうまくいくでしょうが、それらはバイナリであり、合計サイズはテラバイトに近づいています。
ファラウン

@Pharaun BLOBストレージなしでgitインデックスが必要になります。このコードをgitからリッピングしてlibgit2に追加することもできます。
東武

関連するコードはread-cache.cのrefresh_indexで始まります。
東武

5

ここで興味深い提案。ZFSなどのファイルシステム機能を使用することも考えられました。その単純なことを行うツールが存在しないことは奇妙だとわかりました。ユニゾンオプションは、ほとんどの場合、人々が報告するように機能しません。

フォルダーを再配置するときに、この機能で2番目のハードディスク上の映画コレクションのバックアップを同期させておく必要があります。

今、私はこの簡単なCスクリプトhttp://sourceforge.net/projects/movesync/を見つけました

うまくいくようです。それを実行してから、通常どおりユニゾンと同期します。


4

あなたは使用することができるかもしれないホストベースのIDSのようなAIDEをし、その出力を使用してラッパースクリプトを記述します。チェックサムを考慮して、より複雑なロジックを記述する必要があります。

そうしないと、変更がすべての場所に反映されるため、ネットワークベースのファイルシステムが意味をなす場合があります。それにもかかわらず、私はあなたがインターネットを介して転送していると思うので、ここでオプションを制限します。


それが、私が考えていたことであり、そのうちの1つを取り上げて拡張しました。また、はい、私はそれをインターネット経由で転送しており、帯域幅はかなり制限されています。
ファラウン

3

あなたはユニゾンを試すかもしれません; 特に

-xferbycopyingはローカルコピーを使用して転送を最適化します(デフォルトはtrue)

で述べたオプションのドキュメントとして

この設定が設定されると、Unisonは、必要なコンテンツを持つファイルがターゲットレプリカに既に存在することを認識することにより、ネットワークを介したファイルコンテンツの転送を回避しようとします。これにより、通常、ファイルの移動が非常に迅速に伝播されます。デフォルト値はtrueです。

それはあなたが望むことをするかもしれないように見えます。


実際、後から考えると、私はユニゾンのコメントにあまりにも急いでいたかもしれません。ユニゾンは、ハードリンクが変更された場合、実際のファイルコンテンツでハードリンクを置き換えることをサポートしていますか?そうだとすれば、rsnapshot + unisonでいくつかの魔法をかけることができ、これに対処するために大量の新しいコード/ログ/などを書く必要なく、私の要件を満たすことができます。
ファラウン

3

Syrepは必要なことを行います。ファイルツリーのメッセージダイジェストを最新の状態に保ちます。ダイジェストを保持することで、rsyncよりも効率的になります。sneakernet用に設計されているため、一度にupdate / makepatch / mergeを実行するラッパーを追加できます。


2

これを行う既存のツールがあるかどうかはわかりませんが、最後のバックアップよりも新しいfindベースディレクトリで実行する単純なスクリプトをmtime作成できます。これにより、変更れたすべてのファイルのリストが表示さます。ファイルが単に移動された場合、リストには表示されません。残念ながら、このリストにはファイルの移動先のディレクトリが含まれます。これは、ファイルが追加/削除されるとディレクトリが更新されるためです。

そのファイルのリストを使用して、rsyncを使用してそれらのファイルのみを同期できます。rsyncには、ファイルリストを読み込むオプションがあります。この例を示すテストは次のとおりです。

$ cd tmp
$ echo test > test
$ ls -la
total 16
drwxr-xr-x 2 root root 4096 Aug 18 11:34 .
drwxr-x--- 5 root root 4096 Aug 18 11:34 ..
-rw-r--r-- 1 root root    5 Aug 18 11:34 test
$ mkdir tmp2
$ find . -mmin 1
$ date
Wed Aug 18 11:35:10 EDT 2010
$ find . -mmin 1
$ find . -mmin 2
.
./test
./tmp2
$ mv test tmp2
$ find . -mmin 1
.
./tmp2

findコマンドの実行の間に約1分間待機したことに注意してください。このことから、ファイルを最初に作成するときに、でリストされていることがわかりますfind。ファイルを別のディレクトリに移動してfindコマンドを再実行すると、ファイルを移動したディレクトリのみが表示され、ファイル自体は表示されません。findおよびrsyncコマンドの組み合わせを使用して、必要なファイルのみをリストすることができます。おそらく、目的を達成できます。

これがお役に立てば幸いです。


2

あなたのワークフローを考えると、ファイルレベルでの作業(他の人がこれまでに提案してきたような)が最良の解決策であるかどうか疑問に思います。あなたは働くことができます...

ファイルシステムレベルで

この考え方は、ファイルシステムにバックアップ間の操作を追跡させることです。ファイルシステムのバックアップを作成する代わりに、ファイルシステムジャーナルをバックアップします(すぐに使用できるバックアップが必要な場合は、オプションでバックアップマシンで変更を再生します)。ファイルシステムジャーナルは、自然に移動と削除を数バイトで表現します。

Fuseを使用すると、「実際のファイルシステム」の上にある特定の要件を持つファイルシステムを比較的簡単に設計できます。使用したことはありませんが、LoggedFSは有望に見えます。

このソリューションでは、何らかの形のジャーナル圧縮を行う価値があります。たとえば、ファイルが10回上書きされた場合、最後の更新のみをジャーナルに保持します。別の価値のある最適化は、コピー操作、さらには編集を認識することです(つまり、ほとんどが別のファイルと完全に同一ではないファイルを作成します)。誰かがこれを実装したかどうかはわかりません。ワークフローについては、とにかく大したことはないと思います。

音量レベルで

この考え方は、ボリュームマネージャーにバックアップ間の操作を追跡させることです。ファイルシステムのバックアップを作成する代わりに、ボリュームマネージャーでスナップショットを作成し、以前のスナップショットとの差分として表現されたスナップショットバックアップします。

これは、ファイルを作成し、名前を変更して削除するだけであればうまくいくはずです。コピーや編集などを検出したり、ファイルの作成とそれに続く削除を最適化することは、はるかに困難です。


私は実際に変更を追跡するためにinotify経由でファイル「システム」ロガーに少し取り組んでいますが、変更がデーモンが記録できる速度よりも速くなると、情報を失うため、バックアップ/スキャンを実行して、初期状態を取得します。また、情報が失われた場合はinotifyします。あなたが言ったように、ファイルシステムとシステムの残りの部分の間に何かを置くという考えも、あなたの言ったように、バックアップマシンで変更を再生できるという考えのように見えます。
ファラウン

ただし、loggedFSは興味深いプロジェクトのように見えますが、懸念されるのは2008/09にdevを停止したことだけです。それで遊んで、それがトリックを行うかどうかを確認する必要があります。
ファラウン

0

Unisonはこれに適していますが、ファイルをローカルにコピーする必要があり、ファイルの内容が少しでも変更された場合、移動/名前変更を検出できません。

iノード番号(* nixのみ)を使用して名前変更/移動されたファイルとディレクトリを検出し、これらの変更を同期されたマシンで再生する単純なPythonスクリプトを作成しました。単独で使用することも、Unisonまたはrsyncの「名前変更プリプロセッサ」として使用することもできます。それは見つけることができるここに

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