低速接続で非常に大きなバイナリ ファイルをパッチする

低速接続で非常に大きなバイナリ ファイルをパッチする

バックアップの目的で、私は比較的上流の遅い接続を介して非常に大きなバイナリファイルを転送しました(転送には2週間かかりました)。マウントされたcifs共有でrsyncすることで(ブロック単位でアクセスできましたし、今もアクセスしています)。2週間後、rsyncはエラーを表示しました(残念ながら保存できませんでした)が、ファイルサイズは一致していました。また、

tail -c 1000000000 myfile.img|md5sum # and
head -c 1000000000 myfile.img|md5sum

一致するので、ファイルの先頭と末尾は同一になります。

ダウンストリームの方がはるかに高速なので、もう一度イメージ全体をダウンロードして、全体の md5 サムを実行しましたが、一致しませんでした。つまり、どうやら、1.5 TB のどこかに、少なくとも 1 ビットは異なる部分があるようです。

ダウンロードした 2 つのファイルから「パッチ」を生成し、それをリモート ファイルに適用して、間違ったブロックのみを再度転送する方法はありますか?

再度注意してください: リモートでコードを実行したり、リモートで rsync を実行する必要がある rsync の機能を使用したりすることはできません。 rsync を使用することは可能だと思いますし、ダウンロード速度と同程度に動作しますが、両方のバージョンがローカルにあるという事実を利用するより良い方法があるのではないかと思います。 何かを書くのはそれほど難しいことではないかもしれませんが、テスト済みのものを使用して作業を節約したいです。

答え1

(Linux の場合) 破損したデータが 1 ブロック程度で、ブロックのサイズは変わっていないと思われる場合は、 を使用できますcmp -l。 はバイトごとに比較し、 は-l差異のオフセットを示します。ファイル内の開始位置が漠然とわかっている場合は、 で最初の開始位置を指定できます。オフセットに誤りがある場合は、 を使用して元のファイルからそのオフセットを切り取り、破損したファイルに貼り付けること-iができます。(最初にコピーでテストしてください)dd skip=...dd seek=... conv=notrunc

答え2

リモート側でファイルを回復するには、BitTorrent を使用します。このプロトコルは、ファイルを小さなブロックに分割し、ハッシュがシード ファイルと一致しないブロックを自動的に再ダウンロードします。

プライベート設定で動作させるには:

  1. ローカルおよびリモートのビットトレント クライアントで DHT を無効にします。
  2. ファイアウォールでローカルのビットトレント ポートを開くか、SSH ポート転送を設定します。
  3. ソース側でシード ファイルを作成します。トラッカーは使用しないでください。クライアントもファイルのシードを開始するようにしてください。
  4. リモート側でファイルをバックアップします。
  5. シード ファイルをリモート側にコピーし、クライアントで開きます。
  6. ダウンロード場所を破損したファイルに指定し、オプションを選択します。ダウンロードを開始しない!! また、利用可能な場合は、DHT、ピア交換などに接続するオプションも無効にします。
  7. クライアントにダウンロードしたファイルを再確認してもらいます。ダウンロードの割合がほぼ完了していることが報告されるはずです。
  8. ローカルクライアントをダウンロードのピアとして追加する
  9. ダウンロードを開始する

関連情報