badblocks仅检测不修复,需配合e2fsck -l将坏块列表写入ext2/3/4元数据以实现绕过;-w参数对SSD有害且不适用XFS/Btrfs,生产环境应优先用smartctl评估硬件健康。

badblocks 本身不修复坏块,只负责检测和标记;真正让系统避开坏块,必须配合 e2fsck -l 将坏块列表写入 ext 文件系统元数据。 这不是“修好”物理损伤,而是让文件系统绕开已知不可靠区域——对 ext2/ext3/ext4 有效,XFS/Btrfs/SSD 完全不适用。
确认设备并卸载分区,否则 badblocks 直接报错
运行 badblocks 前,目标设备(如 /dev/sdb1)必须未挂载。内核会拒绝访问正在使用的块设备,错误是 “Device or resource busy”,不是权限问题。
- 用
lsblk -f或mount | grep sdb1查看挂载状态 - 已挂载就执行
sudo umount /dev/sdb1 - 若提示 “target is busy”,用
sudo lsof +D /mount/point找出并 kill 占用进程 - 系统盘(如
/)无法在线卸载,必须从 Live USB 启动后操作
用 badblocks -nsv 做非破坏性检测,别一上来就 -w
-w 是写入测试,会覆盖原始数据,且对 SSD 寿命有损耗,生产环境严禁直接使用。推荐第一步永远是 -nsv:读取 → 写入测试值 → 立即恢复原内容,全程不丢数据。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 命令示例:
sudo badblocks -nsv /dev/sdb1 > /tmp/badblocks_n.txt - 加
-p 3对疑似坏块重试三次,仅三次全失败才记录,降低误报 - 4K 扇区硬盘(绝大多数新 HDD/NVMe)必须加
-b 4096,否则逻辑块与物理扇区错位,导致漏报或假阳性 - 大容量盘可加
-c 64加快速度,但内存紧张时慎用,避免触发 OOM killer
用 e2fsck -l 注入坏块列表,-l 不是数字 1
badblocks 输出的只是文本数字列表(如 30680965),真正起作用的是 e2fsck -l 把这些编号写进 ext 文件系统的坏块 inode(通常是 inode 5)。输错成数字 1(e2fsck -1)会导致静默失败,毫无提示。
- 确保设备已卸载,再执行:
sudo e2fsck -l /tmp/badblocks_n.txt /dev/sdb1 - 验证是否生效:
sudo dumpe2fs -h /dev/sdb1 | grep -i "bad",输出中Bad blocks count应大于 0 - 该机制仅适用于 ext2/ext3/ext4;XFS/Btrfs 需用
xfs_repair或btrfs check,但不支持导入坏块列表
别把 badblocks 当万能药,先看 smartctl
很多“坏块”其实是 SMART 已发现并重映射过的旧问题。直接跑 badblocks 可能白忙活,还掩盖真实风险。
- 先执行
sudo smartctl -a /dev/sdb,重点看:Reallocated_Sector_Ct、Current_Pending_Sector、UDMA_CRC_Error_Count - 若这些值非零且持续增长,说明硬件损伤在恶化,应尽快换盘,标记坏块只是临时缓解
- SSD 没有“坏道”概念,
badblocks -w对 NAND 是无效损耗,优先依赖 SMART 的Media_Wearout_Indicator和厂商工具
最常被忽略的一点:坏块一旦出现,大概率不会孤立存在。badblocks 找到的只是当前可复现的点,而 smartctl 的重映射计数才是判断盘是否该退役的关键指标。

















