谈到磁盘健康状况时,badblocks 这款检测工具大家应该都很熟悉。不过有个核心概念需要率先厘清:badblocks 本身并不具备“修复”坏道的能力,它的主要职责是扫描与标记。真正让文件系统避开这些物理损伤的,是后续配合使用的 e2fsck 或 mkfs 指令。理解这一分工逻辑,是正确运用该工具的第一步。
badblocks 检测前务必卸载设备
只要目标设备(例如 /dev/sda1)仍处于挂载状态,badblocks 就会拒绝执行写入类测试。即便是只读测试,也可能因系统缓存干扰而导致漏检。强行运行时最常见的报错信息是:Device or resource busy。这并非权限不足,而是内核层面的保护机制在起作用。
标准的操作流程应为:
- 先通过
mount | grep sda1确认分区当前挂载状态。 - 如果已挂载,务必先执行
sudo umount /dev/sda1完成卸载。 - 对于系统盘这类无法直接卸载的分区,需借助 Live CD 或 Live USB 环境来操作。
- 此外,SSD 用户需注意:
-w写入测试模式会对 NAND 闪存寿命带来额外损耗,非必要情况下,不建议在生产环境的 SSD 上运行此模式。
谨慎使用 -w 参数:写入测试等同于数据清零
badblocks -w 这个参数影响较大,它会向每个扇区写入特定的测试模式(例如 0x00、0xff),然后再读回校验。此过程会彻底覆盖原有数据,且不可恢复。即便只扫描了部分区域,被扫到的块上所有文件都会受损。
因此,一套安全优先的检测顺序非常关键:
- 首先,执行一次只读检测探路:
sudo badblocks -v -s /dev/sda1。 - 如果命令有输出(即发现了坏块编号),再依据情况决定是否使用
-w参数来强制触发硬盘的重映射机制。 - 在使用
-w之前,必须百分百确认:该分区没有重要数据,或已完成完整备份。 - 需明确,现代硬盘的 G-List(增长缺陷表)重映射通常在写入时自动触发,
-w只是模拟这一动作来暴露问题,并不能“修好”物理损伤。
结果文件如何使用:e2fsck -l 才是关键一步
很多人以为运行完 badblocks 就大功告成,实际并非如此。badblocks 本身不会让文件系统主动避开坏道,它只是把检测到的坏块编号记录到一个文本文件里(例如 badsectors.txt)。真正让这些信息生效的,是后续的 e2fsck 命令。
假设你已经生成了坏块列表:
sudo badblocks -v -o badsectors.txt /dev/sda1
那么接下来必须执行的关键步骤是:
sudo e2fsck -l badsectors.txt /dev/sda1
这里有三个细节值得留意:
e2fsck同样要求设备处于未挂载状态,否则会报错The filesystem is mounted。- 参数
-l是小写字母 L,不是数字 1。输错会导致命令静默失败,坏块依然会被系统使用。 - 如果你的文件系统是 XFS 或 Btrfs,那么
e2fsck就不适用了,需换用对应的工具(例如xfs_repair目前不支持直接导入坏块列表)。
4K 扇区硬盘必须加 -b 4096
这是目前比较容易踩坑的地方。现在绝大多数新机械盘和 NVMe SSD 的物理扇区大小已经是 4096 字节(即 4K),但操作系统为了兼容,默认仍按 512 字节的逻辑扇区来处理。如果不通过 -b 4096 参数明确指定物理扇区大小,badblocks 就会把一个物理扇区错误地当成 8 个逻辑块来检测,结果就是误报或漏报。
如何验证你的硬盘扇区大小?使用这个命令:
sudo fdisk -l /dev/sda | grep “Sector size”
如果输出类似 Sector size (logical/physical): 512 bytes / 4096 bytes,那就说明物理扇区是 4K,必须使用 -b 4096 参数。
一个兼顾物理层匹配与后续处理的常用命令组合如下:
sudo badblocks -v -b 4096 -s -o badsectors.txt /dev/sda1
这个命令既确保了检测基准正确,又生成了可供 e2fsck -l 直接使用的坏块列表文件。
最后,需要建立这样一个认知:坏道检测不应是常规的“体检”项目,而更像是一种“确诊”手段。日常运维中,多关注 SMART 属性告警、系统 I/O 错误日志,或者运行 dmesg | grep -i “ata\|nvme\|error” 来捕捉早期线索,往往比定期全盘扫描更为高效和及时。
