硬盘坏是服务器故障里最"讲道理"的一种——它不像内存那样偶发报错,也不像软件 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
七、坏道的处理与更换决策
发现坏道信号后,怎么决策?给一套经验流程:
Current_Pending_Sector > 0或Offline_Uncorrectable > 0:立即备份数据,安排更换。不要反复读写试图"修复",那会让坏区扩散得更快。Reallocated_Sector_Ct从 0 变为非 0 且持续增长:高度警惕,准备更换。UDMA_CRC_Error_Count > 0:先换 SATA 线缆、检查背板接触,多数情况下换线即好,未必是盘的问题。Spin_Retry_Count > 0、有异响、转速不稳:机械盘进入老化晚期,尽快更换。- 只有
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穿透读取,云盘则无法读取、只能靠快照。 - 出现待处理坏道或重映射持续增长时,先备份再更换,不要反复读写试图修复。
企业QQ咨询




