服务器硬盘SMART报错怎么办?健康状态检测与数据迁移建议

半夜收到一条告警:SMART failure predicted on /dev/sda。你登录上去,业务还在跑,文件能读能写,磁盘空间也正常,于是犹豫了——这块盘真的坏了吗?现在换会不会小题大做?换个角度想:SMART 是硬盘用自己内置的监测电路给出的"体检报告",它是唯一能在数据真正丢失之前给你预警的机制。这份报告要么被你读懂并据此行动,要么在几个月后变成一次无法恢复的数据事故。本文讲清 SMART 各项指标怎么读、哪些数值出现就必须立刻换盘、以及在换盘前如何安全地把数据迁移走。

一、SMART 能做什么、不能做什么

SMART(Self-Monitoring, Analysis and Reporting Technology,自我监测分析与报告技术)是固化在硬盘固件里的一套监测机制。硬盘在运行中持续统计自身的各种物理参数——扇区重映射次数、寻道错误率、通电时长、温度、写入总量等,并以"属性(Attribute)"的形式暴露出来。

它能做的:提前发现介质退化(坏道增多)、机械部件异常、接口错误、温度过高、固态盘寿命耗尽。统计表明相当比例的硬盘故障在发生前,SMART 里就已经有可观测的异常。

它不能做的:SMART 无法预测突然性故障——控制板烧毁、电机卡死、固件 bug,这些可能毫无预兆。所以 SMART 正常不等于不会坏,这也是"SMART 正常就不做备份"这个想法危险的原因。SMART 是风险预警手段,不是保险。

二、环境准备与基础检测

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

# 扫描系统中的 SMART 设备
smartctl --scan

# 查看设备基本信息,确认 SMART 是否可用
smartctl -i /dev/sda

# 若 SMART 未开启,手动开启
smartctl -s on /dev/sda
# 开启离线数据采集(后台自动测试)
smartctl -o on /dev/sda

# 快速健康总评(只看一句话结论)
smartctl -H /dev/sda

smartctl -H 的输出最关键的一行是 SMART overall-health self-assessment test result: PASSED 或 FAILED。出现 FAILED 就意味着硬盘自己判断"我快不行了",这时候不要再有任何侥幸心理。

需要注意的是,-H 只是厂商预设阈值的综合判断,很多早期退化(比如刚开始出现几个重映射扇区)并不会让整体状态变成 FAILED。所以必须看详细的属性值。

2.1 在 RAID 卡后面的盘怎么测

这是运维最容易卡住的地方:服务器前面板插了 4 块盘,但 smartctl /dev/sda 报错说设备不支持 SMART——因为 /dev/sda 是 RAID 卡虚拟出来的逻辑盘,不是物理盘。要用 -d 指定设备类型和通道号。

# MegaRAID / LSI 卡:N 为物理盘通道号(从 0 开始)
smartctl -a -d megaraid,0 /dev/sda
smartctl -a -d megaraid,1 /dev/sda

# SATA 盘挂在 SAS/RAID 卡后面,需要协议转换
smartctl -a -d sat+megaraid,0 /dev/sda

# HP Smart Array(旧版 cciss 驱动)
smartctl -a -d cciss,0 /dev/cciss/c0d0

# NVMe 盘直接用设备名
smartctl -a /dev/nvme0n1

# 循环扫描所有可能的通道号
for i in 0 1 2 3 4 5; do echo "=== slot $i ==="; smartctl -H -d megaraid,$i /dev/sda; done

三、关键 SMART 属性解读

smartctl -a 输出的属性表长这样:ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE。理解每一列是判读的前提:

  • VALUE(当前值):归一化后的健康度,出厂通常从 100 开始递减,降到 THRESH 及以下即判定失败。
  • WORST(最差值):历史上出现过的最差值。它比 VALUE 更能说明"这块盘经历过什么"。
  • THRESH(阈值):厂商设定的失败线。
  • WHEN_FAILED:出现 FAILING_NOW 表示当前已失败;In_the_past 表示历史曾失败过。
  • RAW_VALUE(原始值):真实的物理计数,这是最有价值的一列。比如重映射扇区的实际个数。
ID属性名含义判读标准
5Reallocated_Sector_Ct已重映射扇区数(坏道被备用扇区顶替)RAW 值 > 0 就该警惕;持续增长必须换盘
197Current_Pending_Sector_Ct待映射扇区(读不稳定,等待下次写入决定去留)RAW > 0 即高危,说明已有读不出来的扇区
198Offline_Uncorrectable离线扫描发现无法纠正的扇区RAW > 0 说明数据已可能损坏
199UDMA_CRC_Error_Count接口传输校验错误(线缆/接口问题)增长说明数据线或背板有问题,先换线再判断盘
187Reported_Uncorrectable_Errors无法用硬件 ECC 纠正的错误出现即严重
188Command_Timeout命令超时次数持续增长说明盘响应变慢
194Temperature_Celsius温度持续超过 50℃ 需改善散热;超过 60℃ 明显加速老化
9Power_On_Hours累计通电小时数机械盘超过 3 万小时应重点监控
12Power_Cycle_Count通电次数配合通电时长判断老化程度
202Percent_Lifetime_Remaining固态盘剩余寿命百分比(部分厂商)低于 20% 应计划更换
233Media_Wearout_Indicator固态盘磨损指标VALUE 降到 THRESH 即寿命耗尽
241Total_LBAs_Written累计写入量(LBA 总数)结合盘标称 TBW 估算剩余寿命

不同厂商、不同型号的属性 ID 含义会有出入(尤其是固态盘),判断时以属性名称为准,不要只记 ID。

四、测试命令:short、long 与结果查看

SMART 支持两种自检,区别在于覆盖范围和耗时。

# 查看自检能力与支持的自检时长
smartctl -c /dev/sda

# 短自检(通常 1~2 分钟,检查电路、机械、读性能)
smartctl -t short /dev/sda

# 长自检(全盘扫描,通常几十分钟到数小时,取决于容量)
smartctl -t long /dev/sda

# 查看自检结果
smartctl -l selftest /dev/sda

# 查看错误日志(记录导致命令失败的事件)
smartctl -l error /dev/sda

# 完整信息一次性输出(最常用)
smartctl -a /dev/sda

# 只看属性表
smartctl -A /dev/sda | grep -Ei 'realloc|pending|uncorrect|crc|timeout|temperature|power_on|wearout|percent'

smartctl -l selftest 的结果里,# 1 Short offline Completed without error 是正常;如果显示 Completed: read failure 并带一个 LBA 地址,说明那个逻辑块地址读不出来——这就是明确的坏道位置。

长自检对生产系统有明显性能影响,应在业务低峰期执行。执行期间可以继续对外服务,自检会在后台进行,用 -c 查看剩余进度百分比。

五、判读标准:什么情况必须立即换盘

把上面的指标整理成可执行的判断规则:

  1. smartctl -H 返回 FAILED:立即更换,不要等。
  2. Current_Pending_Sector_Ct 的 RAW 值 > 0:已有扇区读取不稳定,这是数据丢失的直接前兆,立即更换。
  3. Reallocated_Sector_Ct 的 RAW 值在一周内持续增长(比如昨天 12、今天 48):不是"几个坏道"的小问题,而是介质在持续退化,立即更换。
  4. Offline_Uncorrectable > 0:数据已可能损坏,立即更换并从备份校验数据。
  5. 长自检报 read failure:立即更换。
  6. 固态盘 Media_Wearout_Indicator 的 VALUE ≤ THRESH,或剩余寿命低于 10%:写入已达设计上限,计划更换。
  7. 温度长期高于 55℃:先解决散热(清灰、检查风扇、改善风道),温度降下来后再复测其他指标。
  8. UDMA_CRC_Error_Count 增长:先换数据线和背板接口,排除线缆问题后再判断盘本身;这类错误很多时候"坏的不是盘"。

一个重要的观察方法:单点数据没有意义,趋势才有意义。把每周的 smartctl -A 输出保存下来做对比,才能判断某个数值是静止的历史遗留还是正在恶化。很多盘出厂就有少量重映射扇区且此后不再增长,这种可以继续使用但需监控。

六、数据迁移:换盘前的正确操作顺序

确认要换盘后,关键是不要在高负载下做全盘拷贝——一块正在坏掉的盘,高强度读取很可能成为压垮它的最后一根稻草。正确顺序如下。

  1. 先确认有可用备份,并检查备份最近一次成功的时间。没有备份就不要做任何高风险操作,先做备份。
  2. 通知业务方并安排窗口,把该盘上的服务切走或降级。
  3. 用 rsync 迁走文件级数据(首选,只读必要数据,可断点续传):
# 首次迁移:归档模式 + 压缩传输 + 保留硬链接/ACL
rsync -avzHAX --numeric-ids --info=progress2 /data/ /backup/data/

# 增量再同步一次,确保切换前数据一致
rsync -avzHAX --numeric-ids --delete /data/ /backup/data/

# 对坏盘用 ddrescue 做镜像级抢救(跳过坏区、可反复重试)
apt-get install -y gddrescue
ddrescue -f -n /dev/sda /dev/sdb /root/rescue.map      # 第一轮跳过坏区
ddrescue -d -f -r3 /dev/sda /dev/sdb /root/rescue.map  # 第二轮重试坏区 3 次
  1. 如果是阵列成员盘,直接用 mdadm 替换,让阵列自己重建(比手工拷贝更可靠):
mdadm /dev/md0 --fail /dev/sda1
mdadm /dev/md0 --remove /dev/sda1
# 关机换上新盘后
mdadm /dev/md0 --add /dev/sda1
watch -n 5 cat /proc/mdstat
  1. 重建前检查其余成员盘的健康状态:对每块盘跑一次 smartctl -t long,避免重建压力压垮另一块亚健康盘。
  2. 重建完成后校验数据:对比文件数量、关键文件的校验值(sha256sum),确认无误再恢复业务。
  3. 坏盘下线后做安全销毁:含敏感数据的盘按流程消磁或物理销毁,不要直接丢弃。

七、把 SMART 做成常态化监控

别等到收到告警才第一次跑 smartctl。smartmontools 自带守护进程 smartd,可以持续监控并自动发邮件。

# 主配置文件
vim /etc/smartd.conf
# 示例:监控所有设备,出错时发邮件给 root
DEVICESCAN -a -m root@localhost -M exec /usr/share/smartmontools/smartd-runner

# 针对单块盘的自定义告警
/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03) -m ops@example.com

# 启动并设置开机自启
systemctl enable --now smartd

# 先做一次发信测试,确认告警通道可用
smartctl -m root@localhost -M test /dev/sda

-s (S/../.././02|L/../../6/03) 是定时自检表达式:每天 02:00 做短自检,每周六 03:00 做长自检。表达式格式为 T/MM/DD/d/HH,配置时对照文档确认,写错会导致自检不执行。

小结与避坑建议

面对 SMART 报错,正确的心态是:硬盘自己说它不行了,那就真的不行了。SMART 的预警有相当的准确率,而一次误判的代价(换一块盘)远小于一次漏判的代价(数据丢失)。判断依据是"趋势 + 关键项",重点是 Reallocated_Sector_Ct、Current_Pending_Sector_Ct、Offline_Uncorrectable 这三个 RAW 值,以及长自检是否报 read failure。

避坑清单:

  • 只看 smartctl -H 的 PASSED 就放心。整体状态 PASSED 但重映射扇区持续增长的盘,比 FAILED 但数值静止的盘更危险。
  • 把阈值归一化值(VALUE)当成百分比看。VALUE 是递减的,100 是最好,而且是相对刻度,不是"还能用 100%"的意思。
  • 坏盘上跑长自检。长自检是高强度全盘读取,可能加速已经脆弱的盘彻底失效。疑似坏盘应先迁移数据,自检只对健康盘做例行检查。
  • 把 UDMA_CRC 错误当成盘坏了。先换线、换口、清灰,很多时候问题在链路上。
  • 没有告警通道。smartd 配了但邮件发不出去,等于没配。上线后务必用 -M test 验证一次。
  • 换盘后不校验。重建完成不等于数据正确,尤其是源盘本身有坏道时,必须做文件级校验。
  • 忘了保留历史记录。每次巡检把 smartctl -A 输出归档,趋势分析是唯一能提前发现缓慢退化的手段。

最后重申:SMART 只能提前告知风险,真正保护数据的是备份。一套有效的备份(异地、多份、可恢复演练过)才是硬盘故障面前唯一的保险。


本文为存储与硬盘管理系列,SMART 属性名称因厂商与介质类型而异,请以实际输出为准。