为什么文件校验和会不一致地失败?
Why would file checksums inconsistently fail?
我创建了一个 ~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
我刚刚创建了这些文件,当我稍后验证它们时,我看到间歇性故障和数据不一致(为了便于阅读,控制台文本 t运行 )
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 的行为相同。我尝试实时启动到另一个 OS。无论如何,我看到了同样的陌生人行为。我还看到 rsync --checksum
这些文件认为校验和错误并重新复制这些文件,即使它们没有更改。
什么可以解释这种行为?由于它在我描述的所有场景中都发生在多个设备上,我怀疑这是有点腐烂。我的内核日志没有显示明显的错误。根据我的故障排除,我认为这是硬件问题,但如何诊断呢?是CPU、主板、RAM吗?
如何解释这种行为? 如何诊断?
根据我的阅读,有许多问题可以解释这种行为。坏磁盘、坏 PSU(电源)、坏 RAM、文件系统问题。
我尝试了以下方法来确定发生了什么。我用不同的...重复了实验
- 磁盘
- 磁盘类型(SDD 与 HDD)
- 外部驱动器(3.5 和 2.5 机箱)
- 闪存驱动器(各种端口上的 USB 2 和 3)
- 文件系统(ext4、vfat (fat32)、xfs、btrfs)
- 不同的 PSU
- 不同OS(实时启动)
似乎没有什么可以解决这个问题。
最后,我 memtest86+ v5.0.1 通过 Ubuntu live USB 进行了尝试。
瞧。它发现内存不好。通过排除过程,我确定我的一根记忆棒坏了,然后整夜测试另一根以确保它处于良好状态。我再次 运行 我的实验,我看到所有文件的校验和一致。
多么微妙的错误。我只是偶然注意到这种不良行为。如果我没有搞乱文件校验和,我想我不会发现这个坏 RAM。
这让我想定期安排一个程序来验证和测试我的 RAM。这个坏记忆棒的后果是我的一些测试数据 最终损坏了 ,但通常情况下,校验和验证只是间歇性的失败。
在一个示例数据池中,所有校验和都以 cb2848ca0e1ff27202a309408ec76...
开头,因为所有 ~50,000 个文件都是相同的。
尽管有两个文件损坏,但这不是位腐烂或文件完整性损坏。
最有可能的是,这些文件是创建时损坏的,因为在我创建这些文件时cp
遇到了错误的 RAM。这些文件始终 return 58fe24f0e00229e8399dc6668b9...
和 bd85b51065ce5ec31ad7ebf3...
的错误校验和,而其他 49,998 个文件 return 相同的校验和。
这是一个有趣 极其令人沮丧的调试实验。
我创建了一个 ~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
我刚刚创建了这些文件,当我稍后验证它们时,我看到间歇性故障和数据不一致(为了便于阅读,控制台文本 t运行 )
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 的行为相同。我尝试实时启动到另一个 OS。无论如何,我看到了同样的陌生人行为。我还看到 rsync --checksum
这些文件认为校验和错误并重新复制这些文件,即使它们没有更改。
什么可以解释这种行为?由于它在我描述的所有场景中都发生在多个设备上,我怀疑这是有点腐烂。我的内核日志没有显示明显的错误。根据我的故障排除,我认为这是硬件问题,但如何诊断呢?是CPU、主板、RAM吗?
如何解释这种行为? 如何诊断?
根据我的阅读,有许多问题可以解释这种行为。坏磁盘、坏 PSU(电源)、坏 RAM、文件系统问题。
我尝试了以下方法来确定发生了什么。我用不同的...重复了实验
- 磁盘
- 磁盘类型(SDD 与 HDD)
- 外部驱动器(3.5 和 2.5 机箱)
- 闪存驱动器(各种端口上的 USB 2 和 3)
- 文件系统(ext4、vfat (fat32)、xfs、btrfs)
- 不同的 PSU
- 不同OS(实时启动)
似乎没有什么可以解决这个问题。
最后,我 memtest86+ v5.0.1 通过 Ubuntu live USB 进行了尝试。
瞧。它发现内存不好。通过排除过程,我确定我的一根记忆棒坏了,然后整夜测试另一根以确保它处于良好状态。我再次 运行 我的实验,我看到所有文件的校验和一致。
多么微妙的错误。我只是偶然注意到这种不良行为。如果我没有搞乱文件校验和,我想我不会发现这个坏 RAM。
这让我想定期安排一个程序来验证和测试我的 RAM。这个坏记忆棒的后果是我的一些测试数据 最终损坏了 ,但通常情况下,校验和验证只是间歇性的失败。
在一个示例数据池中,所有校验和都以 cb2848ca0e1ff27202a309408ec76...
开头,因为所有 ~50,000 个文件都是相同的。
尽管有两个文件损坏,但这不是位腐烂或文件完整性损坏。
最有可能的是,这些文件是创建时损坏的,因为在我创建这些文件时cp
遇到了错误的 RAM。这些文件始终 return 58fe24f0e00229e8399dc6668b9...
和 bd85b51065ce5ec31ad7ebf3...
的错误校验和,而其他 49,998 个文件 return 相同的校验和。
这是一个有趣 极其令人沮丧的调试实验。