先看smartctl -H:若返回FAILED或DISK FAILURE IS IMMINENT,立即停写备份;重点盯Reallocated_Sector_Ct、Current_Pending_Sector、Offline_Uncorrect三项RAW_VALUE,任一非零即物理层已出问题。

别急着跑 badblocks,先看 smartctl -H —— 90% 的“疑似坏道”问题,其实在 SMART 状态里早就亮红灯了。直接扫盘不仅慢,还可能掩盖真正要命的硬件衰退信号。
先用 smartctl 看硬盘是否真在恶化
smartctl 不碰数据、不读盘面,5 秒内就能告诉你这块盘值不值得继续用:
- 运行
sudo smartctl -H /dev/sdb,若返回FAILED或DISK FAILURE IS IMMINENT,立刻停写、备份,别再等扫描结果 - 重点盯三项原始值:
Reallocated_Sector_Ct(已重映射扇区)、Current_Pending_Sector(待重映射)、Offline_Uncorrect(离线校验失败)——任一非零,说明物理层已出问题 -
UDMA_CRC_Error_Count持续上涨?大概率是数据线松动或供电不稳,换线/换接口再测,不是硬盘本身坏 - 首次使用前必须开启 SMART:
sudo smartctl -s on /dev/sdb(注意是整块盘,如/dev/sdb,不是分区/dev/sdb1)
只读扫描 badblocks -sv 适合无法卸载的业务盘
当 SMART 没报错但 I/O 延迟突增、日志频繁报 I/O error 时,才考虑 badblocks 辅助定位:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 它能在挂载状态下运行(如
/dev/sdb1正在写入监控日志),但仅检测“完全读不了”的扇区,对偶发性延迟或写失败不敏感 - 务必加
-c 128提高单次读取块数,否则 TB 级机械盘可能扫一整天;加-s显示进度,避免误判卡死 - 命令示例:
sudo badblocks -sv -c 128 /dev/sdb1 > /tmp/badblocks_readonly.log - 若需更高置信度,加
-p 3对初筛坏块重复读三次,三次全失败才记入
e2fsck -l 才真正让 ext4 跳过坏扇区
badblocks 只输出扇区号,不自动屏蔽;真正生效靠 e2fsck -l,且有硬性前提:
- 必须先卸载:
sudo umount /dev/sdb1;若失败,用lsof +D /mount/point找占用进程,别kill -9 - 命令顺序不能颠倒:
sudo e2fsck -l /tmp/badblocks_readonly.log /dev/sdb1(-l是小写 L,不是数字 1) - 该机制仅对
ext2/ext3/ext4有效;XFS和Btrfs不支持导入坏块列表,只能靠xfs_repair -n检查元数据一致性 - 标记后验证是否生效:
sudo dumpe2fs -h /dev/sdb1 | grep -i "block count\|free",总块数应比之前减少
4K 扇区硬盘必须加 -b 4096,否则结果不可信
现代机械硬盘普遍采用 4K 物理扇区,但很多系统仍按传统 512 字节逻辑扇区寻址。错配会导致 badblocks 把正常区域误判为坏块:
- 确认扇区大小:
sudo fdisk -l /dev/sdb查看 “扇区大小(逻辑/物理)” 行,若显示 “512 字节 / 4096 字节”,就必须加-b 4096 - 正确命令:
sudo badblocks -sv -b 4096 /dev/sdb1 > badsectors.txt - 不加参数默认用 1024 字节块,对 4K 盘等效于跨扇区读取,结果完全失真
- 系统盘(如
/dev/sda1)无法卸载时,必须用 Live USB 启动后再操作,否则e2fsck -l会拒绝执行
坏块不是 bug,是硬件老化的自然现象。关键不是“扫出来多少”,而是“SMART 是否提前预警”“坏块是否集中在某段物理区域”“文件系统能否稳定绕过”。一旦 Current_Pending_Sector 持续增长,或 badblocks 在同一区域反复报错,这块盘就该退役了——标记只是临时止血,不是续命。

















