适用版本:PVE 6/7/8 全系列
示例环境:InfluxDB 2.7 + Grafana 10(均 Docker 一键启动)
前言
PVE 自带的 pvestatd 每 30 秒就把 CPU、内存、磁盘、网络、虚拟机/容器等 200+ 指标采了个遍,
可惜默认只躺在 /var/log/pvestats/*.log 里。
打开「Datacenter → Metric Server → InfluxDB」开关,数据会实时推送到 InfluxDB 2.x,再用官方 Grafana 模板,
3 分钟就能拥有带标签的「下一代监控大屏」,支持 Flux 查询、告警、容量预测,全程无代理、零成本。
1. 架构 30 秒速览
+----------------+ HTTP 8086 + Token +------------------+
| PVE Node 1-8 | ----------------------------> | InfluxDB 2.x |
| pvestatd | Line Protocol / TLS 可选 | Bucket: proxmox |
+----------------+ +------------------+
↑
Grafana 10 (Flux/InfluxQL)
-
• 协议:HTTP(S) + Token 鉴权,端口 8086
-
• 格式:InfluxDB Line Protocol,自动带 tag(node、vmid、type)
-
• 压缩:gzip 默认开启,内网 1 Gbps 下 300 节点无压力。
2. 准备 InfluxDB 2.x 接收端
2.1 Docker 30 秒启动(推荐)
docker run -d --name influxdb2 \
-p 8086:8086 \
-v influxdb2-data:/var/lib/influxdb2 \
-e DOCKER_INFLUXDB_INIT_MODE=setup \
-e DOCKER_INFLUXDB_INIT_USERNAME=admin \
-e DOCKER_INFLUXDB_INIT_PASSWORD=proxmox.2025 \
-e DOCKER_INFLUXDB_INIT_ORG=homelab \
-e DOCKER_INFLUXDB_INIT_BUCKET=proxmox \
influxdb:2.7
容器日志出现 http:://localhost:8086 即启动完成。
2.2 生成专用 Write Token
浏览器打开 http://<宿主机IP>:8086 →
用上面账号登录 →
Load Data →
API Tokens →
Generate API Token →
Read/Write Token →
Buckets 勾选 proxmox →
复制 Token(88 位字符串,关闭窗口后不可再查看!)。


3. PVE 侧 3 步连线
-
- 登录任意节点 Web UI → 左侧
Datacenter→Metric Server→Add→InfluxDB
- 登录任意节点 Web UI → 左侧
-


-
- 填写:
-
• Protocol :
http(必须,才能自定义 org/bucket;https 需额外证书) -
• Server :
192.168.10.20:8086 -
• Organization :
homelab -
• Bucket :
proxmox -
• Token: 刚才复制的 88 位字符串
-
• Max. Retention: 0(使用 bucket 自身策略,默认 30 天可后改)
-
-
Create→ 重启统计服务systemctl restart pvestatd
-
4. 30 秒验证:指标真的到了吗?
-
- InfluxDB Web → Data Explorer → Bucket 选
proxmox
- InfluxDB Web → Data Explorer → Bucket 选
-
- 过滤
_measurement=system、_field=active→ 点击「Submit」
- 过滤
-
- 右侧出现折线,说明数据已入库!

- 右侧出现折线,说明数据已入库!
5. Grafana 可视化:一键导入官方模板
5.1 启动 Grafana(同一宿主机示例)
docker run -d --name grafana10 \
-p 3000:3000 \
-e GF_SECURITY_ADMIN_PASSWORD=proxmox.2025 \
grafana/grafana:10.0.0
5.2 添加 InfluxDB 2.x 数据源
-
• URL:
http://192.168.10.20:8086 -
• Organization:
homelab -
• Token: 刚才的 88 位 Token(具备 Read 权限)
-
• Default Bucket:
proxmox -
• Query Language: 选 InfluxQL (社区模板多)或 Flux(新特性多),本文以 InfluxQL 为例。
-


5.3 导入爆款 Dashboard
Grafana →
Import →
Dashboard ID 「23309」(Proxmox VE Detailed)→
选择刚才的 DataSource →
Import。
打开 Dashboard,即可看到:
-
• 集群总览:CPU、内存、磁盘、网络聚合
-
• 单节点详情:温度、负载、IOPS、网卡流量
-
• 虚拟机/容器:单 VM cpu、mem、disk io、net rx/tx
所有面板均已自动关联 tag,支持下拉框切换 node/vmid。
-

6. 常见踩坑清单
| 现象 | 原因&解决 |
|---|---|
| PVE 保存时报「422 Unprocessable Entity」 | Token 没给 Write 权限,或 bucket/organization 拼写错误 |
| Grafana 无数据 | Bucket 区分大小写;确认 Token 具备 Read 权限;时间区域选 UTC 或本地 |
| 多节点集群 | 只需在任一 PVE 节点配置一次,整个集群共用;建议用内网 IP,避免跨机房写延迟 |
| 想保留 1 年数据 | InfluxDB UI → Bucket → Edit → Retention 改为 365d,或新建下行 Bucket 做降采样 |
| HTTPS 自签证书 | 把 CA 证书放到 /etc/pve/influxdb-ca.crt 并在 PVE 填写 https://... 即可 |
zabbix主动模式监控ProxmoxVE平台基础指标
1、客户端为pve7.4环境,使用对应agent7.0版本(测试其他低版本获取不到数据)
zabbix agent客户端安装
zabbix-agent7.0官网指引地址 https://www.zabbix.com/cn/download?zabbix=7.0&os_distribution=debian&os_version=11&components=agent&db=&ws=
dpkg -i zabbix-release_7.0-2+debian11_all.deb
apt update #必须更新安装包才能获取7.0版本
apt install zabbix-agent
systemctl restart zabbix-agent
systemctl enable zabbix-agent
2、agent主动模式配置
在agent端的配置文件添加如下参数
模板化配置文件只确定如下参数:
ServerActive=xxxxx:30051 #服务端映射出来的10051端口(建议把10051和10050同时映射出来)
Hostname=192.168.100.11_myy01 #主机名称,主机名称必须跟web页面的名称一致
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 实际配置文件信息 root@myy01:/etc/zabbix# cat zabbix_agentd.conf | grep -v "^\\\|\^#" PidFile=/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server=127.0.0.1 ServerActive=xxxxx:30051 Hostname=192.168.11.253_qh_fhcjf_myy01 Include=/etc/zabbix/zabbix_agentd.d/\*.conf UserParameter=cpu.used,top -b -n1\| awk 'NR==3' \| awk '{print 100-8}' UserParameter=mem.used,free -m | awk 'NR==2{printf "%.2f\n",100-4/2*100}' UserParameter=mem.top,free -g | awk 'NR==2{print2}' UserParameter=swap.used,free -m \| awk 'NR==3{printf "%.2f\\n",3/2\*100}' \| sed 's/-nan/0/p' \| head -1 UserParameter=os.uptime,cat /proc/uptime \|awk '{days=int(1/86400); hours=int((1%86400)/3600); minutes=int((1%3600)/60); seconds=int(1%60); print days "天 " hours ":" minutes ":" seconds}' UserParameter=os.version,pveversion \| awk -F '/' '{print2}' UserParameter=vm.count,ls /etc/pve/qemu-server/| awk -F'.' '1\>1000' \| wc -l UserParameter=temp.cpu0,sensors \| grep "\^Package id 0" \| awk -F'+' '{print2}' | awk -F'°C' '{print1}' UserParameter=temp.cpu1,sensors \| grep "\^Package id 1" \| awk -F'+' '{print2}' | awk -F'°C' '{print1}' UserParameter=temp.connect,sensors \| grep "\^temp1:" \| awk -F'+' '{print2}' | awk -F'°C' '{print1}' UserParameter=clamscan.top,cat /etc/zabbix/scripts/clamscan/clamscan.log \| awk '/Infected files:/{print3}' UserParameter=clamscan.log,cat /etc/zabbix/scripts/clamscan/clamscan.log |
3、添加主机并套用做好的模板

4、模板信息
模板包含基础指标和自定义指标
基础指标如下,根据agent配置文件的UserParameter参数进行实现

自定义指标如下


5、自定义指标获取方式
目录结构

1)通过脚本获取本地需要的日志文件信息,日志文件格式必须首行为表头字段说明,其他行为数据行,首列为监控项名称,其他列为值
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| root@myy01:/etc/zabbix/scripts/pve_mv_status# cat vm_used.sh #!/bin/bash . /etc/profile Os_used_logfile='/etc/zabbix/scripts/pve_mv_status/vm_used.log' Os_status_logfile='/etc/zabbix/scripts/pve_mv_status/vm_status.log' Vm_info_logfile='/etc/zabbix/scripts/pve_mv_status/pve_vm_info.log' Datas=`qm list | awk '{print1"\\t"2"\t"3}' \| awk '{if(1>1000)print}'` echo "{Datas}"\>{Os_status_logfile} Vids=`echo "{Datas}" \| awk 'NR\>1{print1}'` echo -n "">{Os_used_logfile} for i in \`echo "{Vids}"` do Cpu_used=`qm guest exec {i} --timeout 30 wmic cpu get loadpercentage \| grep 'out-data" :' \| grep -o "\[\[:digit:\]\]\*" \| awk '{printf "%.2f\\n",1}'` if [ "{Cpu_used}a" = "a" \];then Cpu_used='0' fi Mem_used=\`qm guest exec {i} --timeout 30 wmic OS get FreePhysicalMemory, TotalVisibleMemorySize /format:list | grep 'out-data" :' | grep -o "[[:digit:]]*" | xargs echo | awk '{printf "%.2f\n",(1-1/2)*100}'` if [ "{Mem_used}a" = "a" \];then Mem_used='0' fi Disk_used=\`qm guest exec {i} --timeout 30 wmic logicaldisk get size,freespace,caption | grep 'out-data" :' | grep -o "[[:digit:]]*" | xargs echo | awk '{print "C "(1-1/2)*100" D "(1-3/4)*100}'` echo "{i} {Cpu_used} {Mem_used} {Disk_used}">>{Os_used_logfile} done printf "%-8s%-16s%-10s%-8s%-8s%-8s%-2s%-8s%-2s%-8s\\n" Vid Name Status Used Cpu Mem C C_used D D_used \>{Vm_info_logfile} for i in `echo "{Vids}"\` do Os_used_data=\`cat {Os_used_logfile} | grep "^{i}" \| awk '{1=""; print}'` Os_status_data=`cat {Os_status_logfile} \| grep "\^{i}"` echo "{Os_status_data} {Os_used_data}">>${Vm_info_logfile} done root@myy01:/etc/zabbix/scripts/pve_mv_status# |
脚本获取的日志文件

2)zabbix自动发现规则所自定义的脚本
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| root@myy01:/etc/zabbix/scripts/pve_mv_status# cat pve_status_check.sh #!/bin/bash EQ_DATA="2" ZBX_REQ_DATA_TAB="1" SOURCE_DATA='/etc/zabbix/scripts/pve_mv_status/pve_vm_info.log' case 2 in Status) grep -E "\^{ZBX_REQ_DATA_TAB}[[:blank:]]" {SOURCE_DATA} \| awk '{print 3}' ;; Cpu) grep -E "^{ZBX_REQ_DATA_TAB}\[\[:blank:\]\]" {SOURCE_DATA} | awk '{print 4}' ;; Mem) grep -E "\^{ZBX_REQ_DATA_TAB}[[:blank:]]" {SOURCE_DATA} \| awk '{print 5}' ;; Cdisk) grep -E "^{ZBX_REQ_DATA_TAB}\[\[:blank:\]\]" {SOURCE_DATA} | awk '{print 7}' ;; Ddisk) grep -E "\^{ZBX_REQ_DATA_TAB}[[:blank:]]" {SOURCE_DATA} \| awk '{print 9}' ;; *) echo ERROR_WRONG_PARAM; exit 1;; esac exit 0 root@myy01:/etc/zabbix/scripts/pve_mv_status# |
| root@myy01:/etc/zabbix/scripts/pve_mv_status# cat pve_status_discovery.sh #!/bin/bash SPLEXPORT2=\`cat /etc/zabbix/scripts/pve_mv_status/pve_vm_info.log \| awk '{print 1}' | awk 'NR > 1{print}' | wc -l` if [ {SPLEXPORT2} -ne 0 \];then SPLEXPORT=\`cat /etc/zabbix/scripts/pve_mv_status/pve_vm_info.log \| awk '{print 1}' | awk 'NR > 1{print}'` COUNT=`echo "{SPLEXPORT}" \| wc -l\` INDEX=0 echo '{"data":\[' echo "{SPLEXPORT}" | while read LINE; do echo -n '{"{#SPLEXPORT}":"'{LINE}'"}' INDEX=\`expr {INDEX} + 1` if [ {INDEX} -lt {COUNT} ];then echo "," fi done echo ']}' fi |
3)zabbix 自定义监控项阈值参数
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| root@myy01:/etc/zabbix/scripts/pve_mv_status# cd /etc/zabbix/zabbix_agentd.d/ root@myy01:/etc/zabbix/zabbix_agentd.d# cat pve_status.conf UserParameter=pve.status.discovery, /bin/sh /etc/zabbix/scripts/pve_mv_status/pve_status_discovery.sh UserParameter=pve.status[*], /bin/sh /etc/zabbix/scripts/pve_mv_status/pve_status_check.sh 1 2 |
4)配置计划任务,实现自动获取监控数据
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| root@myy03:/etc/zabbix/zabbix_agentd.d# crontab -l #zabbix */30 * * * * sh /etc/zabbix/scripts/pve_mv_status/vm_used.sh */5 * * * * sh /etc/zabbix/scripts/pve_sysfile_info/pve_sysfile_info.sh |
6、配置zabbix模板
1)创建模板

2)创建自动发现规则

3)创建监控项

4)创建触发器

6、查看监监控项数据

7、查看告警信息
