smartctl 不能直接修复坏块,它仅读取和报告 SMART 信息;修复需磁盘固件自动重映射或通过写入触发,但前提是扇区未硬故障且有备用空间。

smartctl 能否直接修复坏块
smartctl 本身不修复坏块,它只读取和报告磁盘的 SMART 信息,包括已重映射扇区数(Reallocated_Sector_Ct)、待处理扇区(Current_Pending_Sector)等关键指标。修复动作需由磁盘固件在写入时自动完成(如将数据重定向到备用扇区),或通过底层命令触发重新分配,但前提是扇区尚未被标记为“硬故障”且磁盘仍有备用空间。
常见误操作:运行 smartctl -t long /dev/sda 后以为能“修好”磁盘——这只是一次自检,可能让 pending 扇区暴露并触发重映射,也可能导致 I/O hang 或进一步损坏。
- 真正触发重映射的通常是后续对该扇区的写入操作(例如
dd if=/dev/zero of=/dev/sda bs=512 seek=N count=1 conv=notrunc) - 若
Current_Pending_Sector值 > 0,说明有扇区读取失败但尚未重映射,此时应立即备份数据,避免读取或写入该区域 -
Offline_Uncorrect非零通常意味着离线扫描也未能校验通过,坏块已较严重
如何用 smartctl 判断坏块是否真实存在
仅看 smartctl -a /dev/sda 输出中的数值不够,必须结合状态、日志和实际 I/O 行为交叉验证:
-
SMART overall-health self-assessment test result: PASSED不代表无坏块,只是固件认为当前状态可接受 - 重点检查
Reallocated_Sector_Ct、Current_Pending_Sector、Offline_Uncorrect三项的RAW_VALUE,非VALUE列(后者是归一化值,不可比) - 运行
smartctl -l selftest /dev/sda查看最近自检日志,关注Completed状态及失败 LBA 地址 - 配合
dmesg | grep -i "ata|sd|sector"检查内核是否报过类似end_request: I/O error, dev sda, sector XXXXX的错误
为什么 smartctl -t long 有时卡住或超时
smartctl -t long /dev/sda 触发的是磁盘端全盘扫描,耗时取决于容量与转速(机械盘常需数小时),且期间磁盘响应变慢甚至拒绝其他 I/O。这不是 bug,而是设计行为。
- 执行前确保系统无重要 I/O 负载,最好单用户模式下运行
- 若中途中断(Ctrl+C),部分 硬盘 会保留“aborted”状态,再次运行前建议先查
smartctl -l selftest /dev/sda - NVMe 盘不支持
-t long,应改用smartctl -t vendor,02 /dev/nvme0n1(具体子命令依厂商而定) - 某些 RAID 卡(如 MegaRAID)透传 SMART 有限,
smartctl -d megaraid,0 /dev/sda才能正确获取物理盘数据
发现坏块后该不该继续使用这块盘
只要 Reallocated_Sector_Ct > 0 或 Current_Pending_Sector > 0,这块盘就已进入不可逆老化阶段,不建议用于生产环境或存储关键数据。
- 重映射扇区数持续增长,说明磁介质或磁头正在劣化,不是孤立事件
- 即使当前读写正常,下次通电、温度变化或某次写入都可能引发批量坏块爆发
- SSD 出现
Media_Wearout_Indicator低于阈值或UDMA_CRC_Error_Count上升,同样需立即替换 - 备份完成后,可用
badblocks -wsv /dev/sda进行破坏性检测(仅限空盘),但结果仅作参考,不能替代 SMART 数据趋势分析
坏块从来不是“有没有”的问题,而是“有多少、增长多快、是否可控”的问题。盯着 RAW_VALUE 曲线看三天,比跑十次 smartctl -t short 更有用。