为 Proxmox VE 的 web 管理界面添加硬件温度显示

安装温度检测工具

CPU 及主板温度检测:lm-sensors

[email protected]:~# apt install lm-sensors

安装完成后执行 sensors-detect 进行传感器探测,通常情况下全部默认选择 yes 即可

探测完成后执行 sensors 测试传感器

[email protected]:~# sensors
acpitz-acpi-0
Adapter: ACPI interface
temp1:        +56.0°C  (crit = +120.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +57.0°C  (high = +84.0°C, crit = +100.0°C)
Core 0:        +57.0°C  (high = +84.0°C, crit = +100.0°C)
Core 1:        +55.0°C  (high = +84.0°C, crit = +100.0°C)
Core 2:        +52.0°C  (high = +84.0°C, crit = +100.0°C)
Core 3:        +54.0°C  (high = +84.0°C, crit = +100.0°C)

在如上输出中,“acpitz-acpi-0” 是主板温度,“coretemp-isa-0000” 是 CPU 温度

硬盘温度检测:hddtemp

[email protected]:~# apt install hddtemp

安装完成后执行 hddtemp /dev/sd? 测试传感器

[email protected]:~# hddtemp /dev/sd?
/dev/sda: WDC WD40EZRZ-00WN9B0: 29°C
/dev/sdb: ADATA SP600: 26°C
/dev/sdc: WD2500: 29°C
/dev/sdd: ADATA SP900: 38°C

由于 PVE 的 web 服务以用户 www-data 身份运行,需要修改 hddtemp 的权限

[email protected]:~# chmod +s /usr/sbin/hddtemp

编辑 PVE web 服务文件

Nodes.pm

编辑文件 /usr/share/perl5/PVE/API2/Nodes.pm,跳转到 my $dinfo = df('/', 1); 位置,编辑成如下所示

# ...[OMITTED]...
        $res->{pveversion} = PVE::pvecfg::package() . "/" .
            PVE::pvecfg::version_text();

        $res->{temperatures} = `sensors`;  # 添加此行以获取 CPU 与主板温度

        $res->{hdd_temperatures} = `hddtemp /dev/sd?`;  # 添加此行以获取硬盘温度

        my $dinfo = df('/', 1);     # output is bytes
# ...[OMITTED]...

pvemanagerlib.js

修改页面样式以完整显示数据

编辑文件 /usr/share/pve-manager/js/pvemanagerlib.js,跳转到 gettext('Status') + ': ' + zpool, 位置,编辑成如下所示

// ...[OMITTED]...
 var win = Ext.create('Ext.window.Window', {
            modal: true,
            width: 800,
            height: 500,  // 原始值为 400
            resizable: true,
            layout: 'fit',
            title: gettext('Status') + ': ' + zpool,
            items:[{
// ...[OMITTED]...

跳转到 widget.pveNodeStatus 位置,编辑成如下所示

// ...[OMITTED]...
Ext.define('PVE.node.StatusView', {
    extend: 'PVE.panel.StatusView',
    alias: 'widget.pveNodeStatus',

    height: 400,  // 原始值为 300
    bodyPadding: '20 15 20 15',

    layout: {
// ...[OMITTED]...

两处 height 的值需按情况修改,每多一行数据增加 20

如有一行 CPU 与主板温度数据、三行硬盘温度数据(3 块硬盘),即为 480 与 380

添加显示内容

跳转到 PVE Manager Version 位置,编辑成如下所示

// ...[OMITTED]...
        {
            itemId: 'version',
            colspan: 2,
            printBar: false,
            title: gettext('PVE Manager Version'),
            textField: 'pveversion',
            value: ''
        },  // 注意添加逗号
        {
            itemId: 'temperatures',
            colspan: 2,
            printBar: false,
            title: gettext('Temperatures'),
            textField: 'temperatures',
            renderer: function (value) {
                const p0 = value.match(/Package id 0.*?\+([\d\.]+)?/)[1];
                const b0 = value.match(/temp1.*?\+([\d\.]+)?/)[1];
                const c0 = value.match(/Core 0.*?\+([\d\.]+)?/)[1];
                const c1 = value.match(/Core 1.*?\+([\d\.]+)?/)[1];
                const c2 = value.match(/Core 2.*?\+([\d\.]+)?/)[1];
                const c3 = value.match(/Core 3.*?\+([\d\.]+)?/)[1];

                return `CPU: ${p0}°C (${c0}°C, ${c1}°C, ${c2}°C, ${c3}°C) | Board: ${b0}°C`
            }
        },
        {
            itemId: 'hdd-temperatures',
            colspan: 2,
            printBar: false,
            title: gettext('HDD Temperatures'),
            textField: 'hdd_temperatures',
            renderer: function (value) {
                return value.replace(/\n/g, '<br>')
            }
        }
    ],
// ...[OMITTED]...

renderer 中获取数据的正则与返回值需按情况修改

完成

执行 systemctl restart pveproxy 重启 PVE web 服务

在浏览器中清除 PVE 控制台的缓存,重新加载即可在节点概要显示温度信息

final

如果硬盘温度信息中出现 “” 字符,可能是某处编码设置有问题,可在 pvemanagerlib.js 的 renderer 函数开头添加 value = value.replace(/Â/g, '');


10 条评论

朱俊 · 2020-03-23 08:01

我一直是显示载入中6.1.3我是哪里设置错误了吗

    Admin · 2020-03-30 03:38

    我猜是语法错误 文件里漏了逗号或分号之类的情况

yexusky · 2020-03-17 07:21

6.1-8 最新版本不行了 显示不了cpu温度和硬盘都显示不了

    Admin · 2020-03-17 13:40

    刚刚更新后试了一下可以正常显示,建议清理一下网页资源缓存,可能是那个 JS 有缓存导致不展示

Gavin · 2020-02-02 01:29

Thanks, 按照操作加上了温度。 主要我CPU是2 cores,调整了一下js的代码,感谢哈!

    zhlgdl · 2020-03-08 18:46

    我按照这个教程做了,但还是无法显示,我的是5.4.3,硬盘那个感测程序也是无法下载

      Admin · 2020-03-13 17:43

      无法下载是指 apt install 出错?

goohoo · 2020-01-31 21:38

请问‘value = value.replace(/Â/g, ”);’添加在什么地方啊,硬盘温度确实出现 “” 字符了,感谢!

    Admin · 2020-02-06 12:26

    {
        itemId: 'hdd-temperatures',
        colspan: 2,
        printBar: false,
        title: gettext('HDD Temperatures'),
        textField: 'hdd_temperatures',
        renderer: function (value) {
          value = value.replace(/Â/g, '');  // 添加在这里
          return value.replace(/\n/g, '<br>')
        }
    }
    

      goohoo · 2020-02-06 12:52

      感谢大佬,OK

发表评论

电子邮件地址不会被公开。 必填项已用*标注