web-dev-qa-db-ja.com

これらの複製されたSDカードのコンテンツに異なるsha1sumがあるのはなぜですか?

さまざまなメーカーのClass 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

画像をコピーするために memory card duplicator を使用しました。すべてのカードの内容は同じです。

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  -

見知らぬ人、radiff2などのバイナリ差分ツールを使用してこれら2つのドライブを比較すると、次のようになります。

 $ 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

diffがコンテンツの違いを認識していなくても、767368が変更されました

そして正気のために、同じsha1sumを持つ2つのパーティションを比較すると、次のようになります。

 $ radiff2 -c sdj2.img sdf2.img
0

0変更!

これは、さまざまなカードから見たさまざまなsha1sumの内訳です。カードの製造元が、ddを使用してドライブを読み取るときに取得するsha1sumに大きな影響を与えるようです。

enter image description here

Sha1sumの違いにもかかわらず、これらのカードはすべて私の目的に使用できます。ただし、sha1sumを比較できないため、整合性チェックが難しくなっています。

2つのSDカードパーティションが異なるsha1sumsを持つ可能性があるのに、マウントされたときにまったく同じ内容になる可能性はありますか?


答え:これで、期待どおりに動作します。明確にするために、矛盾は私が使用していたSySTORデュプリケーターが原因でした。コピー設定では、コピーされたパーティション情報とファイルを使用しましたが、1対1の一致を保証するためにビットをddする必要はありませんでした。

17
peskal

複製した内容を書き込んだ後、すぐに内容を比較しましたか?はいの場合、それらは出てくるはずですまったく同じです。例えば、

# 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デバイスの正確なサイズを取得します。

また、両方のカードのサイズがまったく同じであるにもかかわらず、カードの容量よりも小さい画像を両方のカードに書き込んだ場合、画像の最後に来るゴミによって、違いが報告されることがあります。

デバイスにファイルシステムをマウントすると、違いがわかり始めます。ファイルシステムの実装は、空のジャーナルや、ファイルシステムをクリーンとしてマークするためのフラグ/タイムスタンプなど、ファイルシステムにさまざまなものを書き込みます。そうすると、同じ内容が表示されなくなります。これは、ファイルシステムを読み取り専用でマウントした場合でも、状況によっては当てはまると思います。

18
Celada

Celadaの答えに基づいて構築するには:一方で、マウントされた2つのファイルシステム間でdiff(再帰的)を実行しています。一方で、ファイルシステムをマウントした後、どうやらファイルシステムが存在するデバイスの間でバイナリ比較を行っています。それはリンゴとザクロです。

マウントされたファイルシステムレベルでの操作では、ファイルシステム内のファイルのデータコンテンツのみを表示できます。デバイス間のバイナリ比較は、データおよびメタデータを調べます。私は767368の違いに少し驚いていますが、いくつか推測できます。

  • ファイルシステムをマウントすると、カーネルは現在の時刻を「マウント時刻」としてファイルシステムスーパーブロックに書き込みます。両方のデバイスをマウントした場合(exactで同時にではない場合)、スーパーブロックの「マウント時間」は異なります。
  • 再帰的なファイルシステムdiffの後にデバイスレベルのバイナリ比較を行うと、各デバイスのすべてのファイルのアクセス時刻(inode内)が更新されます。

追伸ddをそんなに使う必要がありますか? radiff2 -c /dev/sdg2 /dev/sdj2またはsha1sum /dev/sdg2を実行するとどうなりますか?