我的 HDD 上有文件损坏问题(同一台计算机上的 SDD 工作正常):
for i in {1..10}; do
dd if=/dev/zero of=zeroes_$i.dat bs=512 count=4M
done
md5sum zeroes_*
为某些文件生成正确的校验和 a981130cf2b7e09f4686dc273cf7187e,但通常是另一个文件。grep
确认它在某些文件中找到非零字符。所以这里肯定有一些可疑的地方(基于与另一台计算机交换硬件,我怀疑更多的是控制器而不是磁盘,但这不是这个问题的主题)。这是“可重现的”,因为总是有几个 0_$i.dat 文件的校验和失败。
现在奇怪的是:badblocks -wvs -b 32768 -c 2048
即使测试了 4 个模式后也没有报告错误。什么可能导致坏块无法找到损坏的 IO?让我困惑的是,md5sum
读的内容与dd
所写的内容不同,而badblocks
读回的内容却与所写的内容完全相同。那是从哪里来的呢?
编辑:感谢多米尼克的想法。 IIUC,控制器中可能存在错误的缓存,导致不正确的校验和,而坏块将具有禁用缓存的机制(例如在读回之前写入整个磁盘)并实际测试磁盘而不是控制器,对吗?
答案1
我在编辑中提到的缓存也可能是操作系统管理的缓存,即驻留在 RAM 中的缓存。以下情况也可以解释这些症状:
- 某些具有远地址的 RAM 部分出现故障。操作系统加载在 RAM 的开头,因此不受影响
- 稍后,当向磁盘读取/写入大量数据时,最终会使用所有 RAM,包括有故障的部分
- badblocks 仅使用少量 RAM(不太可能出现故障)并禁用其磁盘 IO 的操作系统缓存,因此不受影响
- 另一方面,md5sum在“读”磁盘时,实际上是在读取操作系统缓存的数据,这有时会出现错误。
因此,对于与我有相同症状的其他读者:运行memtest
。