为什么这些重复的SD卡的内容具有不同的sha1sum?


17

我有一堆来自不同制造商的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位来确保存在一对一的匹配。


3
这么多的卡您要进行哪种测试?:)
hjk

如果要安装它们之后进行比较,那是您的问题。
David Hoelzer 2015年

Answers:


18

写入重复内容后,您是否立即比较它们的内容?如果是,它们应该完全一样。例如,

# 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来获取设备的确切大小。

另外,如果两张卡的大小完全相同,但是您在两张卡上写入的图像均小于卡的容量,则图像末尾出现的垃圾可能会导致差异报告。

在设备上挂载任何文件系统后,您将开始看到差异。文件系统实现会将各种内容写入文件系统,例如空日志或将文件系统标记为干净的标志/时间戳,然后您将不再看到相同的内容。我相信即使您以只读方式挂载文件系统,在某些情况下也可能是这种情况。


OP是否需要使用blockdev --getsize64?看起来好像dd是在宣布读取的数据量。
G-Man说'恢复莫妮卡'

3
EIBTI。查询大小可以使它非常清晰。dd将报告它复制了多少。如果图像文件,一个设备的大小和另一设备的大小等之间的大小不匹配,则可能是源大小,目标大小或两者兼而有之。
Celada

你是对的。它们应该是并且它们完全相同。在进一步研究之后,我发现不一致是由SySTOR复印机上的复印设置引起的。当我dd从计算机上获取SD卡时(就像我对复印机的主映像所做的那样),所有阴影都匹配。我将SySTOR上的设置从“仅系统和文件数据”更改为“整个媒体”,现在所有重复的卡都具有匹配的阴影
peskal

8

根据Celada的答案:一方面,您正在diff两个已挂载的文件系统之间进行(递归)。另一方面,显然是在挂载文件系统之后,在其中具有文件系统的设备之间进行二进制比较。那是苹果和石榴。

在挂载的文件系统级别的操作只能看到文件系统中文件的数据内容。设备之间的二进制比较着眼于数据和元数据。我对767368的差异感到有些惊讶,但是我可以猜出一些:

  • 当您挂载文件系统时,内核会将当前时间作为“挂载时间”写入文件系统超级块中。如果您已经安装两个设备(而不是在精确的同一时间),“摩时代”中的超级块会有所不同。
  • 如果在递归文件系统之后执行设备级二进制比较,则diff每个设备上的每个文件(在inode中)的访问时间都会更新。

PS,您需要使用dd很多吗?如果您这样做radiff2 -c /dev/sdg2 /dev/sdj2 或会sha1sum /dev/sdg2怎样?


即使以只读方式安装驱动器,这也适用吗?在安装之前,我也已经进行了shasum比较,它们仍然有所不同。我也从未见过以只读方式安装后shasum发生变化。-同样您是对的,我应该赢得无用的dd奖:p
peskal 2015年

(1)不,正如您所怀疑(即,与您的经验一致),将文件系统挂载为ro(只读)不应引起(或允许)任何修改。(尽管我已经看到一种或两种情况下软件做了一些不应该做的事情。)(2)在阅读了您的评论(在撰写本文时,每个答案一个),我还是不太明白发生了 您是否愿意编辑您的问题或发表答案,以解释在复制后(安装之前)立即出现比较失败(即发现差异)的情况,……(续)
G-Man说“恢复莫妮卡”

(续)……您做了什么来解决它?(3)我喜欢它,但应将其称为“ UUOD”,“ UUODD”或“ UUDD”吗?我投票支持“ UUDD”,但我们可能应该在Meta上讨论。:-)⁠
G-人说'恢复莫妮卡'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.