3

ある時点以降にブロック デバイス上のどのブロックが変更されたかを追跡する方法を探しています。私が最終的にこれをどのように使用したいかは、2 つの 2 TB ディスクの同期を維持することです。1 つは月に 1 回だけオンライン (USB 経由で接続) になります。どのブロックが変更されたかわからないので、毎回 2TB 全体を調べなければなりません。

私は最近の GNU/Linux OS を使用しており、C と Python の経験があります。カーネル レベルのコードを書くことは避けたいと思っています。その分野での経験がまったくないからです。私の現在の理論では、ディスク フラッシュが実行されたときにコードを呼び出すことができるフックがどこかにあるはずです。

何か案は?

4

3 に答える 3

3

ブロックレイヤーのバグを回避するように注意すれば、これにLinuxMDを使用できるはずです。毎月かそこらで、USBディスクを2ディスクRAIDセットの新しいメンバーとして追加します。デフォルトでは1つが欠落しており、変更されたブロックの同期を実行します。書き込みを目的としたビットマップはそのために有益であるように思われるので、忘れずに使用してください。

# Creation
mdadm -C /dev/md0 -l 1 -n 2 -e 1.0 -b internal  /dev/sda  missing

# Addition of slave disk
mdadm /dev/md0 -a /dev/thatusbthing

オプション/潜在的な落とし穴の詳細については、この設定の詳細な説明も参照してください。

補遺:

rsyncは、(比較的遅い)ネットワークを介してファイルを転送するように設計されています。つまり、両側がデバイスをローカルでスキャンし、そのローリングチェックサムを計算してから、変更されたチャンクを転送します。もちろん、チェンジリストはチェックサムの計算に依存しています。(ディスクから30 + MB / sで読み取る方が、100メガビットネットワークで無条件にプッシュするよりも高速です。たとえば、10MB / sです。)

MD書き込みインテントビットマップでは、ディスクが最後に同期されてからどのブロックが変更されたかをこのビットマップによってすでに認識しているため、スキャンステージは必要ありません。

于 2011-01-06T11:51:27.557 に答える
2

drbdを使用できます。大きなオーバーヘッドのように見えますが、1台のマシンで2台のデバイスを使用できます。2番目のデバイス(usb上のデバイス)は、ほとんどの場合削除し、「セカンダリ」状態に設定する必要があります。プラグを差し込んだ後、非常に高速に同期するはずです。これは、drbdがローカルの変更を追跡しているためです。

はい、欠点があります。rawデバイスだけでなく、特別な形式を使用する必要があります。ローカルで変更されたセクターにはそのビットマップが必要なため、デバイスは小さくなります。

于 2011-10-18T16:34:23.090 に答える
1

含まれているファイルシステムのメタデータを使用せずに、変更を判断する唯一の方法は、ブロック デバイスを比較することだと思います。でrsyncのデルタ転送アルゴリズムを適用できる場合がありますrsync --inplace -B 4K /dev/sdX /dev/sdY。ブロック デバイスに合わせてブロック サイズを調整します。これには 4 TB の読み取りが必要ですが、ブロック デバイスが同じシステム上にある必要はありません。他の多くのオプションの中で、転送時に圧縮を有効にすることができます。

于 2011-01-06T11:43:19.063 に答える