服务器磁盘健康监控smartctl

很多服务器用上U.2接口的NVMe SSD后,坏道问题比SATA盘更隐蔽,一旦出现重映射扇区或待映射扇区暴涨,往往意味着数据风险。
本文以smartctl为基础,带你从零完成U.2硬盘健康监控,并写一个能自动检查坏道、异常时触发告警的预警脚本。
全程命令可复制,零基础也能跟着做。

准备工作:装好smartmontools并确认设备名

先安装smartmontools。
Debian/Ubuntu系统执行:

apt update && apt install -y smartmontools

CentOS/RHEL系统执行:

yum install -y smartmontools

安装后确认U.2硬盘被系统识别,常见设备名为/dev/sda/dev/nvme0n1/dev/nvme1n1
列出所有磁盘:

lsblk -d -o NAME,SIZE,TYPE,MODEL

注意:U.2盘如果通过PCIe转接卡接入,通常识别为/dev/nvmeXnY
如果通过SATA接口接入,则显示为/dev/sdX
不确定时用smartctl --scan自动扫描:

smartctl --scan

输出会列出设备路径和类型,例如/dev/nvme0 -d nvme # Samsung SSD 983DCT
拿到设备名后,下一步开始读取健康状态。

读取SMART信息:看哪些参数预警坏道

执行下面命令查看完整健康信息,把/dev/nvme0替换成你的实际设备:

smartctl -a /dev/nvme0

对SATA接口的U.2盘,使用:

smartctl -a /dev/sda

输出中重点看这几项,它们直接反映坏道和闪存磨损:

  • Reallocated_Sector_Ct(重映射扇区数):已有坏块被替换到备用区,数字大于0就需要警惕。
  • Current_Pending_Sector(待映射扇区数):读取异常但还没被重映射的扇区,属于坏道前兆。
  • Uncorrectable_Sector_Ct(无法纠正扇区数):已经彻底读不出的扇区,数值上涨说明盘在恶化。
  • Media_Wearout_IndicatorPercentage_Used:闪存寿命消耗百分比,超过100%不代表立刻坏,但应尽快备份。

如果看到SMART overall-health self-assessment test result: PASSED,说明整机SMART自检通过。
但PASSED不等于没有坏道,必须结合上面的具体数值判断。

编写坏道预警脚本

/usr/local/bin下创建脚本,建议使用Shell或Python。
这里给出一份可直接用的Shell脚本,支持NVMe和SATA两种设备。

先创建文件:

vi /usr/local/bin/disk_smart_watch.sh

粘贴以下内容,DEVICES改成你的实际设备列表,THRESHOLD为触发告警的坏道/重映射扇区阈值:

#!/bin/bash
# U.2硬盘SMART坏道预警脚本
DEVICES="/dev/nvme0 /dev/nvme1 /dev/sda"
THRESHOLD=5
LOG_FILE="/var/log/disk_smart_watch.log"

for dev in $DEVICES; do
    if [[ "$dev" == /dev/nvme* ]]; then
        sectors=$(smartctl -a "$dev" | grep -E "Media_Wearout_Indicator|Percentage_Used" | awk '{print $NF}')
    else
        sectors=$(smartctl -a "$dev" | grep -E "Reallocated_Sector_Ct|Current_Pending_Sector|Uncorrectable_Sector_Ct" | awk '{print $NF}')
    fi
    for val in $sectors; do
        if [[ "$val" -gt "$THRESHOLD" ]]; then
            echo "$(date '+%Y-%m-%d %H:%M:%S') WARN $dev has bad sector value $val" >> "$LOG_FILE"
        fi
    done
done

如果你是SATA U.2盘,上面的逻辑会单独统计重映射、待映射和不可纠正三个值。
若是NVMe盘,Media_Wearout_Indicator通常显示剩余寿命百分比,数值越小代表寿命越低,你可以在脚本里改成低于某个值就告警。

给脚本加执行权限:

chmod +x /usr/local/bin/disk_smart_watch.sh

手动跑一次,确认没有报错:

bash /usr/local/bin/disk_smart_watch.sh && cat /var/log/disk_smart_watch.log

正常时日志为空或只有正常记录,一切无误后配置定时任务。

配置定时任务并设置邮件通知

每天凌晨2点检查一次比较合理,既能及时发现问题,也不会频繁读取SMART增加盘负担。
执行:

crontab -e

加入这一行:

0 2 * * * /usr/local/bin/disk_smart_watch.sh

如果不想只在机器本地看日志,可以把告警发到邮箱。
脚本中追加发送逻辑,例如使用mail命令:

if [ -s "$LOG_FILE" ]; then
    mail -s "[SMART] U.2硬盘坏道预警" yourmail@example.com < "$LOG_FILE"
fi

注意把yourmail@example.com换成真实地址。
使用mail前需安装:

apt install -y mailutils   # CentOS则用 yum install -y mailx

配好后再加一条单独的cron任务,把日志和告警分开,避免漏看。

避坑:U.2盘常见误判与报警陷阱

实际运维中,以下几点最容易踩坑:

  • 不要拿NVMe的寿命百分比当坏道看。NVMe SMART里没有传统意义上的“重映射扇区”,更多是Available SparePercentage UsedCritical Warning。脚本判断逻辑必须区分NVMe和SATA。
  • U.2转接线或背板接触不良会触发SMART错误。有些U.2盘报Media Error其实是线缆问题,先重启或重新插拔再判断是否坏道。
  • SMART的PASSED不代表零风险。厂商阈值通常很宽松,等Current_Pending_Sector超过0再管可能就晚了,建议阈值设小一点。
  • 部分U.2盘需要加-d sat参数。SATA转接场景下,smartctl可能无法自动识别协议,报Device does not support SMART时尝试:
smartctl -d sat -a /dev/sda

跑完脚本后,手动制造一个“异常”测试预警逻辑,比如临时把阈值改成0,观察日志和邮件是否正常。
确认没问题后再把阈值恢复原值。
日常建议每季度跑一次smartctl -t long /dev/nvme0做长时间自检,全面扫描介质坏块,结果会记录在SMART日志里,用smartctl -l selftest查看。

按照本文的步骤配置好U.2硬盘坏道预警脚本后,日常只要看一眼/var/log/disk_smart_watch.log日志或邮件,就能掌握磁盘健康状况。
遇到SMART值异常时,优先备份数据,再结合smartctl -a输出判断是否需要返厂,不要等到系统掉盘再处理。

分享到:
上一篇
Docker容器网络模式选型bridge/host/
下一篇
Nginx配置长连接keepalive
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意