ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SSD SMART信息解读:用smartctl监控寿命与故障预警

SSD SMART信息解读:用smartctl监控寿命与故障预警

1. 为什么SSD的SMART比机械硬盘更值得盯紧

1.1 SMART不是“寿命预测器”,而是一块“仪表盘”

一块硬盘什么时候会坏?这个问题如果让我用一个词来回答,那就是——说不准。但“说不准”不代表没办法,SMART信息就是目前我们手里最有价值的那块“仪表盘”。SMART的全称是Self-Monitoring, Analysis and Reporting Technology,自监控、分析和报告技术。说白了,硬盘在运行过程中会自己记录一堆运行健康指标,主机端的工具(比如smartmontools)通过标准的ATA/SATA/NVMe协议把这些指标读出来,再根据预设的阈值判断盘还能不能继续干。

很多人有一个误解,以为SMART能像算命一样提前告诉你“这块盘还能活三个月”。不是这样的。SMART能告诉你的是:这块盘在过去的时间里都经历了什么——写入量多大、温度多高、有没有发生过不可纠正的错误、备用块消耗了多少。你通过这些历史数据的趋势,去推断它还能不能撑住未来的工作负载。它更像汽车仪表盘上的水温表和机油灯,而不是一个“剩余寿命百分比”的预言。

在机械硬盘时代,SMART的价值就很明显。磁头、电机、碟片这些机械部件有磨损规律,坏道也是慢慢扩大的。很多时候SMART的Reallocated Sector Count(重映射扇区数)从0跳到几百时,就已经在给你先行示警了。到了SSD时代,情况变得更复杂:NAND闪存不像机械盘那样会“异响”,它往往没有渐进式的预兆,可能今天一切正常,明天直接掉盘。也正因如此,SSD的SMART信息比机械硬盘更需要仔细看、定期看,而且要看对重点。

1.2 SSD的故障到底藏在哪里

SSD和HDD的内部结构完全不同。HDD的数据存在旋转碟片上,读写靠磁头,是机械运动;而SSD的数据存在NAND闪存芯片里,读写靠主控芯片控制,纯粹是电子操作。所以机械硬盘的故障点在于“动”的东西:磁头卡死、电机磨损、碟片划伤;而SSD的故障点在于“写”的行为:NAND闪存的每个存储单元是有擦写次数上限的,写多了就会磨损,磨损到一定程度,这个单元就存不住电荷了,数据就会丢。

换句话说,SSD的寿命和你“写了多少数据”直接挂钩,而不是和“通电多久”挂钩。这就导致了一个现象:一块用了五年但每天只写几十GB的SSD,可能比一块只用了一年但天天跑大模型训练数据集的SSD还要健康。你如果不看SMART里的累计写入量和磨损均衡相关的指标,光凭直觉判断“用了多久该换盘了”,大概率会踩坑。

此外,SSD还有一个HDD没有的大坑——异常断电。HDD断电顶多是缓存里的数据没写进去,开机后系统能感知到文件系统不一致,然后通过日志恢复。但SSD断电时,如果主控正好在更新地址映射表或者垃圾回收,就可能导致映射关系损坏,轻则某些块变成只读,重则整个盘“失踪”。这也是为什么服务器级的SSD都带掉电保护电容,而消费级的盘在频繁意外断电后,SMART里的Unsafe Shutdowns计数会不断上升——这个数字,比通电次数更值得你注意。

1.3 三张表看清HDD、SATA SSD、NVMe SSD的指标差异

这里有个必须提前说的概念:SSD内部又分成SATA接口的和NVMe接口的,它们读SMART的方式和属性集完全不一样。SATA SSD沿用了机械硬盘的ATA SMART属性框架,ID号和属性名大多是通用的;而NVMe SSD用的是NVMe规范自己定义的一套日志和统计信息,字段名和单位都换了。很多新手拿SATA时代学到的“看C5待重映射扇区数”去套NVMe盘,结果发现根本没有这个属性,于是直接懵了。

关注点机械硬盘(HDD)SATA SSDNVMe SSD
物理磨损05 重映射扇区数177 磨损均衡次数Percentage Used 已用寿命百分比
坏块/不可读C5 待重映射扇区187 不可纠正错误Media Errors 媒体错误
写入损耗不怎么看累计写量241 Total LBAs WrittenData Units Written
接口通信异常C7 UDMA CRC错误199 UDMA CRC错误PCIe AER日志
异常断电12 通电次数12 通电次数/断电Unsafe Shutdowns

机械盘的“重映射扇区数”是核心中的核心——磁头读到坏道时,盘片内部会把坏扇区替换成备用扇区,这个替换次数一旦开始涨,基本就说明物理损伤在扩散。SATA SSD虽然也有类似字段,但主控内部的磨损均衡本来就是常态操作,偶尔出现几个重映射块不用大惊小怪,关键是看“持续增长”。NVMe盘则直接换了一套逻辑,用百分比告诉你寿命消耗了多少、备用块还剩多少,简单粗暴但很实用。

2. 用smartmontools快速读取SSD的SMART信息

2.1 安装smartmontools:Debian系与RedHat系的一行命令

smartmontools是所有Linux运维和存储工作者的老朋友了。它主要由两个工具组成:smartctl负责读取和操作SMART信息,smartd负责后台守护进程监控。几乎所有主流发行版都把它打好了包,安装不需要纠结。

Debian/Ubuntu这类系统:

apt update apt install smartmontools

RedHat系,包括CentOS、Rocky、AlmaLinux这些:

dnf install smartmontools

装完之后顺手验证一下版本:smartctl -V。这里要特别提醒一句:smartmontools对NVMe的原生支持是从7.0版本开始成熟起来的,如果你的系统还是6.x,读NVMe盘可能会报“Device is not supported”或者读不到完整的字段信息。遇到这种情况,优先考虑给系统做一次大的版本升级,而不是强行在旧版本上折腾。很多老系统的软件源里默认版本很旧,升级一次会舒服很多。

2.2 第一步先确认设备节点

拿到一台机器,不要急着直接对/dev/sda跑smartctl,先看看实际有几块盘、每块盘的型号和挂载路径是什么。最常用的两个命令:

lsblk lsscsi

lsblk可以看到块设备的层级关系,比如哪块盘分成了几个分区、挂载在哪;lsscsi则能看到SCSI/SATA设备列表和它们的型号。确认设备节点目的是防止看错盘——尤其是服务器上十几块盘长得一模一样的时候,对错盘号是一件让人崩溃的事。

需要注意的是,SATA盘对应的设备节点一般是/dev/sda、/dev/sdb这种,而NVMe盘则不同。NVMe SSD的设备节点是/dev/nvme0n1这种,其中nvme0是控制器节点,nvme0n1是命名空间节点。用smartctl读NVMe信息时,我的习惯是直接对控制器节点操作,也就是smartctl -a /dev/nvme0,这样信息最完整、最省心。

2.3 核心命令:-s on、-H、-a、-x

一套标准的SATA SSD体检流程,大概是这样的:

先开启SMART支持(很多盘默认已经开启了,但开机执行一次没有坏处):

smartctl -s on /dev/sda

再看一眼整体的健康状态:

smartctl -H /dev/sda

然后看详细的属性表:

smartctl -a /dev/sda

如果还想要更多信息,包括厂商自己的日志、错误日志、温度历史等,就用扩展模式:

smartctl -x /dev/sda

对于NVMe盘,不需要单独开启SMART,直接看:

smartctl -a /dev/nvme0

这套组合拳打完,你就能看到SMART overall-health self-assessment test result这一行。如果显示PASSED,说明该盘所有Pre-fail关键属性的当前值都还在阈值之上;如果显示FAILED,基本上这块盘已经不适合继续承担重要业务了。不过这里要说个反直觉的点:PASSED不代表绝对安全,它只是说“当前读到的数值没有超过预设临界值”。很多SSD在突发故障前,SMART整体状态依然可能是PASSED,所以它只能作为参考中的参考。

2.4 值得记住的常用命令清单

我用过的smartctl参数里,真正高频的就那么几个,整理成一张表方便查阅:

命令作用使用场景
smartctl -s on /dev/sda启用SMART功能新接盘时执行
smartctl -H /dev/sda查看整体健康状态日常快速巡检
smartctl -a /dev/sda查看所有SMART属性详细体检
smartctl -x /dev/sda查看所有信息(含日志)排查复杂问题时
smartctl -t short /dev/sda执行短自检疑似故障时确认
smartctl -l selftest /dev/sda查看自检历史记录自检后查看结果
smartctl --json -a /dev/sdaJSON格式输出脚本化监控

关于-t short自检,我建议在盘已经出现明显异常时再跑,而不是没事就全盘自检一遍。因为自检过程会占用主控资源和内部带宽,虽然短自检对闪存的影响可以忽略,但在业务高峰时期对NVMe盘做长时间自检,确实会遇到IO延迟波动。我一般只在怀疑盘有问题、或者刚部署完新盘想快速验证一遍时才跑自检。

3. SSD关键SMART属性逐项拆解:从寿命到异常断电

3.1 SATA SSD的四类关键属性

第一次看SATA SSD的smartctl -a输出,一堆两位数的属性ID和英文名会让你眼花缭乱。但其实不需要全都理解,真正值得我花时间盯着的只有四类:磨损寿命类、累计读写量、错误可靠性、以及温度和异常状态。

磨损寿命类,重点看这几个:

  • 177 Wear_Leveling_Count:磨损均衡的次数。主控为了让所有NAND块写入次数尽量平均,会不断搬移数据,这个值就是搬运次数。它本身不直接代表剩余寿命,但趋势很重要——数值增长突然变快,说明垃圾回收压力很大。
  • 181 Program_Fail_Count 和 182 Erase_Fail_Count:编程失败和擦除失败次数。这两个数值如果从0变成非0,或者持续增长,说明NAND里已经有块彻底写不进去了,这是硬件层级的硬故障信号,要非常警惕。
  • 231 SSD_Life_Left(厂商自定义):很多厂商用这个属性返回剩余寿命百分比,一般从100往下掉。注意不同厂商对这个字段的原始值定义不一样,有的直接显示百分比,有的显示的是磨损次数,最好结合厂商文档确认。

累计读写量:

  • 241 Total_LBAs_Written 和 242 Total_LBAs_Read:这个就是累计写入的LBA(逻辑块地址)数量。每个LBA是512字节,所以总写入字节数 = 原始值 × 512。举个例子,如果241的RAW值是10000000,那一共写了约5.12GB数据。通过这个字段,你可以算出这块盘目前的写入量离它标称的TBW(总写入字节数)还剩多少余量。

错误可靠性:

  • 187 Reported_Uncorrectable_Errors:无法纠正的错误。这个数值只要有增长,就说明盘已经遇到了读不出来的数据,而且ECC都救不回来。这是SATA SSD上最需要警惕的字段之一。
  • 195 Hardware_ECC_Recovered:硬件ECC纠错次数。NAND闪存的电荷会随时间和温度逐渐流失,所以读数据时靠ECC纠错是很正常的。但如果这个数字增长很猛,说明闪存单元已经不太稳定了。
  • 184 End-to-End_Error:端到端数据通路错误,涉及到盘内数据传输的一致性。非0就值得关注。

温度和异常:

  • 194 Temperature_Celsius:注意这里显示的数值就是当前温度值,很多盘同时记录了Min/Max。持续高温会加速NAND的电荷流失,一般SSD长期在70℃以上就要考虑散热了。
  • 199 Ultra_DMA_CRC_Error_Count:SATA线与盘之间数据传输的CRC错误次数。这个数值上升,绝大多数情况下不是盘本身的问题,而是SATA线接触不良、电源供电不稳、或者线缆质量差。换根线、换一个接口插,往往就能解决。

3.2 NVMe SSD的专属属性

NVMe盘读出来的信息是另一种风格。举个例子,smartctl -a /dev/nvme0的输出里通常会包含这些字段:

  • Percentage Used:已用寿命百分比。这是对普通用户最直观的一个数字,3就表示差不多消耗了3%的寿命。厂商按标称TBW和实际写入量给你算出来的参考值。注意它到100%不代表立刻就会坏,只是说这块盘已经达到了标称的保修写入量,继续用风险自负。
  • Available Spare:剩余备用块比例,从100%往下掉。SSD收到磨损的块后,会从备用块里顶上。如果这个值跌到10%以下,说明备用块快见底了,盘的状态相当危险。
  • Data Units Written / Data Units Read:累计写入/读取的数据单元数。这里有个细节很多人会算错——1个单位不是1个扇区,而是1000个512字节块,也就是512KB。换算成大概量级时,可以用“值 × 0.512MB”来估算,再除1024得GB。比如值1000000,大约写入512GB;值10000000,大约5.12TB。
  • Media Errors:媒体错误。只要这个数字不是0,就代表盘在读取内部存储时出过错。持续增长基本等于盘在向你求救。
  • Unsafe Shutdowns:异常断电次数。每次没有正常关机流程就掉电,这里都会加1。偶尔几次是意外,连续快速增长就得查电源和散热了。
  • Temperature:NVMe盘的当前温度。部分盘还会给出Composite Temperature,也就是综合温度,取多个传感器的综合值。
  • Power Cycles 和 Power On Hours:通电次数和通电小时数。这两个字段更多用于了解盘的“工龄”。

NVMe没有SATA盘那种“通电次数多但写入量少”的割裂感,因为Percentage Used把写入量和标称寿命直接关联了。真正需要同时关注的是三件事:寿命消耗速度、备用块余额、有无媒体错误和异常断电记录。

3.3 Raw值与归一化值:为什么有些属性看RAW才准

smartctl输出的属性表里,每个属性都有VALUE、WORST、THRESH和RAW_VALUE四列。很多新手只盯着VALUE,看到100就觉得很健康,看到50就心慌。其实这里面有门道。

VALUE是厂商把原始值按0到100(或者0到200)重新映射后的“归一化分数”,分数越低代表越接近报废阈值。THRESH是触发警告的阈值,当VALUE低于等于THRESH时,盘就在SMART状态里报FAIL了。这套设计在机械硬盘时代很合理,因为不同厂商的原始值单位差异太大,用归一化分数能统一比较。

但到了SSD时代,很多厂商对归一化值的实现并不走心,有的盘用了好几年VALUE还是100,有的盘刚用一个月VALUE就掉到80。所以在实际判断时,我的经验是:归一化值只用来判断有没有“过线”,具体分析尽量看RAW_VALUE的原始值和变化趋势。比如241 Total_LBAs_Written,VALUE可能永远是100,但RAW值在告诉你它已经写了多少T数据。又比如187 Reported_Uncorrectable,VALUE降到0之前你根本看不出异常,但RAW值从0变成7已经说明坏事了。趋势分析永远比绝对值有意义,这个观念在实际运维中怎么强调都不为过。

4. 实操演练:从SMART预警到硬盘更换的完整流程

4.1 一次真实的“黄灯”排查过程

说一个我印象比较深的排查经历。某台跑构建任务的工作站,最近总感觉磁盘IO时不时飙到100%,系统响应迟钝,但也没报错。我上去先跑了smartctl -a /dev/sda,整体状态还是PASSED,但属性表里有两处让我不舒服:

187 Reported_Uncorrectable RAW_VALUE 15 199 UltraDMA_CRC_Error_Count RAW_VALUE 7

我没太在意199,因为CRC错误常见于线材问题,换根线可能就没了。但187这个数字就很不正常,它不是0而且已经到15了。我继续看241 Total_LBAs_Written,发现这块256G的盘累计写入量已经超过标称的TBW的两倍多。也就是说,这块盘已经严重“超期服役”了,正在用ECC和自己的错误重试机制硬扛着工作。

于是我做了一步关键操作:跑一次短自检。命令是:

smartctl -t short /dev/sda

等几分钟后看结果:

smartctl -l selftest /dev/sda

结果不出所料,日志里显示Completed: read failure,后面的LBA_of_first_error还指向了一个具体的扇区地址。到这一步,结论已经很明确了:这块盘的NAND里已经有块读到不出数据,而且坏块区域正在扩大。SMART整体状态还是“PASSED”,是因为187暂时还没有跌破厂商设的THRESH,但这块盘绝对不该继续在业务机器上待着了。

4.2 备份、标记、更换的规范化动作

遇到这种盘,我的处理顺序是固定的,每一步都很重要:

  1. 停止对该盘的一切写入操作。如果有数据库或重要应用在运行,先切换或迁移到备用节点。
  2. 立刻做数据备份。SMART出现不可纠正错误时,时间非常宝贵,每拖一分钟都是在赌它不会彻底掉盘。
  3. 用lsblk和lsscsi记录盘符、序列号和挂载关系,导出当前分区表和文件系统结构。别以为你对机器很熟就不会记错——十几块盘一起换的时候,对错盘号的下场就是灾难。
  4. 替换物理盘。SATA盘拔掉换新,NVMe盘插回槽位,重新分区、恢复文件系统,最后把数据从备份拉回来。
  5. 对新盘重新跑smartctl -a确认没问题,记录下它的初始属性值,作为后续监控的基线。

对比一下新旧盘的SMART属性,你会很有感触:新盘的187和199都是0,而旧盘的187已经15了。这就是数据给你的“信任分”,一看便知该不该继续依赖它。

4.3 用定时任务把SMART监控跑起来

人工巡检最怕忘记,尤其是机器多、盘更多的场景。我的建议是让SMART监控自动跑起来,最低限度也要用一个定时任务每天检查一次。

最轻量的做法是直接用smartmontools自带的smartd服务。配置一行就把监控跑起来:

/etc/smartd.conf DEVICESCAN -m root -M test

不过这种配置只能在你收到邮件提醒时才知道出了问题,方式比较被动。我自己更习惯写一个简单的脚本,用smartctl的JSON输出抓重点字段,再做趋势记录。核心思路是:把关键属性(187不可纠正错误、241累计写入量、温度、Percentage Used等)抽出来存到日志文件里,然后用awk或者python判断是否超过阈值,一旦异常就写一条报警记录。

#!/bin/bash # 每日本盘SMART关键信息记录脚本(示例) for dev in /dev/sda /dev/sdb /dev/nvme0; do smartctl -a --json "$dev" >> /var/log/smart_history.$(date +%Y%m).log done

配合cron每天凌晨跑一次,一个月后回头看历史数据,哪块盘的写入量增长异常、哪些字段在缓慢劣化,一目了然。定期巡检的真功夫不在“看没看”,而在“积累数据后能不能看出趋势”。机器不会骗人,数据积累多了,你会比厂商的智能预测还能提前发现问题。

5. 排查实录:SMART读不到、数字异常、误报的典型问题

5.1 为什么smartctl显示“Device does not support SMART”

这个报错我见过太多次了,每次遇到都要先问清“这个盘是怎么接到机器上的”。最常见的有三种:

第一种是USB转接。消费级移动硬盘盒、USB转SATA线这种东西,桥接芯片有的会透明透传SMART命令,有的直接把它挡掉。后者就表现为smartctl完全读不到盘。解决思路是:优先把盘直接从主板SATA口或者NVMe槽位接上再读,数据线越少越好。如果你非要通过USB读,可以试试给smartctl指定设备类型,比如-d sat,部分USB桥接芯片是支持SAT(SCSI/ATA Translation)透传的,但成功率要看芯片型号,别指望所有盒子都能用。

第二种是RAID卡。服务器板载RAID卡如果工作在RAID模式,系统看到的逻辑盘是RAID控制器虚拟出来的,SMART命令发不到物理盘上。这时候要么把RAID卡切到IT模式(HBA直通模式),让系统直接看到物理盘;要么走厂商的RAID管理工具去看盘的SMART,绕开smartctl。这是很多刚接手服务器的同学最容易踩的坑——芯片组再新、驱动再全,RAID虚拟盘挡住了就是挡住了。

第三种是NVMe盘但smartmontools版本太老。这个问题在前面提过,老版本对NVMe支持不完整,读取会失败或者字段不完整。对策是升级smartmontools,7.x起步基本就没这个问题了。

5.2 两个工具显示的数据为什么对不上

有时候你用smartctl看一个数据,用厂商的检测工具看又是另一个数,谁都不服谁。这种“对不上”的情况,排除盘本身故障后,通常来自两个原因。

一是单位换算不同。最典型的就是NVMe的Data Units Written,前面讲过它的单位是512KB,有些厂商工具在界面上已经帮你换算成了GB或者TB,数字自然差着量级。二是属性偏移不同。同一个属性ID,不同厂商可能定义的内容完全不一样,比如有的厂商把231定义为SSD Life Left,另一家可能把它当成别的计数器。smartctl展示属性时只能按通用名称显示,厂商专用工具则知道自己家的ID对应什么。所以如果你发现某一项对不上,先别急着判定是盘坏了,核对一下是不是在拿苹果和橘子比。

还有一种情况是smartctl读到的属性和厂商工具读到的“更新频率”不一样。SMART数据不是实时刷新的,有的盘每30分钟才更新一次统计缓存,你前一秒用smartctl读可能还没覆盖最新的自检结果,过五分钟再读又变了。所以做对比分析时,尽量在同一时刻取数,别一边读旧缓存一边读实时数据。

5.3 温度读数“翻车”,不代表盘一定出问题

有次我看到一块盘显示温度98℃,当时第一反应是“是不是要着火了”。后来冷静下来查了查,发现这盘正好在做全盘Trim加垃圾回收,温度传感器放在主控附近,瞬间冲高到95℃以上并不是不可能。等IO静下来几分钟,温度就回落到45℃左右了。这类“瞬时高温”如果是短时间出现,随后快速降低,且Max温度没有反复刷新,通常不用太紧张。

真正需要担心的是持续高温。SSD的NAND对温度极其敏感,长期在70℃以上运行,闪存单元的电荷保持能力会显著下降,数据保存时间变短,甚至诱发提前磨损。如果是服务器环境,优先检查盘位风道是否被堵、散热片是否贴好、机柜环境温度是否过高。如果持续高温还伴随187不可纠正错误在涨,那问题就不只是散热,而是盘本身快不行了。

5.4 SMART全绿但盘突然掉线,怎么办

这是所有存储从业者最怕遇到的情况之一——昨天看SMART全部PASSED,今天早上盘就掉线了。SMART能捕捉的是那些“有迹可循”的劣化过程,但SSD的突然死亡往往来自主控固件bug、供电异常、PCIe链路不稳定这类SMART根本没记录的领域。尤其是那种“开机识别正常,跑着跑着设备就消失了”的掉盘现象,大概率是主控和固件的锅,不是闪存物理寿命的问题。

遇到这种情况,我的建议有三条,按顺序执行:

  1. 先备份,再说别的。盘掉了还能认回来一次,就抓紧这个机会把所有数据拷出来。
  2. 检查底层硬件而不是只盯盘本身。换个盘位、换根线、换一个电源接口,排除主板槽位和供电问题后再上电。
  3. 更新固件。很多SSD掉盘问题都是固件bug,厂商后续版本会修复。但执行固件升级前,一定先完成备份,升级过程本身也有一定风险。

SMART不是万能的,它只是一个辅助工具。真正的“万能保险”只有一个——多副本备份。我见过太多人守着“PASSED”的绿色标记心存侥幸,最后等来的是数据丢失和加班救援的双重打击。SMART信息能帮你规避大概率风险,但永远替代不了备份这最后一层防线。

我个人做存储巡检的习惯是:每个月固定一天全量跑一遍smartctl,把每块盘的关键字段打印成一张表,累积归档。我不太看那个“PASSED”字母,重点看的是187不可纠正错误、241累计写入量、温度的最大值、以及NVMe盘的Percentage Used和Unsafe Shutdowns。这些数字放在一起横着比,能看出哪块盘“长得最老”;竖着比,能知道哪块盘正在加速劣化。两次巡检之间只要某个数值出现翻倍式的增长,就值得提前安排更换,而不是等它亮红灯。

如果你手头正好有几块旧SSD闲置,不妨现在就把它们插到机器上跑一遍smartctl -a,看看里面躺着的那些RAW值。很多盘看着还能用,计算一下写入量,你会发现它早就是个“退役老兵”了。盯住趋势,提前行动,这比什么预测算法都靠谱。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进