背景
最近把机器放进柜子,需要关注CPU温度决定是否更换风扇。需要在web界面上显示温度(命令行也可查询)。
我的pve版本:
pve-manager/7.3-3
CPU:J4125
步骤
这里仅记录主要步骤和一些不一样的地方,其他详细步骤请查看网上其他教程或参考链接。遇到问题主要有两个:
- 遇到了hddtemp没有拿到结果,硬盘温度不显示的问题。由pve用户权限不足引起,通过set +s解决。
- 更新完代码,刷新网页没有生效。发现清理网页缓存再刷新就可以了。(可以用DevTools,或自行搜索教程)
准备工作
- 安装Sensors
执行apt-get install lm-sensors
安装,可能需要良好网络环境。 - 运行传感器检测(某些情况下可选)
执行sensors-detect
,一般来说一路回车即可。 - 测试打印传感器数据
执行sensors
,会打印出主板温度、封装温度、核心温度、风扇转速等,实际取决于可用的传感器,但核心温度基本都有。后面我们会使用sensors -j
这个命令,输出JSON解析方便。 - 安装hddtemp
执行apt-get install hddtemp
安装,可能需要良好网络环境。 - 测试打印硬盘温度
执行hddtemp /dev/sd?
看是否能打印出设备温度。
如果没有的话,可以执行lsblk
看看是不是有nvme的设备,更换一下命令后面的设备名试一下,如果不行就需要用smartctl之类的工具获取温度了。 -
允许普通用户运行hddtemp(可选)
如果后续无法在web页面上显示硬盘温度,则需要执行此步骤。执行chmod +s /usr/sbin/hddtemp
,这将允许所有用户以root身份执行此文件。默认情况下,pveproxy似乎是以www-data身份执行的,这样获取不到内容。
配置页面
- 备份文件
cp /usr/share/perl5/PVE/API2/Nodes.pm /usr/share/perl5/PVE/API2/Nodes.pm.bak
cp /usr/share/pve-manager/js/pvemanagerlib.js /usr/share/pve-manager/js/pvemanager
- 编辑pm文件
编辑/usr/share/perl5/PVE/API2/Nodes.pm
,搜索pveversion
快速直达此部分。新增了两行,如下代码块所示。
...
$res->{swap} = {
free => $meminfo->{swapfree},
total => $meminfo->{swaptotal},
used => $meminfo->{swapused},
};
$res->{pveversion} = PVE::pvecfg::package() . "/" .
PVE::pvecfg::version_text();
$res->{thermal_cpu} = `sensors -j`; # <---这行新增
$res->{thermal_hdd} = `hddtemp /dev/sd?`; # <---这行新增
my $dinfo = df('/', 1);
$res->{rootfs} = {
total => $dinfo->{blocks},
avail => $dinfo->{bavail},
used => $dinfo->{used},
free => $dinfo->{blocks} - $dinfo->{used},
};
...
- 编辑js文件
编辑/usr/share/pve-manager/js/pvemanagerlib.js
。
第一部分,修改显示框高度。搜索pveNodeStatus
快速直达此部分。此处建议先加100,然后根据效果以20为单位修改。
...
Ext.define('PVE.node.StatusView', {
extend: 'Proxmox.panel.StatusView',
alias: 'widget.pveNodeStatus',
height: 380, // 增加这行的值,原始值300
bodyPadding: '15 5 15 5',
...
第二部分,增加内容块。搜索pveversion
快速直达此部分。此处可以直接根据js语法修改,有不懂的可以问GPT(或问心一言等)。
...
{
itemId: 'version',
colspan: 2,
printBar: false,
title: gettext('PVE Manager Version'),
textField: 'pveversion',
value: '',
},
// ======== 从这里开始是添加的内容(缩进和换行不重要) ========
{
itemId: 'thermal-cpu', // 这个值不重要,但别和别的itemId重复了
colspan: 2,
printBar: false,
title: gettext('CPU Temperature'), // 字段显示标题,可自行修改
textField: 'thermal_cpu', // 这里的值和前面的pm文件对应
renderer: function(value) {
value = JSON.parse(value);
const c0 = value['coretemp-isa-0000']['Core 0']['temp2_input'].toFixed(1);
const c1 = value['coretemp-isa-0000']['Core 1']['temp3_input'].toFixed(1);
const c2 = value['coretemp-isa-0000']['Core 2']['temp4_input'].toFixed(1);
const c3 = value['coretemp-isa-0000']['Core 3']['temp5_input'].toFixed(1);
return `CPU核心温度: ${c0}℃ | ${c1}℃ | ${c2}℃ | ${c3}℃`;
}
},
{
itemId: 'thermal-hdd',
colspan: 2,
printBar: false,
title: gettext('HDD Temperature'),
textField: 'thermal_hdd',
renderer: function(value) {
value = value.replaceAll('Â', ''); // 硬盘输出的结果在摄氏度前面确实有这个乱码,替换一下
return value.replaceAll('\n', '<br/>');
}
},
// ======== 添加的内容到这里结束 ========
],
...
- 重启pveproxy服务
执行systemctl restart pveproxy
,浏览器刷新如果不生效,记得清空缓存再刷新。 -
效果