PVE显示CPU和SSD温度
PVE显示CPU和SSD温度
某早上发现主机风扇呲呲作响,就想把CPU温度显示在PVE上作为指标观察。
环境信息
PVE版本信息
root@:~# pveversion -v
proxmox-ve: 8.4.0 (running kernel: 6.8.12-15-pve)
pve-manager: 8.4.14 (running version: 8.4.14/b502d23c55afcba1)
proxmox-kernel-helper: 8.1.4
proxmox-kernel-6.8: 6.8.12-15操作步骤
确保 lm-sensors 已安装并配置
- 安装
lm-sensors:apt update && apt install lm-sensors -y - 运行温度探测(如果您之前未运行过,请全部回答
y):sensors-detect - 确保可以探测温度
root@:~# sensors
coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +57.0°C (high = +100.0°C, crit = +100.0°C)
Core 0: +50.0°C (high = +100.0°C, crit = +100.0°C)
Core 4: +53.0°C (high = +100.0°C, crit = +100.0°C)
Core 8: +54.0°C (high = +100.0°C, crit = +100.0°C)
Core 12: +57.0°C (high = +100.0°C, crit = +100.0°C)
Core 16: +45.0°C (high = +100.0°C, crit = +100.0°C)
Core 17: +45.0°C (high = +100.0°C, crit = +100.0°C)
Core 18: +45.0°C (high = +100.0°C, crit = +100.0°C)
Core 19: +45.0°C (high = +100.0°C, crit = +100.0°C)
Core 20: +43.0°C (high = +100.0°C, crit = +100.0°C)
Core 21: +43.0°C (high = +100.0°C, crit = +100.0°C)
Core 22: +43.0°C (high = +100.0°C, crit = +100.0°C)
Core 23: +43.0°C (high = +100.0°C, crit = +100.0°C)
acpitz-acpi-0
Adapter: ACPI interface
temp1: +0.0°C
iwlwifi_1-virtual-0
Adapter: Virtual device
temp1: N/A
nvme-pci-0200
Adapter: PCI adapter
Composite: +47.9°C (low = -0.1°C, high = +84.8°C)
(crit = +94.8°C)
Sensor 1: +47.9°C (low = -273.1°C, high = +65261.8°C)
Sensor 2: +55.9°C (low = -273.1°C, high = +65261.8°C)
Sensor 8: +47.9°C (low = -273.1°C, high = +65261.8°C)修改 API 文件以采集温度信息
修改
/usr/share/perl5/PVE/API2/Nodes.pm文件,让 PVE 的 API 收集sensors命令的输出。
记得备份一下哈
编辑文件:
nano /usr/share/perl5/PVE/API2/Nodes.pm查找代码行:
使用Ctrl + W搜索以下代码块中的关键部分,例如shared => $meminfo->{memshared}:# 原始代码通常在文件末尾附近 $res->{ksm} = { shared => $meminfo->{memshared}, };在后面添加一行代码:
在上面代码块的下方(即在$res->{ksm}之后,}分号之前)插入一行,如下所示(新增行已加粗):$res->{ksm} = { shared => $meminfo->{memshared}, }; # 在这里添加 $res->{sensinfo} = `sensors`;$res->{sensinfo} = \sensors`;这行命令的作用是执行sensors命令,并将完整的输出赋值给sensinfo` 变量,供前端 JavaScript 使用。保存并退出(
Ctrl + O,Enter,Ctrl + X)。
修改前端 JS 文件以显示温度
修改
/usr/share/pve-manager/js/pvemanagerlib.js文件,使用 JavaScript 正则表达式从sensinfo变量中提取您的温度数据。
记得备份一下哈
编辑文件:
nano /usr/share/pve-manager/js/pvemanagerlib.js查找位置:
使用Ctrl + W搜索关键词textField: 'pveversion',您会找到类似以下结构的代码块(注意块之间的逗号):{ itemId: 'version', colspan: 2, printBar: false, title: gettext('PVE Manager Version'), textField: 'pveversion', value: '', }, // <--- 在这个逗号之后插入新代码块插入自定义代码:
在找到的代码块之后,插入以下代码块。这个代码块使用了您的sensors输出(Package id 0和nvme-pci-0200的 Composite)来提取温度。
// 下面是新增的温度显示代码块
{
itemId: 'sensinfo',
colspan: 2,
printBar: false,
title: gettext('Temperature'), // 显示标题
textField: 'sensinfo',
renderer:function(value){
try {
// 提取 "Package id 0" 的温度 (CPU封装温度)
const cpuTemp = value.match(/Package id 0:\s*\+([\d\.]+)/)[1];
// 提取 "nvme-pci-0200" 的 Composite 温度 (NVMe SSD温度)
// 注意: \s\S*? 是为了匹配多行内容
const nvmeTemp = value.match(/nvme-pci-0200[\s\S]*?Composite:\s*\+([\d\.]+)/)[1];
return `CPU: ${cpuTemp}°C | NVMe: ${nvmeTemp}°C`;
} catch (error) {
return 'N/A';
}
},
}, // 确保这个代码块后面也有逗号,如果文件中有其他代码块跟随检查逗号:请确保您插入的代码块与它前面的代码块之间有逗号分隔,并且如果后面还有其他代码块,您的新代码块末尾也需要一个逗号
,。保存并退出(
Ctrl + O,Enter,Ctrl + X)。
重启 PVE Web 界面服务
systemctl restart pveproxy刷新查看结果
清除浏览器缓存(非常重要,通常按
Ctrl + F5或Shift + F5),然后登录 PVE Web 界面,点击您的 节点 -> 概要 (Summary) 页面。
结果
Temperature CPU: 57.0°C | NVMe: 45.9°C
shell脚本输出温度
#!/bin/bash
# 日志文件路径
LOG_FILE="/root/temperature.info"
# ----------------------------------------------------
# 1. 获取当前时间戳
# ----------------------------------------------------
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
# ----------------------------------------------------
# 2. 执行一次 sensors 命令并将完整输出存储到变量
# ----------------------------------------------------
SENSORS_OUTPUT=$(sensors)
# ----------------------------------------------------
# 3. 从变量中提取 CPU 封装温度 (Package id 0)
# ----------------------------------------------------
# 提取 logic: echo 变量内容 -> grep 匹配行 -> awk 取第4列 (温度值+单位) -> tr 去除多余符号
# 示例: +61.0°C
CPU_TEMP=$(echo "$SENSORS_OUTPUT" | grep 'Package id 0:' | awk '{print $4}' | tr -d '+°C')
# ----------------------------------------------------
# 4. 从变量中提取 NVMe 复合温度 (nvme-pci-0200 Composite)
# ----------------------------------------------------
# 提取 logic: echo 变量内容 -> grep -A 匹配 NVMe 块及后续行 -> grep 筛选 Composite 行 -> awk 取第2列 -> tr 去除多余符号
NVME_TEMP=$(echo "$SENSORS_OUTPUT" | grep -A 5 'nvme-pci-0200' | grep 'Composite:' | awk '{print $2}' | tr -d '+°C')
# ----------------------------------------------------
# 5. 格式化输出并追加到文件
# ----------------------------------------------------
if [[ -n "$CPU_TEMP" && -n "$NVME_TEMP" ]]; then
# 格式: [时间] | CPU: [温度]°C | NVMe: [温度]°C
echo "$TIMESTAMP | CPU: ${CPU_TEMP}°C | NVMe: ${NVME_TEMP}°C" >> "$LOG_FILE"
else
# 如果任一温度值提取失败,则记录错误信息
echo "$TIMESTAMP | ERROR: Temperature reading failed. CPU:$CPU_TEMP, NVMe:$NVME_TEMP" >> "$LOG_FILE"
fi