1TBファイルが正しく転送されたことを確認するにはどうすればよいですか?


25

長期保存のために、VMイメージをハイパーバイザーからアーカイブサーバーに頻繁に転送します。

netcatを使用して転送するのは、scp、rsyncなどよりも高速だからです。

hypervisor$ cat foo.box | nc <archive IP> 1234

archive$ nc -l -p 1234 > foo.box

ファイルの転送が完了したらmd5sum、ターゲットとソースの両方で実行することにより、破損がないことを確認します。

残念ながら、大きなファイルでmd5sumを実行すると、非常に長い時間がかかる場合があります。2つの大きなファイルの整合性をより迅速に比較するにはどうすればよいですか?

更新:

  • 送信が中断されることはめったにないため、再起動機能は問題になりません。
  • 通常、NC経由での転送には3〜4時間かかり、md5sumを取得するには40分かかります。
  • この場合、ハッシュのセキュリティは問題になりません。

2
別のチェックサムを試すことができます:en.wikipedia.org/wiki/Checksum。私はかかわらず、彼らのパフォーマンスのことは知らない
tumchaaditya

実際の転送にかかる時間、およびmd5sumにかかる時間はどれくらいですか?
キーストンプソン14年

転送には通常3〜4時間かかり、md5sumの計算には約40分かかります。
tbenz9 14年

回答:


18

tee を使用して、次のような方法でオンザフライで合計を実行できます(必要に応じてnetcatコマンドを調整します)。

サーバ:

netcat -l -w 2 1111 | tee >( md5sum > /dev/stderr )

クライアント:

tee >( md5sum > /dev/stderr ) | netcat 127.0.0.1 1111

1
考えてみてください:これに役立つmd5deep「チャンク」モード(md5deep.sourceforge.net/md5deep.html)があります。
ローレンス

@ultrasawblade-それは素晴らしいリンクです。他の目的のためにチェックアウトする必要があります。言及してくれてありがとう!
オタクウォーラー14年

10

teeチェックサムの転送と計算を同時に使用することに関するNerdwallerの答えは、主にネットワーク上の破損について心配している場合に適したアプローチです。ただし、ディスクに到達する前にチェックサムを取得するため、ディスクへの途中での破損などから保護されません。

しかし、私は何かを追加したいと思います:

1 TiB / 40分≈437 MiB /秒1

実際、それはかなり速いです。大量のRAM がない限り、ストレージから戻らなければならないことに注意してください。したがって、最初に確認することはiostat -kx 10、チェックサムの実行を監視することです。特に、%util列に注意を払う必要があります。ディスクをペッグしている場合(100%近く)、答えはより高速なストレージを購入することです。

それ以外の場合、他のポスターで述べたように、異なるチェックサムアルゴリズムを試すことができます。MD4、MD5、およびSHA-1はすべて暗号化ハッシュになるように設計されています(これらのいずれもその目的に使用されるべきではありませんが、すべてが弱すぎると見なされます)。賢明な速度で、あなたはそれらを比較することができますopenssl speed md4 md5 sha1 sha256。少なくとも1つはまだ十分に強力なハッシュを持つためにSHA256を投入しました。

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md4              61716.74k   195224.79k   455472.73k   695089.49k   820035.58k
md5              46317.99k   140508.39k   320853.42k   473215.66k   539563.35k
sha1             43397.21k   126598.91k   283775.15k   392279.04k   473153.54k
sha256           33677.99k    75638.81k   128904.87k   155874.91k   167774.89k

上記のうち、MD4が最も速く、SHA256が最も遅いことがわかります。この結果は、少なくともPCのようなハードウェアでは一般的です。

パフォーマンスをさらに向上させる必要がある場合(改ざんするのは簡単ですが、破損を検出する可能性は低くなります)、CRCまたはAdlerハッシュを調べます。この2つのうち、Adlerは一般的に高速ですが、脆弱です。残念ながら、私は本当に高速なコマンドラインの実装を認識していません。私のシステム上のプログラムはすべてOpenSSLのmd4よりも遅いです。

したがって、速度面での最善策はopenssl md4 -r-rmd5sum出力のように見えるようにすることです)です。

コンパイルおよび/または最小限のプログラミングを行う場合は、Stack OverflowおよびxxhashでMark Adlerのコードを参照してください。SSE 4.2を使用している場合、ハードウェアCRC命令の速度を上回ることはできません。


1 1 TiB =1024⁴バイト; 1 MiB =1024²バイト。1000の累乗単位で約417MB /秒になります。


高速で、1つの大きなRAIDアレイから2番目の大きなRAIDアレイにコピーしています。
tbenz9 14年

@ tbenz9私が考えたのは、まさか単一のディスクではない!私はいくつかの非常に高速なハッシュにいくつかのポインタを追加しましたが、残念ながら少なくともそれらのコンパイルが必要になります... (そして、Mark Adler
v。Adler32

@derobert、テストに小さなファイルを使用する代わりに、1TBのような大きなファイルでテストしてはいけませんか?
18:46でパセリエ

@derobert、shasum代わりに使ってみませんか?
18:54でパセリエ

OpenSSLの組み込みベンチマークからの出力である@Pacerier。ブロックが長くなると間違いなく、少し速くなりますが、ランキングは変わりそうにありません(テストしたすべてのサイズで一貫していました)。shasumにはOpenSSLよりも高速な実装がありますか?正直なところ、最近では高速な暗号化ハッシュが必要な場合、BLAKE2を使用します。
デロベルト

9

このopensslコマンドは、いくつかのメッセージダイジェストをサポートしています。私が試してみたもののうち、md4約65%の時間でmd5、約54%の時間で実行したようですsha1(テストした1つのファイルの場合)。

md2ドキュメントにもがありますが、と同じ結果になるようmd5です。

おおまかに言って、速度は品質に反比例するように見えますが、(おそらく)敵が意図的な衝突を引き起こすことを心配していないので、それは大した問題ではないはずです。

古くてシンプルなメッセージダイジェストを探しているかもしれません(md1たとえば、ありましたか?)

些細な点:の無駄な使用法がありcatます。のではなく:

cat foo.box | nc <archive IP> 1234

次を使用できます:

nc <archive IP> 1234 < foo.box

あるいは:

< foo.box nc <archive IP> 1234

そうすることでプロセスを節約できますが、おそらくパフォーマンスに大きな影響はありません。


1
ネコのヒントをありがとう、質問に関係していませんが、それでも役立つヒントを提供します。乾杯!
tbenz9 14年

@ tbenz9:読み取り可能なコードは、デバッグ、保守、および変更が簡単です。catしたがって、「役に立たない」とは必ずしも完全に悪いわけではありません。回避してもパフォーマンスが向上しない場合は、このコードのメンテナーになると仮定して、より快適なものを使用することをお勧めます
iconoclast

1
@Keith、リンクダウン...
Pacerier

4

2つのオプション:

つかいます sha1sum

sha1sum foo.box

状況によっては、sha1sumの方が高速です。


つかいます rsync

転送には時間がかかりますが、rsyncはファイルがそのまま到着したことを確認します。

rsync manページから

rsyncは、ファイルの転送時に生成されるファイル全体のチェックサムをチェックすることにより、転送された各ファイルが受信側で正しく再構築されたことを常に確認することに注意してください...


1
sha1sumのヒントのおかげで、rsyncは転送に10時間以上かかります。同じファイルを転送し、ncとmd5sumを使用して約4時間でmd5sumsを実行できます。4時間をさらに短縮しようとしています。
tbenz9 14年

3

科学は進歩しています。新しいBLAKE2ハッシュ関数はMD5よりも高速である(および暗号化により起動がはるかに強い)ようです。

参照:https : //leastauthority.com/blog/BLAKE2-harder-better-faster-stronger-than-MD5.html

Zookoのスライドから:

Intel Core i5-3210M(Ivy Bridge)
機能でのバイトあたりのサイクルバイトあたりのサイクル
長いメッセージ4096 B 64 B MD5 5.0 5.2 13.1 SHA1 4.7 4.8 13.7 SHA256 12.8 13.0 30.0 ケッカ8.2 8.5 26.0 BLAKE1 5.8 6.0 14.9 BLAKE2 3.5 3.5 9.3

2

あなたはおそらく良いハッシュよりも良いことはできません。他のハッシュ/チェックサム関数をチェックアウトして、いずれかの関数がmd5sum。MD5ほど強力なものは必要ないかもしれないことに注意してください。MD5(およびSHA1など)は暗号強度が高くなるように設計されているため、攻撃者/詐欺師が既存の値と同じハッシュ値を持つ新しいファイルを作成することは不可能です(つまり、署名付きeの改ざんを困難にするため) -メールおよびその他の文書)。通信への攻撃は気にせず、通信エラーだけを実行する場合は、巡回冗長検査(CRC)のようなもので十分かもしれません。(しかし、もっと速くなるかどうかはわかりません。)

別のアプローチは、転送と並行してハッシュを実行することです。これにより、全体の時間が短縮される可能性があり、転送が完了するのを待ってから、MD5が完了するのを再度待つ必要があるという刺激要因を確実に減らすことができます。私はこれをテストしていませんが、次のようなことができるはずです:

  • ソースマシンで:

    mkfifo myfifo
    tee myfifo < source_file | nc dest_host  port_number&md5sum myfifo
    
  • 宛先マシンで:

    mkfifo myfifo
    nc -l -p port_number | tee myfifo> dest_file&md5sum myfifo
    

もちろん、ファイルのサイズをチェックすることは、バイトがドロップされたかどうかを検出するための優れた迅速な方法です。


2

巨大なファイルを送信するのは大変です。ファイルをチャンクアップして各チャンクのハッシュを生成し、それを宛先に送信してから、ハッシュをチェックしてチャンクを結合してみてください。

パーソナルBitTorrentネットワークをセットアップすることもできます。これにより、すべてが安全に到達します。


私の理解では、BitTorrentネットワークは1つのソースと1つの宛先であるため有益ではありません。それは多くのソースから多くの目的地に行くときにのみ利益があるのでしょうか?
tbenz9 14年

私はこのアプローチを提案することを検討しました(入力ファイルをチャンクに分割し、それらを個別に送信し、もう一方の端で再組み立てします)。ネットワーク転送時間は同じですが、各エンドでより多くのオーバーヘッドが発生します。これは、基本的に、ソースマシンからソースマシンファイルをコピーし、それを宛先マシンにコピーしてから、宛先マシンから宛先マシンにコピーすることを伴います。大きなRAMディスクでも、これは無料ではありません。
スコット14年

1
このアプローチの唯一の利点は、伝送障害からの迅速な回復を含む再起動性です。OPは、どのくらいの頻度で障害が発生するかを述べておらず、これが彼が最適化することを望んでいたことを示していませんでした。
スコット14年

@ tben9 Bittorrentは、ファイルの単一転送に現在選択されているツールです。ファイルにハッシュ情報があると、エンドクライアントはダウンロードしたデータを確認し、必要に応じて修正できます。複数のソースは速度のためです。そのため、この場合、BTを使用してファイルが正しく転送されるようにすることは有益です。
アンダーバース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.