淘了块二手硬盘,上机跑个 SMART 一看,"无法纠正的读校验错误"(Uncorrectable Read Error)那一项跳出来十几次。第一反应:这盘坏道不少,不能用了。但先别急着下结论——SMART 里那个计数,未必是真实坏道。
现象
具体表现是:
- SMART 属性里,无法纠正的读校验错误计数显示为十几次(例子中为 11 次);
- 看着像一块"满是坏道"的盘,直觉上该退货;
- 但同一份 SMART 里,重分配扇区计数和待定扇区计数都是 0。
这两组数字自相矛盾:如果真有物理坏道被读出来,重分配或待定计数通常不会还是 0。这个矛盾,就是解开谜题的钥匙。
根因
关键在于,读懂 SMART 不能只看"某一项有多少条错误",要结合计数字段和出错的地址模式一起看。
那块盘报出的"无法纠正读错误",其记录里的 LBA(逻辑块地址)是一个极其整齐的越界地址——恰好等于这块盘的容量边界。这种"整齐得像被人算出来"的地址,是典型的越界访问特征,而不是随机物理损伤的特征。真实的媒体坏道,地址分布通常是零散的、没有规律的。
事情是怎么发生的:某个扫描/检测工具在探测这块盘时,读了超出盘实际容量的扇区(比如按一个比实际大的容量去逐块读)。硬盘固件的反应是:你让我读一个不存在的地址,我读不出来,于是如实回一句"无法纠正的读错误",并把这个 LBA 记进 SMART。这完全是固件的正常行为——它没骗人,那个地址确实读不出来,因为那个地址根本不存在。
但它不会触发坏道的"重分配"流程。重分配是针对"扇区存在、但读不稳"的情况:固件把数据挪到备用区、把坏扇区标记掉并记数。越界地址压根不是一个真实的扇区,没有东西可挪,所以重分配计数保持 0,待定扇区也保持 0。
换句话说:错误记录是真的,但原因是指令越界,不是媒体损伤。这就是假报警。
解决
判断一块盘的"真实健康度",看这几个字段,而不是错误条数:
# 完整 SMART 信息;重点看下面几个属性的原始值(RAW_VALUE)
sudo smartctl -a /dev/sdX
- Reallocated_Sector_Ct(重分配扇区计数):真实坏道被替换的数量。持续增长是最直接的坏盘信号。
- Current_Pending_Sector(待定扇区计数):可疑、待重新读取判定的扇区。非 0 值得警惕。
- Offline_Uncorrectable(离线不可纠正):离线自检时发现的不可纠正错误。
- 无法纠正读错误:要结合上面的计数和 LBA 模式看——如果重分配/待定都是 0、错误地址又整齐地落在容量边界,判为越界假报警。
另外做一次全盘表面自检更有说服力:
# 让盘自己做扩展自检(可能需要数小时)
sudo smartctl -t long /dev/sdX
# 之后看自检结果
sudo smartctl -l selftest /dev/sdX
自检若通过、且重分配/待定计数为 0,说明媒体层面没有实际损伤,这块盘可以正常用。
还有一个二手盘常见的迷惑项:"通电时间很短"未必是好事。一块用了几年的旧盘显示只通电了几十小时,只有两种解释——要么真是长期库存没怎么用,要么是 SMART 被工具清零过。软件层面分不出这两种。能作为旁证的只有盘体标签上的生产日期:生产日期很久远却近乎零通电,就该多留个心眼。
延伸与预防
这条坑的通用价值有两个层面。
第一,读懂计数而不是只看有没有报错。任何监控系统都会产生"看着吓人但不代表故障"的条目。SMART 的多个属性之间有内在逻辑:真实的媒体损伤会同时反映在重分配、待定等计数上;只有错误条数涨、其他计数不动,就要问一句"这些错误是什么性质的"。这跟看日志一样——一条 ERROR 不代表系统坏了,要看它为什么出现、有没有伴随其他信号。
第二,"地址/数值整齐得反常"是重要线索。上面那条越界 LBA "恰好等于容量边界",是典型的"人造"痕迹——真实故障的特征往往是随机的、零散的。遇到数值过于整齐的情况,先想想是不是工具或程序的边界处理出了问题,而不是直接归因于硬件。这个思路在读日志、查偏移、看数据异常时都通用。