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

为什么这些重复的 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

我用了一个存储卡复印机复制图像。所有卡片的内容相同。

当我挂载任意两张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 有很大影响。

在此输入图像描述

尽管 sha1sums 存在差异,但所有这些卡都适合我的目的。然而,这使得完整性检查变得困难,因为我无法比较 sha1sum。

怎么可能两个 SD 卡分区具有不同的 sha1sum,但在安装时却具有完全相同的内容?


回答:所以现在它按预期工作了。澄清一下,不一致是由我使用的 SySTOR 复制器引起的。我让它使用复制的分区信息和文件的复制设置,但不需要添加位来确保存在一对一匹配。

答案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

以塞拉达的回答为基础:一方面,你正在做一个diff两个已安装的文件系统之间进行(递归)操作。另一方面,您正在进行二进制比较具有文件系统的设备- 显然,在安装文件系统之后。那是苹果和石榴。

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

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

PS需要用dd那么多吗?如果你这样做radiff2 -c /dev/sdg2 /dev/sdj2 或会发生什么sha1sum /dev/sdg2

相关内容