
几个月前,我维护的一台香港节点裸金属服务器突然宕机。分析日志后发现,根因竟是 NVMe 系统盘发生了不可恢复的写入错误,而这块盘在系统监控中却毫无异常预警。我一度以为硬盘寿命只能“靠猜”,直到深入研究了 smartctl 和 Zabbix 联动方案,才彻底掌握了 NVMe 健康状态的可视化手段。这篇文章就是我从硬盘黑盒到精细监控的完整实践路径。
一、监控目标与部署环境说明
目标:对香港节点服务器的 NVMe 硬盘进行健康监控,包括寿命剩余、温度、错误计数等关键 SMART 指标,并接入 Zabbix 告警。
服务器环境:
- 系统:CentOS 7.9 / AlmaLinux 8
- 硬盘:Intel D7-P5520 NVMe 1.6TB / Samsung PM983
- Zabbix Agent:v6.0 LTS
- Zabbix Server 部署地点:同样位于香港,内网可达,便于低延迟数据采集。
二、smartmontools 安装与配置
首先安装 smartmontools,这是 Linux 下查看 SMART 信息的核心工具:
yum install -y smartmontools
启用对 NVMe 的支持,smartctl 需要 7.0+ 版本以上。在 CentOS 下可以编译最新版:
wget https://downloads.sourceforge.net/project/smartmontools/smartmontools/7.4/smartmontools-7.4.tar.gz
tar zxvf smartmontools-7.4.tar.gz
cd smartmontools-7.4
./configure && make && make install
三、手动验证 NVMe SMART 输出
执行以下命令查看硬盘状态:
smartctl -a /dev/nvme0
输出关键字段包括:
Percentage Used: 4%
Media and Data Integrity Errors: 0
Temperature: 41 Celsius
Power On Hours: 2048
Unsafe Shutdowns: 3
Critical Warning: 0x00
重点监控字段解释如下:
| 指标名称 | 说明 |
|---|---|
Percentage Used |
硬盘寿命已使用百分比(越低越好) |
Temperature |
当前工作温度 |
Data Units Written |
写入的数据块数量 |
Media and Data Errors |
介质或数据错误计数 |
Unsafe Shutdowns |
未正常关机次数 |
四、将 SMART 指标接入 Zabbix
1. 创建本地采集脚本
创建脚本 /usr/local/zabbix/scripts/nvme_smart.sh:
#!/bin/bash
DEVICE="/dev/nvme0"
case "1" in
health)
smartctl -H "DEVICE" | grep "SMART overall-health" | awk '{print NF}'
;;
temp)
smartctl -a "DEVICE" | grep -i temperature | grep -Eo '[0-9]+(?= Celsius)' | head -1
;;
usage)
smartctl -a "DEVICE" | grep "Percentage Used" | awk '{print3}' | tr -d '%'
;;
media_errors)
smartctl -a "DEVICE" | grep "Media and Data Integrity Errors" | awk '{printNF}'
;;
unsafe_shutdowns)
smartctl -a "DEVICE" | grep "Unsafe Shutdowns" | awk '{printNF}'
;;
*)
echo "Usage: $0 {health|temp|usage|media_errors|unsafe_shutdowns}"
exit 1
esac
赋予执行权限:
chmod +x /usr/local/zabbix/scripts/nvme_smart.sh
2. 修改 Zabbix Agent 配置文件
编辑 /etc/zabbix/zabbix_agentd.d/nvme_smart.conf:
UserParameter=nvme.health,/usr/local/zabbix/scripts/nvme_smart.sh health
UserParameter=nvme.temp,/usr/local/zabbix/scripts/nvme_smart.sh temp
UserParameter=nvme.usage,/usr/local/zabbix/scripts/nvme_smart.sh usage
UserParameter=nvme.media_errors,/usr/local/zabbix/scripts/nvme_smart.sh media_errors
UserParameter=nvme.unsafe_shutdowns,/usr/local/zabbix/scripts/nvme_smart.sh unsafe_shutdowns
重启 Agent:
systemctl restart zabbix-agent
3. Zabbix Server 端测试取值
zabbix_get -s <agent_ip> -k nvme.usage
成功返回百分比数值即配置无误。
五、Zabbix 图表与告警触发器设计
1. 创建监控项(Items)
| 名称 | 键值 | 类型 | 单位 | 更新间隔 |
|---|---|---|---|---|
| NVMe 温度 | nvme.temp |
Zabbix agent | °C | 60s |
| 寿命使用百分比 | nvme.usage |
Zabbix agent | % | 60s |
| 媒体错误数 | nvme.media_errors |
Zabbix agent | 次 | 60s |
| 异常关机次数 | nvme.unsafe_shutdowns |
Zabbix agent | 次 | 60s |
2. 创建触发器(Triggers)
NVMe温度过高:
{hostname:nvme.temp.last()}>65
使用寿命接近终点:
{hostname:nvme.usage.last()}>90
出现媒体错误:
{hostname:nvme.media_errors.diff()}>0
六、进阶:多块 NVMe + 自动发现
对于多 NVMe 环境,可以配合 LLD(Low Level Discovery)规则自动发现:
- 写一个输出 JSON 格式的 discovery 脚本;
- 动态生成 key,例如 nvme.temp[/dev/nvme1];
- 在 Zabbix 中使用原型监控。
- 可参考 nvme list + jq 提取设备路径。
七、总结与收益
通过 smartctl + Zabbix 的组合,我不仅实现了对香港服务器 NVMe 盘的实时可视化监控,还能通过触发器提前预警寿命耗尽、温度异常或写入失败问题。相较于传统只靠系统日志或人工检测的方法,这一方案大大提高了稳定性和预测性。
这类监控策略,特别适用于部署高价值业务的香港服务器场景——尤其是我们自建的裸金属节点或高 I/O 视频回源节点,不容忽视的硬件健康管理,必须做到“有据可查、自动告警、实时应对”。
如需进一步集成 Grafana 可视化或结合 Prometheus exporter 实现更高维度的集群健康监控,也可以在此基础上扩展实现。











