badblocks 扫描前必须关机或卸载分区
直接在挂载的文件系统上运行 badblocks 可能导致误报,甚至破坏数据一致性。Linux 内核缓存和文件系统元数据操作会让磁盘处于“活跃”状态,而 badblocks 的底层读写会与之冲突。
正确做法是:从 Live USB 启动,或先卸载目标分区(如 umount /dev/sdb1),再执行扫描。若无法卸载(比如根分区),只能用只读模式初步筛查:badblocks -n -v /dev/sdb1(-n 表示非破坏性读写测试,但仍建议离线操作)。
- 对 SSD 不推荐使用
badblocks,其磨损均衡机制会让物理地址映射失效,结果无意义 -
-c 64可提升扫描效率(每次读取 64 个块),但需确保内存充足,否则可能触发 OOM killer - 扫描耗时极长(TB 级硬盘常需数小时),建议加
-s显示进度,避免误判为卡死
smartctl 输出中重点关注 Reallocated_Sector_Ct 和 Current_Pending_Sector
smartctl -a /dev/sda 的输出里,这两个值非零就说明磁盘已出现不可逆硬件缺陷。前者表示坏扇区已被控制器替换,后者表示有扇区读取失败、尚未重映射——后者更危险,因为下次访问可能直接超时或 I/O 错误。
注意区分“自检通过”和“SMART 状态正常”:有些盘即使 SMART overall-health self-assessment test result: PASSED,但 Reallocated_Sector_Ct 已增长,说明问题正在发生,只是还没到阈值。
- 厂商自定义属性名可能不同(如 WD 用
Reallocation_Event_Count),需结合smartctl -x /dev/sda查看原始值 - 如果
Current_Pending_Sector持续增加,哪怕只有 1~2 个,也应立即备份并更换磁盘 -
UDMA_CRC_Error_Count高通常指向线缆或接口接触不良,不是盘本身坏道,别误判
ext4 文件系统下用 e2fsck 标记坏块并跳过使用
发现坏道后,不能只靠硬件层重映射。Linux 文件系统需要知道哪些逻辑块不可用,否则仍可能分配给新文件。用 e2fsck -c /dev/sdb1 可调用 badblocks 并将结果写入 ext4 的坏块 inode 中;加 -k 可保留原有坏块信息不覆盖。