服务器磁盘健康监控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输出判断是否需要返厂,不要等到系统掉盘再处理。