未加工ブロックデバイスの比較


12

2つのブロックデバイスを比較できるユーティリティ(またはシェルマジック)はありますか?

詳細:ddを使用して少し大きいSATAデバイスにバックアップした1つの大きな(0.5 TB)RAIDデバイスがあります。デバイスにはいくつかのパーティションがありますが、パーティション化されたデバイスノードではなく、「親」デバイスからコピーします(たとえば、/ dev / hda1ではなく/ dev / hdaをコピーします)。

バックアップが良い/正しいことを確認したいのですが。

各デバイスでmd5sumを実行することを考えましたが、2番目のデバイスが最初のデバイスよりわずかに大きいため、余分なバイトによってハッシュが変更されるため、正確な結果は得られません。

回答:


13

コマンドを使用します

cmp /dev/hda /dev/hdb

最初の異なるバイトで停止して、そのオフセットを書き込むか、短い方のバイトでEOFに書き込みます。


EOFで停止することについてマンページに何も表示されていません。それはどこかに文書化されていますか?
ケビン

実際、終了ステータスは、「1:ファイルが異なります。これには、一方のファイルが他方の最初の部分と同一である場合も含まれます。」これは、どちらかが短い場合、それらを同一として報告しないことを意味するようです。
Kevin

@Kevin:from info cmp:「 'cmp'コマンドは2つのファイルを比較し、それらが異なる場合は、最初のバイトと行番号をどこで異なるかを伝えます。」
enzotib 2012年

1
この--bytes=LIMITオプションを使用して、LIMIT値を小さいデバイスのバイトサイズに設定し、cmpゼロ以外のステータスで終了することなく、小さいドライブ(またはパーティション境界)の終わりで停止することができます。
rozcietrzewiacz 2012年

/ dev / sdaの/ dev / loop0のコピーがあり、/ dev / loop0に変更を加えた場合、どのようにして/ dev / sdaに新しい変更を追加できますか?ありがとう
Milor123 2016

2

ドライブの実際の容量によっては、ファイルシステムをマウントして実行するのが最も速い場合があります。

diff -qr /mnt/root1 /mnt/root2

そうでなければ、私はこのようなことを言うでしょう:

diff -q <(dd bs=1M count=500K if=/dev/sda) <(dd bs=1M count=500K if=/dev/sdb)

もちろん、あなたが確認する必要があり、どれだけ大きな把握bsし、count(それがはるかに便利だ場合または直前)で停止するように小さいドライブの最後。

または、enzotibのコメントのおかげで、を使用できるように見えcmpますが、-nバイト数を2つのドライブの短い方に制限するためのフラグが必要になります。

cmp /dev/sda /dev/sdb -n 500GB

残念ながら、デバイスをNTFSボリュームとしてマウントすることができず、適切なドライバーがインストールされていないLiveCDを使用しています。2番目のコマンドでは、使用するサブシェルは、デバイス全体をメモリに吸い込んでからdiffにフィードしませんか?
alanxz 2012年

1
@alanxzいいえ、diffサブシェルはデバイスに書き込む前にデバイス全体を読み取りません。それを読み取った直後にバイトをdd書き込むbs(または、ここでは指定せずに処理する)と、fifos に書き込み、読み取られるまでブロックします。
ケビン

シェルレベル(またはFIFOを実装するもの)でもっと考えていました。しかし、それは私の質問に答えます!
alanxz 2012年

2

バイナリ差分ソフトウェアを探しています

rdiff
はバックアップとネットワーク転送用に設計されています。バックアップの提案のためにrdiff-backupとduplicityを確認してください

xdelta3
は、オープンソースのバイナリ差分、差分圧縮ツール、VCDIFF(RFC 3284)デルタ圧縮です。

bsdiff
もです!! メモリ不足のため、ブロックデバイスには適していません。


1

まさにこの種のことを行うbsdiffと呼ばれるユーティリティがあります。非常に高速で、必要に応じてバイナリパッチを生成できます。

それに関するいくつかの説明については、この投稿を参照してください。


bsdiff仕事は単純に2つのファイルを比較するよりも複雑であるため、単純なファイルよりも速くなることはないと思いますcmp
enzotib 2012年

リンクが壊れています。
Owen Pauling

1

次のmd5sumように使用して、2つの異なるサイズのブロックデバイスを比較できます。

(小さいデバイスがであると仮定/dev/sda

# md5sum /dev/sda && head -c $(blockdev --getsize64 /dev/sda) /dev/sdb | md5sum

0

fsckバックアップで実行することを検討してください。losetupバックアップに埋め込まれたパーティションにループバックデバイスを設定するために、いくつかのトリックを実行する必要があるかもしれませんが、ファイルチェックでファイル構造が一貫していると示されている場合、データ自体はおそらく良好です。

完全なチェックサムが必要な場合は、オフセット付きのループバックデバイスを使用して、バックアップの内部「パーティション」とmd5sumをそれぞれ個別に調べることができますが、強制fsck的にバイト比較やチェックサム計算のバイトよりもはるかに高速な基本的な考え方が得られる場合があります。

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