服务器磁盘坏道如何检测

域名注册
域名注册 正式会员超兽战士 👑年卡会员
发布于 2026-10-07 11:57 ·1 浏览 ·0 回复

学完这篇,你能在一台 Linux 服务器上从日志、S.M.A.R.T. 到扇区级扫描,一步步确认磁盘到底有没有坏道、坏在哪、还能不能继续用。

第一步:先从内核日志里找线索

这一步是从系统层面确认「磁盘是不是真的报错了」,做完你能拿到具体的报错设备名和时间点。以 root 登录后执行:

dmesg -T | grep -iE "I/O error|medium error|ata[0-9]+\.|sd[a-z].*error|UNC"

如果看到 ata1.00: exception Emask ...、sd 0:0:0:0: [sda] Unhandled error code、medium error 这类字样,说明内核已经在下层读写时碰到读不出来的扇区,接下来重点查 /dev/sda(按你实际看到的设备名替换)。

注意:dmesg 缓冲区重启后会清空,如果服务器很久没重启但看不到记录,用 journalctl -k --since "7 days ago" | grep -iE "I/O error|ata" 从 systemd 日志里翻。

第二步:用 S.M.A.R.T. 判断盘的健康趋势

这一步是看硬盘自己记录的健康指标,做完你能判断是「偶发一次」还是「正在持续恶化」。没装工具先装:

yum install -y smartmontools    # CentOS / RHEL / Rocky
apt install -y smartmontools    # Ubuntu / Debian

然后查关键属性:

smartctl -a /dev/sda

重点看这 4 个字段:

  • 5 Reallocated_Sector_Ct 重映射扇区数——已经坏掉被备用扇区替换的数量,大于 0 就是已经有坏道了
  • 197 Current_Pending_Sector 待映射扇区数——读不出来的可疑扇区,这个值非 0 基本可以认定有坏道
  • 198 Offline_Uncorrectable 离线无法纠正扇区数
  • 187 Reported_Uncorrect 报告的不可纠正错误数

判断口径:197 或 198 大于 0,立即安排数据备份;5 的数值在几次检查中持续上涨,说明盘在快速劣化,直接准备换盘。

注意:经过 RAID 卡或云厂商虚拟盘的设备,smartctl -a /dev/sda 可能读不到真实物理盘信息,需要加 -d megaraid,0 这类参数走透传,见第五步。

第三步:跑一次 S.M.A.R.T. 长自检(不影响业务)

这一步让硬盘固件自己完整扫一遍盘面,做完你能拿到一份官方检测结果。命令是:

smartctl -t long /dev/sda

长自检 1TB 机械盘通常要 1.5~3 小时,期间业务正常跑。等时间到了看结果:

smartctl -l selftest /dev/sda

输出里 Completed without error 表示通过;出现 Completed: read failure 并给出 LBA 地址,说明那个逻辑块地址就是坏道位置。

第四步:用 badblocks 做扇区级扫描

这一步是真正去读每一个扇区,做完你能拿到坏道的确切块号清单。只读扫描(安全、可在挂载状态下做,但会抢 I/O):

badblocks -sv -b 4096 -o /tmp/badblocks.txt /dev/sda

参数含义:-s 显示进度,-v 输出详情,-b 4096 按 4K 块扫描,-o 把坏块号写入文件。1TB 盘大约 2~6 小时。跑完后 cat /tmp/badblocks.txt 就是坏块列表。

如果只读扫描没发现问题但怀疑读写都有问题,可以试非破坏性读写扫描:

badblocks -nsv -b 4096 /dev/sda

注意:badblocks -w 是破坏性写测试,会清空整块盘数据,只能在已卸载、已备份的盘上用;SSD 跑写测试会大量消耗寿命,不建议。任何写测试前先 umount /dev/sda1。

第五步:RAID 卡后面的物理盘怎么查

这一步解决「系统里只能看到一个逻辑盘、看不到物理坏道」的问题。以常见的 LSI/Broadcom 卡为例,装好 storcli 后执行:

storcli /c0/eall/sall show all | grep -iE "media error|other error|predictive|state"

或者老卡的 MegaCli:

MegaCli -PDList -aALL | grep -iE "Media Error|Other Error|Predictive|Slot"

Media Error Count 大于 0 就是该物理盘出现了坏道,配合 Slot Number 定位到具体盘位。查到后再用透传方式读它的 SMART:

smartctl -a -d megaraid,9 /dev/sda

注意:RAID5/RAID6 下重建阵列时,如果其他盘也有待映射扇区,重建极易失败。发现一块盘有坏道,先检查同组其他盘的 197 值再动手换盘。

第六步:确认坏道后怎么处理

这一步决定是修复还是更换。三种情况:

  1. 偶发单块、197 小于 8 且不再增长:可对已卸载的分区做 e2fsck -c -c /dev/sda1,让文件系统跳过坏块。
  2. 物理重映射:对 ATA 盘可用 hdparm --read-sector 12345678 /dev/sda 确认扇区读失败,再 hdparm --write-sector 12345678 --yes-i-know-what-i-am-doing /dev/sda 触发固件重映射。
  3. 197/198 大于 10 或持续上涨:不要修,直接备份数据、换盘。坏道只会越来越多。

注意:坏道本质是盘片物理损伤,任何「修复」都只是让固件把坏扇区从可用列表里划掉,容量会随之减少,不存在让坏道变好的方法。

小结

  • 排查顺序:dmesg 找报错 → smartctl -a 看 5/197/198 → smartctl -t long 自检 → badblocks 定位块号 → 阵列卡查物理盘。
  • 197 Current_Pending_Sector 非 0,基本等于已有坏道,优先备份。
  • badblocks -w 会毁数据,SSD 别跑写测试。
  • RAID 卡后面的盘必须用 Media Error Count 和 -d megaraid,N 透传才能看到真实状态。
  • 坏道不可逆,数量增长就换盘,别硬修。
版权声明:本文来自 GJ站长论坛《服务器磁盘坏道如何检测》
原文链接:https://www.gj0.com/thread-266.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~