Linux怎么查看磁盘坏道 Linux下badblocks扫描与修复详解
说到磁盘健康,badblocks 这个工具大家肯定不陌生。但这里有个关键概念必须先厘清:badblocks 本身并不能“修复”坏道,它的核心工作是检测和标记。真正让文件系统绕开这些物理损伤的,是后续的 e2fsck 或 mkfs 命令。理解这个分工,是正确使用它的第一步。 badblocks 检测前

说到磁盘健康,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” 来捕捉早期线索,往往比定期全盘扫描更为高效和及时。


































