服务器磁盘健康监控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_Indicator或Percentage_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 Spare、Percentage Used和Critical 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
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意