应先查SMART再运行badblocks:Reallocated_Sector_Ct>0或Current_Pending_Sector>0才需扫描;只读扫描用sudo badblocks -b 4096 -s -v /dev/sdX,写验证(-w)会覆数据;标记坏块后须用e2fsck -l配合ext分区,且坏道会蔓延,需持续监控SMART。

先看 SMART,别急着跑 badblocks
坏道不是“扫出来才算有”,而是“SMART 已经在报警了”。很多管理员一发现读写慢或 rsync 反复失败,就直接上 badblocks -w,结果清空数据还漏掉真正隐患。
正确顺序是:先查 smartctl -a /dev/sdX,重点关注两行:
-
Reallocated_Sector_Ct> 0 → 备用扇区已被启用,物理损伤已发生; -
Current_Pending_Sector> 0 → 当前读取不稳、尚未重映射,正是badblocks最该验证的目标。
badblocks 属于过度干预。
只读扫描 vs 写验证:选错模式等于自毁
badblocks 的 -w(写验证)模式会往每个块写入特定模式再读回,彻底验证但**覆盖原始数据**。生产环境绝对禁用,除非你确认盘上无任何有效数据。
日常检测请死守这条命令:sudo badblocks -b 4096 -s -v /dev/sdX > bad-blocks.txt
其中:
-
-b 4096匹配现代磁盘逻辑块大小(避免误报); -
-s -v显示进度和细节,方便中断后定位; - 重定向到文件,为后续
e2fsck -l提供输入。
/dev/sda1),必须卸载或使用只读 Live 环境。否则可能触发内核 I/O 错误甚至 panic。
标记坏块 ≠ 修复硬盘,只是让文件系统绕开它
Linux 不会“修复”物理坏道,只能让 ext2/3/4 文件系统永久避开这些块。核心动作是把 badblocks 输出的块号喂给 e2fsck:sudo e2fsck -l bad-blocks.txt /dev/sdX1
这步操作要求:
- 目标分区必须是 ext 系列(XFS 或 Btrfs 不支持此流程);
- 分区需处于未挂载状态(
umount /dev/sdX1); -
e2fsck会将坏块写入块组描述符的“坏块位图”,此后新建文件绝不会分配到这些位置。
/dev/sdb)而非 LV(如 /dev/mapper/vg-lv),否则标记无效。
别信“修复完成就安全了”,坏道只会蔓延
一次成功标记,不代表问题终结。坏道是物理退化过程的表征,Current_Pending_Sector 数值可能随时间上升,新坏块会持续出现。
必须建立监控闭环:
- 每周用
smartctl -a抽查关键盘; - 对高负载盘(如数据库日志盘)每季度做一次只读
badblocks扫描; - 一旦
Reallocated_Sector_Ct连续增长,立即安排更换,别等 RAID 掉盘。
smartctl 可能无法获取完整 SMART 数据——这时 badblocks -s -v 是唯一可信手段,但务必提前备份。










