代码之家  ›  专栏  ›  技术社区  ›  Will Haley

为什么文件校验和会不一致地失败?

  •  3
  • Will Haley  · 技术社区  · 7 年前

    我创建了一个 ~2MiB 文件

    dd if=/dev/urandom of=file.bin bs=2M count=1
    

    然后,我多次复制该文件,并为每个(相同)副本生成一个校验和。

    for i in `seq 50000`;
    do
      name="file.${i}.bin"
      cp file.bin "${name}"
      sha512sum "${name}" > "${name}.sha512"
    done
    

    然后,我用要运行的验证脚本验证了所有这些校验和文件 sha512sum 针对每个文件。

    for file in `find . -regex ".*\.sha512"`
    do
        sha512sum --check --quiet "${file}" || (
          cat "${file}" && sha512sum "${file%.sha512}"
        )
    done
    

    刚刚创建了这些文件 ,当我稍后验证它们时,我看到数据中出现间歇性故障和不一致(为了可读性,控制台文本被截断)

    will:/mnt/usb $ for file in `find ...
    file.5602.bin: FAILED
    sha512sum: WARNING: 1 computed checksum did NOT match
    91fc201a3812e93ef3d4890 ... file.5602.bin
    b176e8e3ea63a223130f3a0 ... ./file.5602.bin
    

    校验和文件是 因为源文件都是相同的

    问题似乎是,我的电脑似乎在随机生成 当我去验证时,我的一些文件。A. 不同的文件 每次校验和失败,之前失败的文件将通过。

    will:/mnt/usb $ for file in `find ...
    sha512sum: WARNING: 1 computed checksum did NOT match
    91fc201a3812e93ef3d4890 ... file.3248.bin
    442a1d8805ed134c9ab5252 ... ./file.3248.bin
    

    请记住 所有这些文件都是相同的 .

    我在SATA SSD和HDD以及USB设备、md5和sha512、xfs、btrfs、ext4和vfat上看到了相同的行为。我试着实时引导到另一个操作系统。不管怎样,我看到了同样的陌生人行为。我也看到了 rsync --checksum 因为这些文件认为校验和错误,所以即使这些文件没有更改,也会重新复制这些文件。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Will Haley    7 年前

    什么可以解释这种行为? 如何诊断?

    据我所知,有很多问题可以解释这种行为。坏磁盘、坏PSU(电源)、坏RAM、文件系统问题。

    我尝试了以下步骤来确定发生了什么。我用不同的方法重复了这个实验。。。

    • 磁盘
    • 磁盘类型(SDD与HDD)
    • 外部驱动器(3.5和2.5机柜)
    • 闪存驱动器(不同端口上的USB 2和3)
    • 文件系统(ext4、vfat(fat32)、xfs、btrfs)
    • 不同的PSU
    • 不同的操作系统(实时引导)

    似乎没有什么能解决这个问题。

    最后,我给了 memtest86+ v5.0.1 通过Ubuntu live USB进行尝试。

    . 它发现内存不好。通过消除过程,我确定我的一个记忆棒坏了,然后测试了另一个晚上,以确保它处于良好状态。我再次运行了我的实验,我在所有文件上看到一致的校验和。

    failing memory in memtest86+

    多么微妙的错误。我只是偶然注意到了这种不良行为。如果我没有乱搞文件校验和,我想我不会发现这个坏RAM。

    这让我想定期安排一个例行程序,在其中验证和测试我的RAM。这个坏记忆棒的后果是我的一些测试数据 最终确实腐败了 ,但通常情况下,校验和验证只是即时失败。

    在一个样本数据池中,所有校验和都以 cb2848ca0e1ff27202a309408ec76... ,因为所有大约50000个文件都是相同的。

    不过,有两个文件 已损坏 ,但这个 不是位腐烂或文件完整性损坏 .

    看起来最有可能的是这些文件 腐败造成的 因为 cp 创建这些文件时遇到了坏RAM。这些文件始终返回错误的校验和 58fe24f0e00229e8399dc6668b9... bd85b51065ce5ec31ad7ebf3... ,而其他49998个文件返回相同的校验和。

    这是一个 享乐 调试中的实验非常令人沮丧。