badblocks仅检测不修复坏块,必须配合e2fsck -l将坏块列表写入ext文件系统元数据才能真正避开;操作前须卸载分区,4k扇区硬盘需加-b 4096参数,xfs/btrfs不支持该机制。

Linux 中对机械硬盘做坏道检测与修复,核心是区分物理坏道(不可逆)和逻辑错误(可标记跳过),并严格遵循“先检测、再卸载、后处理”的流程。直接在挂载状态下操作极易导致数据损坏或系统崩溃。
确认目标设备与文件系统类型
别急着扫盘,先搞清你要查的是哪块盘、什么格式、是否正在使用:
- 用 lsblk 或 sudo fdisk -l 列出所有磁盘及分区,找到目标设备(如
/dev/sdb1) - 运行 df -T /mount/point 或 findmnt -D /dev/sdb1 查看文件系统类型(ext4/XFS/Btrfs等)
- 执行 mount | grep sdb1 确认是否已挂载;若显示结果,必须先 umount /dev/sdb1
- 系统盘(如
/dev/sda1)无法卸载,需用 Live USB 启动后操作
用 badblocks 扫描物理坏道
这是针对机械硬盘最直接的底层扇区检测方式,推荐只读模式起步:
- 只读扫描(安全):sudo badblocks -sv -b 4096 /dev/sdb1 > badsectors.txt(
-b 4096对准现代4K扇区硬盘,避免误判) - 写入验证(慎用):sudo badblocks -swvp 3 /dev/sdb1 > badsectors.txt(会覆盖原有数据,仅用于全新盘或已备份盘)
- 扫描过程耗时较长,建议后台运行(加
&)或使用screen/tmux - 若输出 “0 bad blocks found”,不代表硬盘健康——badblocks 只查扇区通断,不反映 SMART 隐患
结合文件系统工具标记或修复
扫描出的坏扇区需交由对应文件系统工具处理,不能直接写入设备:
- 对于 ext2/ext3/ext4:sudo e2fsck -l badsectors.txt /dev/sdb1(
-l是小写 L,非数字 1;设备必须未挂载) - e2fsck 会将坏块登记进文件系统坏块 inode,后续自动避开这些区域
- XFS 不支持导入坏块列表,只能靠 sudo xfs_repair -n /dev/sdb1 检查元数据一致性,严重损坏时再 xfs_repair /dev/sdb1
- 若 e2fsck 报 “Group descriptor corrupted” 或找不到 superblock,尝试用 dumpe2fs -h /dev/sdb1 | grep superblock 找备份位置,再 e2fsck -b 32768 /dev/sdb1
用 smartctl 评估硬件健康状态
badblocks 发现的是“已失效”扇区,SMART 才能预警“即将失效”的风险:
- 安装并启用:sudo apt install smartmontools(Debian/Ubuntu)或 sudo yum install smartmontools(RHEL/CentOS)
- 开启 SMART:sudo smartctl -s on /dev/sdb(整块盘,不是分区)
- 查看全量报告:sudo smartctl -a /dev/sdb,重点关注:
- Reallocated_Sector_Ct:已重映射扇区数(>0 就该警惕)
- Current_Pending_Sector:等待重映射的扇区(>0 表示随时可能崩)
- UDMA_CRC_Error_Count:线缆或接口问题(常被忽略但很关键)
- 跑一次短自检:sudo smartctl --test=short /dev/sdb,完成后用 smartctl -l selftest /dev/sdb 查结果











