服务器硬盘SMART信息怎么看?坏道预警与健康状态检测教程

硬盘坏是服务器故障里最"讲道理"的一种——它不像内存那样偶发报错,也不像软件 Bug 那样难以复现,而是一块盘在彻底失效前,几乎都会留下大量可读的信号。问题在于,多数人平时不看不查,等 dmesg 开始刷 I/O error、文件系统变只读、RAID 掉盘的时候才发现,那时候往往已经晚了,只能在业务中断的慌乱中做数据抢救。

SMART(Self-Monitoring, Analysis and Reporting Technology,自我监测分析与报告技术)就是硬盘自带的"体检报告"。它由盘内的固件持续记录运行状态:读写出错次数、坏道重映射情况、通电时长、温度、寻道失败等几十项指标。学会读懂 SMART,就能在一块盘还"能用"的时候提前发现它在走下坡路,从而在业务无感的情况下把盘换掉。

这篇文章会讲清楚:SMART 是什么、怎么在 Linux 上安装工具并读取、哪些属性是"必须盯"的关键指标、怎么区分"健康""预警""濒危"三种状态、怎么用 smartd 做自动监控和告警,以及几种特殊情况(RAID 卡后的盘、NVMe、虚拟磁盘)该怎么处理。读完后你应该能建立一套"定期体检 + 异常告警"的硬盘健康管理习惯。

需要先明确一个观念:SMART 不能预测所有故障。它擅长发现"渐进式劣化"(坏道增多、机械老化),但对"突然死亡"(电路烧毁、固件崩溃、剧烈震动)无能为力。所以 SMART 是"必要不充分"的手段,必须配合 RAID、备份一起用。

一、安装工具与读取 SMART 信息

读取 SMART 靠 smartmontools 套件,里面的两个命令是 smartctl(手动查看)和 smartd(后台守护进程)。几乎所有发行版都自带或可从官方源安装:

# RHEL/CentOS/Rocky/AlmaLinux:
sudo yum install -y smartmontools
# 新版用 dnf:
sudo dnf install -y smartmontools

# Debian/Ubuntu:
sudo apt update && sudo apt install -y smartmontools

# Fedora:
sudo dnf install -y smartmontools

装完先确认盘有没有"暴露"SMART,以及能否读取:

# 列出所有驱动器及其 SMART 能力
sudo smartctl --scan

# 总体健康状态(最常用的一条)
sudo smartctl -H /dev/sda

# 完整信息:型号、序列号、容量、固件版本 + 全部属性
sudo smartctl -i -a /dev/sda
sudo smartctl -a /dev/sda

smartctl -H /dev/sda 的输出通常长这样:

SMART overall-health self-assessment test result: PASSED

PASSED 表示固件自评通过,FAILED 表示固件已经判定盘处于故障状态,后者基本可以立即安排更换并抢救数据。但要注意:PASSED 不等于百分百健康,很多盘在报 PASSED 的同时,某些属性已经严重超标。所以真正的功夫在下面的属性表里。

二、必须盯住的几个关键属性

smartctl -a 的输出会有一大张属性表。新手看到几十行容易晕,其实只需重点看下面几项(不同品牌编号略有差异,以名称和 ID 双重确认):

属性 ID 名称 含义 危险信号(经验值)
5 Reallocated_Sector_Ct 已重映射扇区数 从 0 开始增大,持续增长
187 Reported_Uncorrect 无法纠正的错误数 大于 0 且增长
188 Command_Timeout 命令超时次数 明显大于 0
196 Reallocated_Event_Count 重映射事件数 与 5 同步增长
197 Current_Pending_Sector 待处理(读不出)扇区 大于 0,最危险
198 Offline_Uncorrectable 离线不可纠正扇区 大于 0
199 UDMA_CRC_Error_Count 传输层 CRC 错误 大于 0 通常是线缆问题
9 Power_On_Hours 通电小时数 参考老化程度
194 Temperature_Celsius 温度 长期 >50℃ 需关注
10 Spin_Retry_Count 主轴重试次数 大于 0,机械老化
4 Start_Stop_Count 启停次数 机械磨损参考

最关键的两个是 197(Current_Pending_Sector)和 5(Reallocated_Sector_Ct)。

  • Current_Pending_Sector 大于 0,意味着有扇区当前读不出来,盘还在尝试挽救。这是"坏道已经出现"的最直接证据。一旦这个值大于 0,第一优先级是备份数据,而不是反复读写尝试。
  • Reallocated_Sector_Ct 表示盘已经把坏扇区用备用扇区替换掉了。等于 0 最好;小数值且稳定可以观察;持续增长说明坏区在扩散。
  • UDMA_CRC_Error_Count 大于 0 有意思——它往往不是盘的错,而是 SATA 线缆或接触不良。遇到这个值升高,先换线缆、检查背板,而不是急着换盘。

解读时要连同"原始值(RAW_VALUE)"一起看。有些品牌(如希捷)的 RAW_VALUE 是编码过的数字,看起来很大但不代表有问题,这时应看"标准化值(VALUE)"和"最差值(WORST)"以及"阈值(THRESH)"的关系:VALUE 一旦接近 THRESH,就接近告警线。

三、跑一次自检:短测与长测

除了读属性,SMART 还支持主动自检:

# 短自检:几秒钟到几分钟,检查盘体电路和关键机械部分
sudo smartctl -t short /dev/sda

# 长自检:可能几十分钟到几小时,全盘扇区扫描,能发现坏道
sudo smartctl -t long /dev/sda

# 查看自检进度和结果
sudo smartctl -l selftest /dev/sda
sudo smartctl -a /dev/sda | grep -A 10 "Self-test"

长自检的结果里,Completed without error 是最理想的;出现 Completed: read failure 说明碰到了读不出的扇区,对应上面的 Current_Pending_Sector。注意:长自检会占用 I/O 带宽,生产环境建议在低峰期跑,或对 RAID 中一块盘分批跑。

四、NVMe 盘的 SMAT 读取

NVMe 盘不叫 SMART 属性表,而是通过 NVMe 协议暴露日志页,用 nvme-cli 读取:

# 安装
sudo yum install -y nvme-cli        # RHEL/CentOS/Rocky
sudo apt update && sudo apt install -y nvme-cli   # Debian/Ubuntu

# 查看健康日志
sudo nvme smart-log /dev/nvme0

# 也可用 smartctl 读 NVMe
sudo smartctl -a -d nvme /dev/nvme0

nvme smart-log 输出的关键字段:

  • critical_warning:非 0 表示有严重问题(温度、可靠性、可用备用空间等)。
  • percentage_used:已消耗的寿命百分比,厂商依耐久度估算,越接近 100% 越危险。
  • media_errors:介质错误计数,大于 0 要关注。
  • available_spare / available_spare_threshold:可用备用块,低于阈值会触发告警。
  • temperature:温度,NVMe 高性能盘高温降速很常见。
  • data_units_written:累计写入量,用来估算是否已超 TBW。

五、用 smartd 做自动监控与告警

手动查只能覆盖"你想起来查的时候",真正靠谱的做法是让系统自动盯着:

# 1. 编辑配置
sudo vi /etc/smartd.conf

# 常见配置示例(注释掉默认的 DEVICESCAN,改用显式配置)
# 监控所有盘,自检、邮件告警
# /dev/sda -a -o on -S on -s (S/../.././02|L/../../7/03) -m root -M exec /usr/libexec/smartmontools/smartd-runner
# /dev/sdb -a -o on -S on -s (S/../.././02|L/../../7/03) -m admin@example.com

# 2. 启用并启动服务
sudo systemctl enable --now smartd
sudo systemctl status smartd

# 3. 查看 smartd 日志
sudo journalctl -u smartd -n 50
sudo tail -f /var/log/syslog | grep smartd      # Debian/Ubuntu
sudo tail -f /var/log/messages | grep smartd    # RHEL/CentOS/Rocky

配置里的 -s 定义自检计划:(S/../.././02|L/../../7/03) 表示"短自检每天凌晨 2 点、长自检每周日 3 点"。-m 指定告警邮箱,-M exec 可以挂一个脚本,把告警接到企业微信、钉钉或监控系统。

告警接入监控系统更实用:smartd 的邮件在很多环境里容易被淹没。更稳的做法是把 smartctl -H 和关键属性的值采集到 Prometheus(用 node_exporter 的 textfile collector)或 Zabbix,设置"任一危险属性 > 0"或"percentage_used > 80%"就告警。

六、RAID 卡后的硬盘和虚拟磁盘怎么读

硬件 RAID 场景:盘接在 RAID 卡后面时,smartctl -a /dev/sda 看到的是"逻辑盘"而非物理盘。要给 smartctl 指定 -d 参数穿透到物理盘:

# 常见 RAID 控制器的设备类型(不同厂商不同)
sudo smartctl -a -d megaraid,0 /dev/sda    # LSI/Broadcom MegaRAID,第 0 块物理盘
sudo smartctl -a -d megaraid,1 /dev/sda
sudo smartctl -a -d sat+megaraid,0 /dev/sda

# 3ware 控制器
sudo smartctl -a -d 3ware,0 /dev/twa0

# 先用 --scan 看工具识别到了什么
sudo smartctl --scan
sudo smartctl -d help | head -40          # 列出支持的 -d 类型

也可以直接看 RAID 卡自己的工具输出,比如 MegaRAID 的 storcli/perccli,它能给出每块物理盘的状态、介质错误、预测性故障——这些信息比单个 SMART 属性更贴近"能不能继续用"的结论。

云服务器 / 虚拟磁盘:绝大多数云盘是虚拟块设备,透传不了真实物理盘的 SMART。smartctl 通常会报 SMART support is: Unavailable。这类环境只能依赖云厂商的盘健康监控和快照备份,自身无法采集。

USB 转接的盘:可能需要 -d sat:

sudo smartctl -a -d sat /dev/sdb

七、坏道的处理与更换决策

发现坏道信号后,怎么决策?给一套经验流程:

  1. Current_Pending_Sector > 0 或 Offline_Uncorrectable > 0:立即备份数据,安排更换。不要反复读写试图"修复",那会让坏区扩散得更快。
  2. Reallocated_Sector_Ct 从 0 变为非 0 且持续增长:高度警惕,准备更换。
  3. UDMA_CRC_Error_Count > 0:先换 SATA 线缆、检查背板接触,多数情况下换线即好,未必是盘的问题。
  4. Spin_Retry_Count > 0、有异响、转速不稳:机械盘进入老化晚期,尽快更换。
  5. 只有 Power_On_Hours 很大但其余属性正常:可以用,但要加强备份频率,属于"老但健康"。

对 RAID 中的盘,更换前要确认 RAID 级别和重建策略:RAID 1/5/6/10 支持热插拔更换并重建;重建过程会给剩余盘带来额外压力,老盘阵列重建期间还有掉第二块盘的风险,应提前备份关键数据。

风险提示:本文涉及更换硬盘、重建 RAID 等操作。拔盘前务必确认 RAID 级别、确认对应槽位、并在业务低峰进行。RAID 0 和单盘没有任何冗余,拔盘即丢数据。回滚方式:更换后重建完成即恢复冗余,但若重建中途再坏一块盘,数据将无法恢复,所以重建前必须有可用备份。

八、建立一套可执行的体检制度

最后给一套落地的做法:

  • 每天:smartd 后台采集,监控系统每日上报关键属性。
  • 每周:跑一次长自检(错峰、逐盘),记录结果变化。
  • 每月:人工复查一遍属性表的趋势,特别是重映射、待处理扇区、CRC 错误。
  • 每次维护:换线、加盘、动过机箱后,重新跑一次 smartctl -H 确认没被动出问题。
  • 新盘上线前:先做一次 badblocks 或长自检,避免装上一块"开箱即坏"的盘。

常见问题

Q1:smartctl -H 显示 PASSED 就万事大吉吗?
不是。PASSED 只代表固件自评通过,Current_Pending_Sector、Reallocated_Sector_Ct 等属性仍可能已经异常。必须看属性表。

Q2:Current_Pending_Sector 大于 0 能修吗?
通常不能"修好",但可以通过全盘写入尝试触发重映射(把坏扇区替换出去),这会暂时让该值归零,但盘已经证实有缺陷,仍应安排更换。更稳妥的是立刻备份。

Q3:SSD 的 SMART 和机械盘一样吗?
不完全一样。SSD 关注的是写入量(TBW/LBA written)、磨损均衡、备用块、percentage_used;机械盘关注重映射、寻道、主轴。名称和阈值都要按盘型理解。

Q4:为什么云服务器的盘读不出 SMART?
因为云盘是虚拟块设备,物理盘的 SMART 不上报给实例。只能依靠云厂商的监控和快照。

Q5:SMART 报警后一定要马上换盘吗?
看指标。Current_Pending_Sector、Offline_Uncorrectable 或 critical_warning 非 0 建议立即换;单纯 CRC 错误、温度偏高可先排查线缆和散热。原则是"危险指标一旦出现就备份,换盘不拖延"。

总结

  • SMART 是硬盘自带体检报告,能提前暴露大部分渐进式故障,是运维的基本功。
  • 重点盯住 Current_Pending_Sector、Reallocated_Sector_Ct、Offline_Uncorrectable 和 UDMA_CRC_Error_Count 四个属性。
  • NVMe 盘用 nvme smart-log 看 percentage_used、media_errors、available_spare 和温度。
  • 用 smartd + 监控系统做自动采集告警,别依赖"想起来才查"。
  • RAID 卡后的物理盘要用 smartctl -d megaraid,N 穿透读取,云盘则无法读取、只能靠快照。
  • 出现待处理坏道或重映射持续增长时,先备份再更换,不要反复读写试图修复。