Linux下SSD健康监测:smartctl与SMART信息实战指南

发布时间:2026/10/21 17:02:51
Linux下SSD健康监测:smartctl与SMART信息实战指南
最近帮朋友排查一台老服务器的卡顿问题iostat里显示磁盘利用率不高但系统响应就是慢。折腾半天最后用smartctl看了一眼盘的健康状态才发现 SSD 的备用块已经快用完了甚至出现了掉盘前的征兆。说实话在 Linux 下玩 SSD不会看 SMART 信息就像开车不看仪表盘迟早要出大事。这篇文章就把smartmontools这套工具从入门到实战完整捋一遍希望能给你省下一些不必要的麻烦。1. 为什么 SSD 的 SMART 信息比机械硬盘更需要仔细看很多从机械硬盘时代过来的运维习惯性地看一眼“SMART 状态OK”就完事了。但如果把机械硬盘那套判断逻辑直接套在 SSD 上大概率会误判。SSD 的内部结构和机械硬盘完全是两套逻辑理解这一点才能真正读懂 SMART 数据。1.1 NAND 闪存的擦写机制决定了健康度定义完全不同机械硬盘的 SMART 主要关注机械结构比如寻道错误率、重映射扇区、马达启动次数这些。而 SSD 没有机械部件核心存储介质是 NAND 闪存。NAND 的每一个存储单元Cell都有 Program/Erase 次数的物理极限也就是常说的 P/E 次数。SLC 颗粒大概能到 10 万次MLC 一般是 3000 到 10000 次TLC 多数在 1000 到 3000 次QLC 就更紧张了很多只有 500 到 1000 次。但这并不意味着 SSD 用几天就报废。主控芯片里有一个 FTLFlash Translation Layer闪存转换层的东西它干的事情就是把逻辑块地址映射到物理块地址。每次写入数据时FTL 会挑选写入次数较少的物理块来写这就是磨损均衡Wear Leveling。所以一块 SSD 的命由两部分决定一是 NAND 颗粒本身的体质二是主控的磨损均衡算法聪明不聪明。1.2 写入放大效应会让 SMART 数值比想象中涨得快SSD 最小的读写单位是页Page但擦除必须按块Block来。如果某个块里只有几个页的数据需要更新主控也不能只改这几页得把整个块读出来在内存里改掉再擦除整个块最后把数据写回去。这个过程中实际写入 NAND 的数据量远大于操作系统发下来的数据量两者之比就叫写入放大Write Amplification。举个例子你写了一个 4KB 的文件最终落到 NAND 上可能消耗了 48KB 的写入量。所以你在 SMART 里看到的“主机写入总量”和“NAND 实际写入总量”往往对不上而且 NAND 写入量更大。这也是为什么评估 SSD 寿命不能只看主机写入量还要看 NAND 写入量和磨损均衡计数。1.3 主控会把健康状态翻译成普通人能看懂的百分比现在大多数 SSD 会通过 SMART 返回一个“剩余寿命百分比”这是主控综合 P/E 次数、备用块数量、磨损均衡度等因素算出来的。这个数值从 100 往下掉掉到个位数就该考虑换盘了。不过要注意不同品牌、不同主控计算百分比的方式不一样。有的厂家比较保守掉到 90% 以下就开始慌有的厂家比较激进到了 50% 还能继续用很久。重点不是看绝对数值而是看下降趋势。如果一块盘半年内从 99% 掉到 80%那就要警惕了说明工作负荷可能远超设计预期。2. 安装 smartmontools 并跑通基本体检流程smartmontools是 Linux 下的事实标准工具它由两部分组成一个是命令行工具smartctl用来手动查看和控制 SMART另一个是后台守护进程smartd可以定时巡检并在发现问题时通过邮件或系统日志报警。2.1 安装和启用模块的几种典型方式在大多数发行版里安装都很快。基于 Debian 的系统用apt install smartmontools基于 Red Hat 的系统用dnf install smartmontools装完之后先确认内核有没有加载对应的驱动模块。绝大多数 SSD 走的是 NVMe 协议对应驱动是nvme而 SATA 接口的 SSD 走的是 ATA 协议对应驱动是libata。一般现代内核都自带这些驱动不需要额外折腾。2.2 第一次体检建议跑一遍完整信息查询对一块 SATA SSD最基础也是最常用的命令是smartctl -a /dev/sda这条命令会把盘的全部 SMART 属性列出来。对 NVMe SSD命令稍有不同smartctl -a /dev/nvme0注意NVMe 设备在 Linux 里的设备节点是/dev/nvme0不是一个分区名后面不带数字。查看所有 NVMe 设备可以用ls /dev/nvme*第一次使用我建议先跑一条smartctl -s on开启 SMART 支持虽然现在的盘默认都是开的但老一点的硬盘或虚拟机里挂载的虚拟盘可能会是关闭状态。2.3 设备命名规则曾经让人很头疼早年用/dev/sda、/dev/sdb这种方式最麻烦的问题是设备名可能漂移。你以为是/dev/sda重启后系统挂载顺序变了变成/dev/sdc了结果smartctl看了半天看的根本不是同一块盘。Linux 其实早就提供了稳定的设备路径在/dev/disk/by-id/和/dev/disk/by-path/下面。强烈建议在日常巡检和脚本里用 by-id 方式定位设备smartctl -a /dev/disk/by-id/ata-XXXXXX这样即使重启、换了插槽只要盘还是那块盘名字就不会变。对服务器上插了很多盘的情况这一条能避免很多误操作。3. 看懂 SSD SMART 输出里的核心属性smartctl -a的输出信息量很大很多新手看到一堆数字就懵了。其实对于 SSD需要盯住的属性不算多下面逐个拆开讲。3.1 SATA SSD 需要重点关注的几个属性SATA 接口的 SSD 遵循 ATA 规范属性编号是标准化的。以下这些我认为是最关键的属性ID属性名通俗解释健康判断依据177Wear Leveling Count磨损均衡计数反映平均擦除次数数值增长过快说明负载太重或写入放大严重181Program Fail Count编程失败次数写入数据失败的总数非零且持续增长是颗粒老化的明确信号182Erase Fail Count擦除失败次数同上出现这个就该考虑备份数据了187Reported Uncorrectable Errors无法纠正的错误计数即读不到正确数据任何非零值都值得警惕192Power-Off Retract Count异常断电次数频繁异常掉电是最伤 SSD 的操作之一194Temperature盘体温度长期超过 70 摄氏度NAND 寿命显著缩短231SSD Life Left厂家计算的剩余寿命百分比掉到 20% 以下要制定换盘计划241Total LBAs Written主机累计写入的 LBA 总数乘以 512 就是字节数用来估算盘面写入压力对比标称 TBW以 241 为例假设它的值是 123456789那写入量就是 123456789 × 512 63209875968 字节约合 58.8 GB。大多数smartctl输出里会直接把可读的单位打印出来不需要手动算但了解这个原理能帮你校验盘的读写压力是否符合预期。3.2 NVMe SSD 的 SMART 信息组织方式不同NVMe 协议的 SMART 信息不走 ATA 那套属性编号而是用一组固定的健康信息字段。smartctl -a /dev/nvme0看到的会是这样的关键项Data Units Written主机写入的数据量单位是 1000 × 512 字节。这个字段直接反映累计写入量。Percentage Used主控估算的寿命消耗百分比类似 SATA 盘的 Life Left只不过方向相反。0 表示全新100 表示理论寿命耗尽。Available Spare备用块剩余比例。NAND 出厂时会多备一些块用来替换坏块。这个掉到 10% 以下就非常危险了。Power Cycles累计开关机次数。Power On Hours累计通电时间。NVMe 的Percentage Used是一个线性估算值很多盘其实到了 100% 还能用但厂家不建议继续用了因为数据可靠性没有保证。我的建议是一旦这个值超过 90%就开始做数据迁移因为在它彻底不工作之前完成迁移才是稳妥的做法。3.3 关于 05/C4 这类重映射属性在 SSD 上的不同解读机械硬盘时代05 Reallocated Sector Count是判断坏道的最重要属性SSD 上也有类似字段比如05 Reallocated Sector Count或C4 Reallocated Event Count。但因为 FTL 的存在SSD 的重映射过程对用户完全透明主控发现坏块后自动用备用块替换。这里需要特别说明SSD 的备用块替换是常态化的并不是出现一两个重映射扇区就要完蛋。只要数值不持续增长且余生寿命百分比还有余量基本不用担心。但如果你观察到Available SpareNVMe或“剩余备用块”百分比在持续下降那就是备用块在被消耗需要结合 P/E 次数一起来分析。我个人判断标准是两类情况算严重——第一备用块比例低于 10%第二备用块数值在短期内快速下降比如两周内掉超过 5 个百分点。这两类情况说明颗粒已经进入了快速老化期盘可能随时“猝死”。4. 用 smartd 实现全自动巡检与报警只会在某一天手动敲一次smartctl对生产环境来说远远不够。硬盘的劣化是一个缓慢过程应该让机器每 30 分钟或每小时自己检查一次发现问题立刻通知你。4.1 一个可靠的 smartd 配置模板smartd的配置文件默认在/etc/smartd.conf。对这个文件我喜欢用最精简但管用的写法/dev/disk/by-id/ata-XXXXXX -a -d sat -o on -S on -s (S/../.././02|L/../../7/03) -m youexample.com -M test这个配置拆开来看-a监控所有属性任何属性一旦超过阈值就视为故障。-d sat让 smartd 通过 SCSI/ATA Translation 来访问 SAT 设备。如果你用的是 USB 转 SATA 线往往需要这个参数才能读到健康数据。-o on开启硬盘的自动离线和在线数据采集功能。-S on开启属性自动保存断电后不会丢失累计数据。-s (S/../.././02|L/../../7/03)定时执行短自检Short Self-test和长自检Long Self-test。短自检每天凌晨 2 点跑长自检每周日凌晨 3 点跑。-m youexample.com报警邮件接收地址。-M test启动 smartd 时先发一封测试邮件验证邮件通道是通的这个很实用。配置完记得重启服务systemctl restart smartd4.2 自检Self-test的类型怎么安排SMART 自检分两种短自检Short一般几十秒到几分钟检查一小部分区域和关键属性。长自检Long一般几个小时甚至更长全盘遍历能发现更多隐患。对于 SSD因为寻址快长自检通常比机械硬盘快很多有时几分钟就完成了。生产环境建议每周跑一次长自检比如安排在周日凌晨业务低谷时段。自检本身会消耗一些 IO 资源但 SSD 基本无感。查询上次自检结果smartctl -l selftest /dev/sda输出里能看到自检类型、完成百分比、结果状态。只要状态是Completed without error就说明这次体检通过。4.3 没配邮件服务器也能收到报警很多人卡在邮件报警这一步觉得得先配 Postfix。其实smartd的-m参数不止支持本地邮件还可以指定脚本程序来转发通知通过-M exec指定/dev/sda -a -M exec /usr/local/bin/smartd-notify.sh脚本里你可以自己写推送逻辑。比如用curl发到企业微信或钉钉机器人的 webhook或者直接写日志到文件然后被监控系统采集。这个方法能让报警体系快速跑起来过程非常简单可靠。我本人就一直在用 webhook 方式比邮件通知及时得多。5. 跨接口、跨场景的兼容性要点SSD 不一定都直接插在主板上。有的是 USB 移动硬盘有的是 RAID 卡后面有的在虚拟机里透传。不同场景下SMART 信息的读取方式和可信度差别挺大。5.1 USB 桥接芯片对 SMART 读取的影响如果你想把一个 SSD 通过 USB 转接盒接到 Linux 机器上看 SMART这里有个大坑SMART 走的是 SATA 命令而 USB 是 UASP 或 BBBBulk-Only Transport协议需要桥接芯片翻译。用smartctl检测时第一步先试这个smartctl -a /dev/sdb如果输出提示Device does not support SMART别急着下结论。加-d sat再试smartctl -a -d sat /dev/sdb还不行就枚举一下设备类型smartctl -d sat --scan不过要承认有些便宜 USB 桥接芯片根本就没实现 SMART 透传或者实现的字段不完整这种盘通过 USB 就是读不出完整健康信息。这类盘我的建议是直接放弃 SMART或者接回 SATA 口再体检。5.2 阵列卡直通与虚拟磁盘的情况服务器如果用了 RAID 卡而盘又是用jbod或hba模式直通的SMART 可以通过smartd正常访问但需要指定设备类型。有些 RAID 卡会把盘虚拟成一个逻辑盘这时smartctl -a /dev/sdb看到的可能是阵列卡的虚拟盘信息而不是盘本身的 NAND 信息。这种情况下建议进入阵列卡的配置界面找到对应的物理盘再查看 SMART。或者使用阵列卡厂商提供的命令行工具比如常见的有storcli或sas3ircu这类工具能直接看到物理盘的 SMART 状态。虚拟机里则有两个情况如果是把整块物理盘透传给虚拟机SMART 信息通常能透传如果用的是虚拟磁盘文件那 SMART 就是虚拟化层模拟的可信度有限。5.3 Intel 和三星系主控的主题差异不同主控厂商的 SMART 定义尤其在供应商特定属性上差异很大。三星系盘的属性定义和慧荣、联芸、群联主控都不完全一样。拿 177 磨损均衡计数来说三星把磨损平均数和最差数分别放在 177 和 179 两个属性里有些国产主控又把 NAND 写入总量单独放在一个私有属性里。要看全这些私有属性smartctl -x /dev/sda比-a更详细能显示 0x100-0x1FF 之间的厂商私有属性段。另外-l admin可以查看 NVMe 的更多日志页包括最关键的Error Information和Self-test Log。我建议多留意smartctl -x的完整输出不要只看-a的常规字段因为不少厂商藏关键数据的地方恰恰在私有段里。6. 实操演练用 smartctl 诊断一盘疑似翻新的 SSD理论知识讲了一堆最后来一个实际推演。这样你以后拿到任何一块盘从smartctl输出里就能快速锁定问题所在。6.1 现场输出摘录与逐行解读假设我们拿到一块 512GB 的 SATA SSD设备名是/dev/sdc跑了smartctl -a /dev/sdc关键输出如下SMART overall-health self-assessment test result: FAILED ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Always - 0 9 Power_On_Hours 0x0032 091 091 000 Old_age Always - 89000 12 Power_Cycle_Count 0x0032 099 099 000 Old_age Always - 9876 177 Wear_Leveling_Count 0x0000 001 001 000 Old_age Always - 1900 181 Program_Fail_Cnt_Total 0x0033 100 100 010 Pre-fail Always - 0 182 Erase_Fail_Count_Total 0x0032 100 100 000 Old_age Always - 0 187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 2 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 812 231 SSD_Life_Left 0x0000 001 001 000 Old_age Always - 1 241 Total_LBAs_Written 0x0032 100 100 000 Old_age Always - 110180672看到那种SMART overall-health self-assessment test result: FAILED直接把人吓一跳的输出先稳住别慌。要注意几条异常177 Wear_Leveling_Count的 VALUE 只有 001说明磨损均衡计数已经非常高了。RAW_VALUE 是 1900。231 SSD_Life_Left的 VALUE 是 001说明主控认为寿命只剩 1%。通电时长 89000 小时大概 10 年左右是块名副其实的老盘。187 Reported_Uncorrect有 2 次说明之前已经出现过读不到数据的情况。6.2 结合写入量和容量推算写入放大241 属性的 RAW 值是 110180672这是 LBA 数。每个 LBA 是 512 字节所以主机累计写入量是110180672 × 512 56412498304 字节 ≈ 52.5 GB512GB 的盘只写了 52.5 GB 就疲劳成这样这就很不对劲了。要么这个盘之前经历过极端密集的写入已经换过一次“新衣”或清零要么内部存在严重异常的写入放大。我们再保守推算一下假设这块盘之前经常处于写入比较密集的环境1900 次擦除计数对一个早期批次 TLC 颗粒来说确实可能到了寿命极限。因为 512G 的盘若满盘顺序写入一次消耗一个 P/E而 1900 次 P/E 对 TLC理论 700-1000 次 P/E来说确实已经大大超出额定值。这个盘的实际状态基本就是处于报废边缘。6.3 处理建议这一步的动作要果断立刻把这块盘上的所有数据迁移到备用盘然后停止在线业务。以个人经验看这种盘的后续发展路径很可能是先出现读性能骤降接着频繁掉盘最后彻底变砖。继续用下去不仅数据风险极高性能和稳定性也早已不可控。如果这个盘还在保修期走售后即可如果过保了直接退役不要用来当下载盘或临时盘。退役前如果还想再榨干最后价值最多只能拿来跑完全不重要的冷数据存储并且还要定时备份。6.4 怎么判断一块盘是不是“清零盘”市场上打着“二手 9 成新”旗号的 SSD踩雷概率不算低。有些不良商贩会通过改写 SMART 把通电时间、写入量清零让一块重度使用的旧盘伪装成“几乎全新”。清零盘最典型的特征是各项健康值都接近满值但使用起来读写性能明显比同型号新品差偶尔出现卡顿。要避免买到这种盘有几个小技巧看Power_On_Hours和Power_Cycle_Count。如果通电时间只有几十小时但通电次数上千说明这块盘常被频繁上下电。如果两者数值都极小现役民用盘很难做到。关注 NAND 写入量和主机写入量。使用-T permissive参数并配合-l defect如果有可以看更多的缺陷记录。一般出厂后长时间使用过的盘某些私有字段会有不可抹掉的痕迹。最稳妥的办法是买回来先跑一轮完整的长自检再拷贝几百 GB 数据进去观察Wear_Leveling_Count的变化速率。如果变化过快说明颗粒老化严重。7. 常见问题快查现象可能原因解决办法smartctl提示Device does not support SMARTUSB 桥接不兼容、虚拟磁盘不透明、驱动模块未加载加-d sat重试接回 SATA检查内核模块NVMe 盘的Percentage Used长时间不变写入压力不大主控算法有滞后正常现象结合Data Units Written综合判断磨损均衡计数增长比写入量快很多写入放大严重可能有碎片化随机写入检查文件系统块大小、是否频繁日志写入、预留空间是否充足温度属性显示为空或不存在盘不支持温度传感器或驱动未读取到用nvme smart-log或者厂家工具查看剩余寿命从 99% 突然掉到 90%可能触发了一次大的磨损均衡迁移观察后续趋势若继续快速下降需要处理自检日志显示Aborted (by host)上一次自检被中断通常是因为掉电或系统重启重新跑一次自检即可8. 日常巡检脚本示例把这几条常用命令搭成一个简易巡检脚本放到cron里每天跑一次比完全依赖smartd更直观日志也更容易归档#!/bin/bash LOGFILE/root/ssd_health_report.log DATE$(date %F_%T) echo SSD Health Check: $DATE $LOGFILE for disk in $(ls /dev/disk/by-id/ | grep -E ^(ata|nvme)-); do DEV/dev/disk/by-id/$disk echo --- Device: $DEV --- $LOGFILE smartctl -H $DEV $LOGFILE 21 smartctl -A $DEV | grep -E (Wear_Leveling|SSD_Life_Left|Percent Used|Available Spare|Temperature) $LOGFILE done这个脚本把最关键的几项摘出来每天生成一个快照。你甚至可以在脚本里加一行把重要数值格式化输出然后推送给你自己部署的监控面板。9. 再聊几句个人心得玩 SMART 这几年最大的体会是一块盘在 SMART 报警之前往往早就给了很多暗示只是多数人没看或者看不懂。比如Reallocated Sector Count第一次上涨的那一天可能就是数据风险开始积累的那一天。定期看 SMART 不是制造焦虑而是让你在数据还有救的时候有个从容做决策的窗口。另外SSD 掉盘往往是一瞬间的事机械硬盘还会敲盘、卡顿给你预兆SSD 很多时候什么前兆都没有就消失在系统里了。所以哪怕你的 SMART 看着一切正常备份也不能停。SMART 能帮你延长盘的使用周期、优化采购决策但它替代不了备份。这点希望每一个在 Linux 下管理数据的人都能记在心里。最后再分享一个小技巧如果你觉得smartctl的输出太琐碎可以直接用smartctl -a --json输出 JSON 格式方便直接接入监控系统或写脚本解析。实测下来非常稳定比用grep去抠字段省心太多。