在CentOS里,坏道的具体位置并不能直接看到,通常只能先用smartctl做一轮健康初筛,重点看S.M.A.R.T.指标,比如Reallocated_Sector_Ct;如果要进一步定位到具体扇区号,就得用badblocks做离线扫描,而且前提是对应分区已经卸载;扫出来之后,再通过e2fsck -l把坏块写进ext文件系统元数据,后续系统才会长期绕开这些区域。需要特别注意的是,SSD不建议使用badblocks,另外,df -h也看不出坏道情况。

CentOS 上无法直接“查看”坏道位置(像看日志一样),只能通过工具检测是否存在坏道,并定位出具体扇区号——关键在于选对工具、分清场景、避免误操作。
smartctl -H 检查磁盘整体健康状态(推荐优先执行)
这是最安全、最快、不影响业务的初筛方式。它不扫描扇区,而是读取硬盘内置的 S.M.A.R.T. 数据,判断是否有硬件级异常(比如 Reallocated_Sector_Ct、Current_Pending_Sector 突增)。
- 先确认设备名:
lsblk或lshw -class disk,找到目标盘如/dev/sda或/dev/nvme0n1 - 检查是否启用 SMART:
sudo smartctl -i /dev/sda,输出含SMART support is: Enabled才有效 - 运行健康评估:
sudo smartctl -H /dev/sda,结果为PASSED不能保证无坏道,但FAILED几乎肯定有物理问题 - 重点看属性值:
sudo smartctl -A /dev/sda,重点关注Reallocated_Sector_Ct(已重映射扇区)、Current_Pending_Sector(待重映射扇区)、UDMA_CRC_Error_Count(线缆/接口问题常导致误报)
badblocks -v 扫描实际坏扇区(必须卸载后离线执行)
这是唯一能给出具体扇区编号(如 2458912)的方法,但代价是磁盘必须未挂载,且耗时极长(TB级盘可能需数小时)。它不依赖 S.M.A.R.T.,直接读写验证每个块。
- 先卸载:
sudo umount /dev/sda1(不是/dev/sda!要卸载分区) - 只读扫描(最常用):
sudo badblocks -v /dev/sda1 > /root/badsectors.txt,-v显示进度,输出是十进制扇区号列表 - 不要用
-w(写测试):会破坏文件系统元数据,除非你准备重做文件系统 - 若磁盘是 LVM 物理卷,需先
pvdisplay确认未被 VG 使用,再sudo pvscan --cache避免冲突 - SSD 上慎用:频繁读写加速磨损,且现代 SSD 的坏块管理由固件接管,
badblocks结果意义有限
e2fsck -c 或 -l 标记坏块(仅限 ext2/3/4 文件系统)
检测出坏扇区后,不能靠人工避开,必须让文件系统知道哪些块不能分配。这步必须在 badblocks 输出后立即执行,且文件系统不能处于挂载状态。
- 假设
badblocks输出存于/root/badsectors.txt,执行:sudo e2fsck -l /root/badsectors.txt /dev/sda1 -c是快捷方式:sudo e2fsck -c /dev/sda1,它会自动调用badblocks并标记,但无法保存扇区列表供后续分析- 标记后,
mkfs.ext4会自动跳过这些块;已有数据不会被迁移,只是新文件不再写入 - XFS 文件系统不支持此机制,只能靠底层 RAID 或存储层屏蔽,或换盘
为什么 df -h 看不出坏道?
df -h 只显示文件系统已用/可用空间,完全不反映物理扇区状态。坏道未被文件系统标记前,内核仍可能尝试读写,导致 I/O 错误、进程卡死、dmesg 中出现 end_request: I/O error —— 这才是更早的预警信号。
真正容易被忽略的是:S.M.A.R.T. 值正常 ≠ 没有坏道(尤其早期坏道未触发重映射),而 badblocks 扫出扇区号后,必须用 e2fsck -l 写入文件系统结构,否则下次格式化就清零了——标记动作本身才是让坏道“生效”的关键一步。