我有一堆来自不同制造商的 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
Run Code Online (Sandbox Code Playgroud)
我使用存储卡复印机复制图像。所有卡片都有相同的内容。
当我挂载任意两张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^
Run Code Online (Sandbox Code Playgroud)
但是,如果我比较分区的 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 -
Run Code Online (Sandbox Code Playgroud)
陌生人,如果我使用二进制比较工具比较这两个驱动器,例如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
Run Code Online (Sandbox Code Playgroud)
767368 更改,即使diff
在内容上没有看到任何差异!
为了理智,如果我比较两个具有相同 sha1sum 的分区,我会看到以下内容
$ radiff2 -c sdj2.img sdf2.img
0
Run Code Online (Sandbox Code Playgroud)
0 变化!
这是我从不同卡片中看到的不同 sha1sum 的细分。当我使用 dd 读取驱动器时,卡的制造商似乎对我得到的 sha1sum 有很大影响。
尽管 sha1sums 存在差异,但所有这些卡都适用于我的目的。但是,它使完整性检查变得困难,因为我无法比较 sha1sums。
两个 SD 卡分区如何可能具有不同的 sha1sum,但在安装时具有完全相同的内容?
答:所以现在它按预期工作了。澄清一下,不一致是由我使用的 SySTOR 复制器引起的。我让它使用复制的分区信息和文件的复制设置,但它没有必要 dd 位来确保一对一匹配。
Cel*_*ada 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
Run Code Online (Sandbox Code Playgroud)
只有当卡片的大小完全相同时,这才是正确的。有时,即使是同一制造商和型号的不同批次的卡,其尺寸也会略有不同。使用blockdev --getsize64
来获取设备的确切大小。
此外,如果两张卡的大小完全相同,但您将小于卡容量的图像写入两张卡,则图像结束后出现的垃圾可能会导致报告差异。
在设备上挂载任何文件系统后,您将开始看到差异。文件系统实现会将各种内容写入文件系统,例如空日志或标记/时间戳以将文件系统标记为干净,然后您将不再看到相同的内容。我相信即使您以只读方式挂载文件系统,在某些情况下也会出现这种情况。
以 Celada 的回答为基础:一方面,您diff
在两个挂载的文件系统之间执行(递归)。另一方面,您正在对具有文件系统的设备进行二进制比较- 显然,在您安装文件系统之后。那是苹果和石榴。
挂载文件系统级别的操作只能看到文件系统中文件的数据内容。设备之间的二进制比较查看数据和元数据。我对 767368 的差异有点惊讶,但我可以猜到几个:
diff
每个设备上的每个文件都将更新其访问时间(在 inode 中)。PS有必要用dd
这么多吗?如果你这样做radiff2 -c /dev/sdg2 /dev/sdj2
或会发生什么sha1sum /dev/sdg2
?
归档时间: |
|
查看次数: |
1635 次 |
最近记录: |