badblocks仅检测坏块编号,不能直接通知内核;必须卸载分区后用e2fsck -l将坏块注入ext2/3/4文件系统专用inode(如inode 5),才能使后续文件分配自动绕开,XFS/Btrfs不支持该机制。

不能直接“通知内核标记受损扇区”——badblocks本身不修改内核行为,它只输出坏块编号;真正让系统自动避开坏道,必须把结果交给文件系统(如ext4)处理,由其在挂载时主动跳过。整个过程需离线操作,核心是“先检测、再注入、后验证”。
确认设备并安全卸载
误操作可能毁掉整盘数据,务必交叉验证设备名:
- 运行 lsblk -f 查看挂载点和文件系统类型,排除 /、/boot 等正在使用的分区
- 用 sudo fdisk -l 核对容量与型号,确认目标是 /dev/sdb1 而非 /dev/sda
- 若显示“target is busy”,执行 lsof +D /mount/point 找出并终止占用进程
- 根分区等无法在线卸载的,需从 Live USB 启动后再操作
执行非破坏性扫描(-n 模式)
该模式读取原始数据 → 写入测试值 → 立即恢复原内容,全程不改变用户数据,但能暴露写入路径故障:
- 基础命令:sudo badblocks -nsv /dev/sdb1 > /tmp/badblocks_n.txt
- 加 -p 3 可对疑似坏块重试三次,仅三次全失败才记录,大幅降低误报
- 大容量硬盘可加 -c 64 提速;内存紧张时慎用,避免触发 OOM killer
- 建议配合 I/O 降级:ionice -c 3 nice -n 19 sudo badblocks -nsv /dev/sdb1
将坏块注入 ext 文件系统实现自动跳过
e2fsck -l 不是“通知内核”,而是把坏块写入 ext2/3/4 的专用 inode(通常是 inode 5),此后所有文件分配、扩展均由文件系统层绕开:
- 执行:sudo e2fsck -l /tmp/badblocks_n.txt /dev/sdb1
- 若需保留原有坏块记录(比如之前已标记过),加 -k 参数
- 完成后验证:sudo dumpe2fs -h /dev/sdb1 | grep -i "bad",确认 “Bad blocks count” > 0
- 注意:XFS、Btrfs 不支持此机制;SSD 完全不适用 badblocks,应改用 smartctl -a /dev/sdb 查看 Reallocated_Sector_Ct 等指标
补充说明与长期建议
badblocks 是物理层排查工具,不是实时防护手段:
- SMART 监控才是事前预警主力,建议配置 smartd 守护进程自动告警
- 若 smartctl 显示 Current_Pending_Sector 或 Reallocated_Sector_Ct 持续增长,说明硬件损伤加剧,应尽快更换硬盘
- 日常巡检可用只读模式(-sv)扫描已挂载盘,但灵敏度低于 -n 模式
- 破坏性模式(-wsv)会清空全部数据,仅适用于新盘初始化或彻底报废前验证

















