
私は多くのメーカーのクラス10 UHS-1 SDHC SDカードをたくさん持っています。すべてのパーティションは次のとおりです。
$ sudo fdisk -l /dev/sdj
Disk /dev/sdj: 14.9 GiB, 15931539456 bytes, 31116288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0000de21
Device Boot Start End Sectors Size Id Type
/dev/sdj1 2048 1050623 1048576 512M c W95 FAT32 (LBA)
/dev/sdj2 1050624 2099199 1048576 512M 83 Linux
/dev/sdj3 2099200 3147775 1048576 512M 83 Linux
/dev/sdj4 3147776 31116287 27968512 13.3G 83 Linux
私は一つを使ったメモリーカードコピー機画像をコピーしてください。すべてのカードの内容は同じです。
2枚のSDカードのうち、2枚目のパーティションをマウントして内容を比較すると同じです。
$ sudo mount -o ro /dev/sdg2 /mnt/system-a/
$ sudo mount -o ro /dev/sdj2 /mnt/system-b/
$ diff -r --no-derefence /mnt/system-a /mnt/system-b/
$ # prints nothing^
しかし、パーティションのsha1sumを比較すると、時々異なる場合があります。
$ sudo dd if=/dev/sdg2 | sha1sum
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.3448 s, 43.5 MB/s
ee7a16a8d7262ccc6a2e6974e8026f78df445e72 -
$ sudo dd if=/dev/sdj2 | sha1sum
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.6412 s, 42.5 MB/s
4bb6e3e5f3e47dc6cedc6cf8ed327ca2ca7cd7c4 -
見知らぬ分、バイナリ比較ツール(例)を使用してこれら2つのドライブを比較すると、radiff2
次のようになります。
$ sudo dd if=/dev/sdg2 of=sdg2.img
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.2378 s, 43.9 MB/s
$ sudo dd if=/dev/sdj2 of=sdj2.img
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.2315 s, 43.9 MB/s
$ radiff2 -c sdg2.img sdj2.img
767368
767368個の変更がありますが、diff
内容に違いはありません!
精神的に同じsha1sumを使用して2つのパーティションを比較すると、次のようになります。
$ radiff2 -c sdj2.img sdf2.img
0
変更はありません。
以下は、さまざまなカードから見たさまざまなsha1sumの分析です。 ddを使用してドライブを読み取ると、sha1sumにカードメーカーの影響が大きいようです。
sha1sumの違いにもかかわらず、これらすべてのカードは私の目的にうまく機能します。しかし、sha1sumを比較することができないため、完全性の確認は困難です。
2つのSDカードパーティションのsha1sumが異なりますが、インストール時に内容がまったく同じであることはどのように可能ですか?
答え:これで期待どおりに動作します。明確に言えば、不一致は私が使用しているSySTORレプリケータによって引き起こされます。コピーされたパーティション情報とファイルのコピー設定を使用しましたが、1対1の一致を保証するためにビットを追加しませんでした。
答え1
内容を比較してみましたか?まもなく繰り返しの内容を書いた後?それから彼らは出なければならない正確に同じ。例えば、
# Duplicate
dd bs=16M if=/dev/sdg of=/dev/sdk
# Comparing should produce no output
cmp /dev/sdg /dev/sdk
# Compare, listing each byte difference; also no output
cmp -l /dev/sdg /dev/sdk
これは、カードのサイズがまったく同じ場合にのみ発生します。場合によっては、同じメーカーとモデルのカード配置が異なる場合でも、サイズが若干異なる場合があります。blockdev --getsize64
デバイスの正確なサイズを取得するために使用されます。
また、両方のカードのサイズがまったく同じですが、カード容量よりも小さい画像を両方のカードに書き込む場合、画像の最後にゴミが表示されていると報告の違いが発生する可能性があります。
デバイスにファイルシステムをインストールするとすぐに違いが表示され始めます。ファイルシステムの実装では、空のログやフラグ/タイムスタンプなど、ファイルシステムにクリーンなマークを付けるなどのさまざまなエントリがファイルシステムに書き込まれ、同じエントリは再表示されません。場合によっては、ファイルシステムを読み取り専用でマウントしても、これが発生する可能性があると思います。
答え2
Seradaの答えに基づいて:一方では、diff
マウントされた2つのファイルシステム間で(再帰)操作を実行しています。一方、バイナリ比較を行っています。ファイルシステムのあるデバイス- 当然ファイルシステムをマウントした後です。まさにリンゴとザクロです。
マウントされたファイルシステムレベルの操作では、ファイルシステム内のファイルのデータコンテンツのみを表示できます。データを表示するためのデバイス間のバイナリ比較とメタデータ。 767368の違いに少し驚きましたが、いくつか推測できます。
- ファイルシステムをマウントすると、カーネルは現在の時刻を「マウント時間」としてファイルシステムスーパーブロックに書き込みます。すでに 2 台のデバイスがインストールされており、そのデバイスにない場合精密同じ時間)、スーパーブロックの「マウント時間」は異なります。
- 再帰ファイルシステムの後でデバイスレベルのバイナリ比較を実行すると、
diff
すべてのデバイス上のすべてのファイルへのアクセス時間が更新されます(inodeから)。
PSをdd
そんなに使うべきですか?もしそうすればradiff2 -c /dev/sdg2 /dev/sdj2
どうなりますかsha1sum /dev/sdg2
?