Dd

為什麼這些重複的 SD 卡的內容具有不同的 sha1sum?

  • December 23, 2015

我有一堆來自不同製造商的 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

我使用儲存卡複印機來複製圖像。所有卡片都具有相同的內容。

當我掛載任意兩張SD卡的第二個分區並比較內容時,它們完全一樣。

$ 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,我會看到以下內容

$ 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 的分區,我會看到以下內容

$ radiff2 -c sdj2.img sdf2.img
0

0變化!

這是我從不同卡片中看到的不同 sha1sum 的細分。似乎卡的製造商對我使用 dd 讀取驅動器時得到的 sha1sum 有很大影響。

在此處輸入圖像描述

儘管 sha1sum 存在差異,但所有這些卡都適用於我的目的。但是,這使得完整性檢查變得困難,因為我無法比較 sha1sum。

兩個 SD 卡分區怎麼可能有不同的 sha1sum,但在掛載時具有完全相同的內容?


**答:**所以現在它按預期工作。澄清一下,不一致是由我使用的 SySTOR 複印機引起的。我的複制設置使用複制的分區資訊和文件,但不需要 dd 位來確保一對一匹配。

您是否在寫完重複的內容後立即比較了它們的內容?如果是,它們應該完全一樣。例如,

# 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獲取設備的確切尺寸。

此外,如果兩張卡的尺寸完全相同,但您在兩張卡上寫入的圖像小於卡的容量,則圖像結束後出現的垃圾可能會導致報告差異。

在設備上掛載任何文件系統後,您將開始看到差異。文件系統實現將向文件系統寫入各種內容,例如空日誌或標誌/時間戳以將文件系統標記為乾淨,然後您將不再看到相同的內容。我相信即使您以只讀方式安裝文件系統,在某些情況下也會出現這種情況。

引用自:https://unix.stackexchange.com/questions/250112