Proxmox VE web 界面添加硬件温度显示

安装温度检测工具

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

[email protected]:~$ sudo 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]:~$ sudo apt install hddtemp

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

[email protected]:~$ sudo 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]:~$ sudo 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

例如有 1 行 CPU 与主板温度数据、3 行硬盘温度数据(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) {
                value = value.replace(/Â/g, '');
                let data = [];
                let cpus = value.matchAll(/^coretemp-isa-(\d{4})$\n.*?\n((?:Package|Core)[\s\S]*?^\n)+/gm);
                for (const cpu of cpus) {
                    let cpuNumber = parseInt(cpu[1], 10);
                    data[cpuNumber] = {
                        packages: [],
                        cores: []
                    };

                    let packages = cpu[2].matchAll(/^Package id \d+:\s*([^°]+).*$/gm);
                    for (const package of packages) {
                        data[cpuNumber]['packages'].push(package[1]);
                    }

                    let cores = cpu[2].matchAll(/^Core \d+:\s*([^°]+).*$/gm);
                    for (const core of cores) {
                        data[cpuNumber]['cores'].push(core[1]);
                    }
                }

                let output = '';
                for (const [i, cpu] of data.entries()) {
                    output += `CPU ${i}: `;
                    if (cpu.packages.length > 0) {
                        for (const packageTemp of cpu.packages) {
                            output += `${packageTemp}°C `;
                        }
                    }
                    if (cpu.cores.length > 0) {
                        output += '(';
                        for (const coreTemp of cpu.cores) {
                            output += `${coreTemp}, `;
                        }
                        output = output.slice(0, -2);
                        output += ')°C';
                    }
                    output += ' | ';
                }

                let boardTemp = value.match(/^acpitz-acpi-\d+$\n.*?\n^temp1:\s*([^°]+).*$/m);
                if (boardTemp.length > 0) {
                    output += `Board: ${boardTemp[1]}°C | `
                }
                output = output.slice(0, -3);

                return output;
            }
        },
        {
            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>')
            }
        }
    ],
// ...[OMITTED]...

其中处理数据的正则式与返回值可能需按实际情况进行修改

完成

执行 systemctl restart pveproxy 重启 PVE web 服务

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

final

Categories: Linux

37 Comments

goohoo · 2020-01-31 at 21:38

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

    Admin · 2020-02-06 at 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 at 12:52

      感谢大佬,OK

Gavin · 2020-02-02 at 01:29

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

    zhlgdl · 2020-03-08 at 18:46

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

      Admin · 2020-03-13 at 17:43

      无法下载是指 apt install 出错?

yexusky · 2020-03-17 at 07:21

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

    Admin · 2020-03-17 at 13:40

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

朱俊 · 2020-03-23 at 08:01

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

    Admin · 2020-03-30 at 03:38

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

Ganas · 2020-04-21 at 05:47

大佬,我的sensors显示如下,按你的正则,主板温度那个语句应该是不行,求指点,改怎么改?正则真的是一窍不通。感谢大佬!
soc_dts0-virtual-0
Adapter: Virtual device
temp1: +46.0°C

acpitz-acpi-0
Adapter: ACPI interface
temp1: +26.8°C (crit = +90.0°C)

soc_dts1-virtual-0
Adapter: Virtual device
temp1: +47.0°C

coretemp-isa-0000
Adapter: ISA adapter
Core 0: +45.0°C (high = +105.0°C, crit = +105.0°C)
Core 1: +45.0°C (high = +105.0°C, crit = +105.0°C)
Core 2: +46.0°C (high = +105.0°C, crit = +105.0°C)
Core 3: +46.0°C (high = +105.0°C, crit = +105.0°C)

    Admin · 2020-04-26 at 19:12

    const b0 的正则改为 “/^acpitz-acpi-\d+\n.*\ntemp1.*?+([\d.]+)?/m”

幸福的井底蛙 · 2020-05-16 at 18:09

改完,如果更新了pve,然后就。。。。。没了::>_<::

    幸福的井底蛙 · 2020-05-16 at 19:46

    在pve6.2.4上失效了,修改后pve web就打不开了

    Admin · 2020-07-04 at 10:34

    是的 每次更新PVE会覆盖文件

mycsun · 2020-06-01 at 04:55

6.2-4改了,不显示出不了!!!

li · 2020-07-01 at 01:22

我的6.2-4在进入编辑文件 /usr/share/perl5/PVE/API2/Nodes.pm,跳转到 my $dinfo = df('/', 1); 位置,无法跳转快捷键是什么

li · 2020-07-01 at 17:33

编辑文件 /usr/share/perl5/PVE/API2/Nodes.pm,跳转到 my $dinfo = df('/', 1); 位置,编辑成如下所示 大佬能指点下怎么快捷键跳转吗 我的版本6.2-4全部按遍了也都没反应

    Admin · 2020-07-04 at 10:33

    如果用的是vim 就是按“/” 然后输入“my $dinfo = df('/', 1);” 然后回车

失落的表白 · 2020-07-03 at 01:14

我一直是显示载入中6.2.4我是哪里设置错误了吗?怎么联系你,帮我修改一下

    Admin · 2020-07-04 at 10:31

    应该是漏了逗号引号之类的情况

coco · 2020-07-04 at 12:44

大佬,我的sensors显示如下,我没有主板的的温度就不要了,但是我有张i350 PCI的独立网卡,怎么显示这网卡温度呢,我自己试着在你的那个函数上把主板的改成我网卡的但是没成功,求回答
[email protected]:~# sensors
i350bb-pci-0100
Adapter: PCI adapter
loc1: +55.0°C (high = +120.0°C, crit = +110.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +46.0°C (high = +90.0°C, crit = +94.0°C)
Core 0: +47.0°C (high = +90.0°C, crit = +94.0°C)
Core 1: +46.0°C (high = +90.0°C, crit = +94.0°C)
Core 2: +41.0°C (high = +90.0°C, crit = +94.0°C)
Core 3: +43.0°C (high = +90.0°C, crit = +94.0°C)

    Admin · 2021-02-03 at 09:01

    把原文获取主板温度那边的正则改成 /^loc1: \+([^°]+).*$/m,另外的格式你自己改一下就行了

BigLilo · 2020-07-05 at 08:16

感谢作者
为啥我根据你的方法增加硬盘温度显示为空,我只有1块硬盘,为/dev/sda
请问如何修改下?

Biglio · 2020-07-05 at 08:24

感谢作者
找到原因了,忘了给hddtemp 加权限。
打扰了。

zjdxsj · 2020-07-31 at 23:30

我也是最新版6.2.4,改完之后web界面一片空白,然后删除改动的,还原回去还是一片空白。没有备份原始文件,如何修复啊 。。撑到下一次更新能恢复吗,求大神指点

    Admin · 2021-02-03 at 09:05

    一般PVE更新的时候会被新版本文件覆盖

jiang · 2020-09-22 at 01:25

我改完以后一直显示载入中

    Admin · 2021-02-03 at 09:04

    一般是脚本里有语法错误

飞飞 · 2020-10-03 at 04:40

大佬问下怎么添加风扇的转数显示,我的能获取到转数的数值fan1和fan2

    Admin · 2021-02-03 at 09:04

    需要改正则式,你可以发一下样例看看

jingsheng · 2020-11-22 at 01:21

Virtual Environment 6.2-4
修改后,那个显示CPU温度与硬盘那一直在转圈,但是CPU IO那些占用都还会刷新的
CPU温度跟硬盘温度不显示

    Admin · 2021-02-03 at 08:53

    应该是脚本有地方写错了,建议拷出来用带语法检查的编辑器修改

uioprr · 2021-02-02 at 21:11

非常感谢博主的分享,请教一下,我不是码农研究了一下,想把CPU温度和HDD温度显示在一行中
怎么用正则取硬盘的温度:返回值是:/dev/sda: Asgard AS2TS3-S7: 46°C,只需要取中间的46。

    Admin · 2021-02-03 at 08:51

    ^\/dev.*: (\d+)°C$/m
    这样应该可以

k2s · 2021-09-24 at 16:50

大佬你好,我想显示风扇的转速,但我用了其他教程的js代码,结果不行。。是不是正则写得不对?获取CPU主板温度是可以的,求解答。
fan1: 0 RPM (min = 0 RPM)
fan2: 0 RPM (min = 0 RPM)

const f0 = value.match(/fan1.*?+([\d.]+)?/)[1];

    zry98 · 2021-09-25 at 00:51

    可以试试 /fan1:.*([\d.]+) R/

Leave a Reply to Gavin Cancel reply

Avatar placeholder

Your email address will not be published. Required fields are marked *