【问题标题】:Why would file checksums inconsistently fail?为什么文件校验和会不一致地失败?
【发布时间】:2018-04-18 05:10:19
【问题描述】:

我创建了一个~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

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

问题似乎是,当我去验证时,我的计算机似乎随机生成了错误的校验和不同的文件每次都无法通过校验和,而之前失败的文件将通过。

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 这些文件认为校验和错误并重新复制这些文件,即使它们没有更改。

什么可以解释这种行为?由于它发生在具有我描述的所有场景的多个设备上,我怀疑这有点烂。我的内核日志没有显示明显的错误。根据我的故障排除,我认为这是硬件问题,但如何诊断?是 CPU、主板、内存吗?

【问题讨论】:

  • 我将我的 PSU 替换为 I'd read,这可能是硬盘驱动器出现问题的根源,但我看不出行为有什么不同。
  • 有时我的验证过程似乎根本找不到文件。 sha512sum: file.6707.bin: Input/output error
  • 我运行了Intel CPU diagnostic(在修复buglodctr /R 之后),英特尔测试给了我一个没有错误的通过结果。
  • 我没有可以在系统菜单和ASUS (my MOBO maker) has docs for a "PC Diagnostic Tool" 中找到的 BIOS 诊断工具,但它们似乎不再托管该工具。我在一个不可靠的下载站点上找到了该工具的下载,但它没有报告任何错误。我的H87I-PLUS Motherboard seems to have some sort of utility program,但它不会运行,而且似乎只是我所读到的一种风扇速度实用程序。

标签: filesystems checksum disk


【解决方案1】:

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

根据我的阅读,许多问题可以解释这种行为。坏磁盘、坏 PSU(电源)、坏 RAM、文件系统问题。

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

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

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

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

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

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

这让我想定期安排一个例程来验证和测试我的 RAM。这个坏记忆棒的后果是我的一些测试数据确实损坏了,但通常情况下,校验和验证只是间歇性的失败。

在一个示例数据池中,所有校验和都以 cb2848ca0e1ff27202a309408ec76... 开头,因为所有约 50,000 个文件都是相同的。

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

最有可能的是,这些文件创建时损坏,因为cp 在我创建这些文件时遇到了错误的 RAM。这些文件始终返回错误的校验和 58fe24f0e00229e8399dc6668b9...bd85b51065ce5ec31ad7ebf3...,而其他 49,998 个文件返回相同的校验和。

这是一个有趣非常令人沮丧的调试实验。

【讨论】:

  • 向不放弃和详细的反馈致敬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2012-12-30
  • 2010-12-06
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多