服务器磁盘坏道如何检测
学完这篇,你能在一台 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 值再动手换盘。
第六步:确认坏道后怎么处理
这一步决定是修复还是更换。三种情况:
- 偶发单块、197 小于 8 且不再增长:可对已卸载的分区做
e2fsck -c -c /dev/sda1,让文件系统跳过坏块。 - 物理重映射:对 ATA 盘可用
hdparm --read-sector 12345678 /dev/sda确认扇区读失败,再hdparm --write-sector 12345678 --yes-i-know-what-i-am-doing /dev/sda触发固件重映射。 - 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透传才能看到真实状态。 - 坏道不可逆,数量增长就换盘,别硬修。
原文链接:https://www.gj0.com/thread-266.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。