
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 可保留原有坏块信息不覆盖。
该操作本质是把坏扇区对应的逻辑块加入文件系统的“禁用列表”,后续 mkfs.ext4 或 e2fsck 都会避开它们。但注意:这仅对 ext2/3/4 有效,XFS、Btrfs 不支持此机制。
- 运行前确保分区已卸载,否则
e2fsck会拒绝执行 -
-c默认做只读测试,如需写入式验证(更准但有风险),改用-cc,仅限离线环境且确认无重要数据 - 标记后的坏块不会自动修复,只是被跳过;若坏道蔓延,文件系统最终仍会因元数据损坏而崩溃
RAID1 中单盘坏道不一定触发降级,但必须手动检查同步状态
RAID1 镜像不会因一块盘出现少量坏道就自动降级,但读取时若主盘返回 I/O 错误,mdadm 会尝试从副本盘读,并记录 mdstat 中的 recovery 或 resync 进度。此时表面正常,实则已存在数据不一致风险。
关键动作是运行 echo check > /sys/block/md0/md/state 触发全盘校验,并检查 /proc/mdstat 是否出现 (F)(failed device)或 (S)(spare)。同时用 mdadm --examine /dev/sdX 对比两块盘的事件计数(Event Count),若相差超过 1,说明同步异常。
- 不要依赖 RAID 自动修复:坏道发生在写入路径时,可能只写入了其中一块盘,另一块保持旧数据
- 校验过程本身会加重磁盘负载,老旧硬盘可能在校验中彻底失效,建议先备份再操作
- 一旦确认某盘有坏道,即使 RAID 仍“active”,也应尽快替换,而不是等它完全宕机
end_request: I/O error 或 ataN.00: failed command: READ FPDMA QUEUED —— 遇到这种日志,别急着换盘,先查电源和线缆,再做整机压力复现。










