商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > Linux怎么查看磁盘坏道 Linux下badblocks扫描与修复详解

Linux怎么查看磁盘坏道 Linux下badblocks扫描与修复详解

  发布于2026-05-24 阅读(0)

扫一扫,手机访问

Linux怎么查看磁盘坏道 Linux下badblocks扫描与修复详解

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

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

本文转载于:https://www.php.cn/faq/2382968.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注