PVE7.2-7管理面板展示CPU、主板、NVME温度

本文将介绍如何在PVE7.2-7后台管理面板,展示CPU、主板、NVME的温度。

在 PVE 中安装温度检测控件

在 PVE 后台选择 PVE 节点,并选择“Shell”。

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

apt-get install lm-sensors

安装完成后执行命令 sensors-detect 识别温度传感器,一直按Enter选择默认即可。

识别后再执行命令 sensors 获取温度信息。返回信息大概如下:

root@pve:~# sensors
coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +34.0°C  (high = +105.0°C, crit = +105.0°C)
Core 0:        +29.0°C  (high = +105.0°C, crit = +105.0°C)
Core 1:        +29.0°C  (high = +105.0°C, crit = +105.0°C)
Core 2:        +29.0°C  (high = +105.0°C, crit = +105.0°C)
Core 3:        +29.0°C  (high = +105.0°C, crit = +105.0°C)

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

nvme-pci-0100
Adapter: PCI adapter
Composite:    +36.9°C  (low  =  -5.2°C, high = +79.8°C)
                       (crit = +84.8°C)

“coretemp-isa-0000”是 CPU 温度,如果是多核CPU则会分别展示每个核心的温度。“acpitz-acpi-0”是主板温度。“nvme-pci-0100”是NVME的温度。

硬盘温度检测控件:hddtemp

apt-get install hddtemp

安装完成后再执行命令 hddtemp /dev/sd? 获取温度信息。返回信息大概如下:

root@pve:~# hddtemp /dev/sd?
/dev/sda: XXX: 29°C
/dev/sdb: XXX: 26°C

需要修改下 hddtemp 命令的权限,否则PVE的后台面板无法正常获取温度信息。

chmod +s /usr/sbin/hddtemp

编辑 PVE 后台面板界面文件

第一个文件:Nodes.pm

首先备份下,方便恢复:

cp /usr/share/perl5/PVE/API2/Nodes.pm /usr/share/perl5/PVE/API2/Nodes.pm.bak

编辑 Nodes.pm 文件:

nano /usr/share/perl5/PVE/API2/Nodes.pm

PVE::pvecfg::version_text(); 后增加如下行:

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

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

第二个文件:pvemanagerlib.js

首先备份下,方便恢复:

cp /usr/share/pve-manager/js/pvemanagerlib.js /usr/share/pve-manager/js/pvemanagerlib.js.bak

编辑 pvemanagerlib.js 文件:

nano /usr/share/pve-manager/js/pvemanagerlib.js

Ext.window.Window 下找到 height ,将高度改为500。在 pveNodeStatus 下找到 height ,将高度改为400(可能会稍高,有些留白)。这两个 height 的需要按实际情况修改,每多一行数据高度需要增加 20。

接着在 PVE Manager Version 后增加如下行:

{
  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);

      let nvmeTemp = value.match(/^nvme-pci-\d+$\n.*?\n^Composite:\s*([^°]+).*$/m);
      if (nvmeTemp.length > 0) {
          output += `NVME: ${nvmeTemp[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>')
    }
},

完成

执行命令重启 PVE 后台管理面板服务:

systemctl restart pveproxy

发表回复

您的电子邮箱地址不会被公开。