GXNAS博客

  • 博客会员
    • 注册会员
    • 重置密码
  • 博客文章分类
    • NAS
    • 虚拟化技术
    • 路由器
    • 网站
    • Linux
    • Windows
    • IPTV
    • 游戏
    • 资源下载
    • 其他
  • ”零刻迷你主机“玩机教程
    • 零刻EQ12迷你小主机评测
    • 零刻SER5 5500U打造新潮派HTPC
    • 零刻SEi10玩ESXI+群晖NAS+Ubuntu
    • 零刻EQ13化身迷你静音省电的NAS
    • 零刻EQ13部署双软路由教程
    • 零刻ME Mini搭建群晖NAS教程
  • 阿里云盘资源
    • 阿里云盘资源更新日志
    • 阿里云盘资源分享
    • 阿里云盘扩容福利码
  • 【GXNAS网盘】
  • 【GXNAS小工具】
    • 免费AI绘图
    • 五子棋小游戏
  • 请博主喝奶茶
GXNAS博客
https://wp.gxnas.com
  1. 首页
  2. 虚拟化技术
  3. 博文内容

ProxmoxVE(PVE) 7.1-x 在主界面添加CPU频率/CPU温度/硬盘温度

发布时间:2022年4月21日 36084次浏览 10人点赞 42条评论

【折腾须知】

#本教程目前仅在PVE7.1-X的版本下运行正常,在PVE7.2-X版本下和其他的版本不一定能用;

#修改文件之前,最好先备份文件,万一有问题还有机会还原。

1.登录PVE的SSH,执行命令安装sensors:

apt-get install lm-sensors

2.探测下温度,执行:(一路yes,回车)

sensors-detect

3.获取温度信息,执行:sensors

jpg

  • ACPI interface那里是主板温度:temp1和temp2 (有些主板不一样,建议不管主板温度)

  • ISA adapter那里是CPU温度:Core0和Core1 (几个核心就是显示几个,演示机只有双核,所以只有2个)

a) 如果是全新安装,需要安装工具并重启 pveproxy 服务:

apt-get install lm-sensors && apt-get install nvme-cli && apt-get install hddtemp && chmod +s /usr/sbin/nvme && chmod +s /usr/sbin/hddtemp && chmod +s /usr/sbin/smartctl && systemctl restart pveproxy

b) 如果是更新脚本,只需要重启 pveproxy 服务:

systemctl restart pveproxy

4.WinSCP登录到PVE,修改这个文件:/usr/share/perl5/PVE/API2/Nodes.pm

(我习惯于下载到本地用Notepad++修改)

搜索:

$res->{pveversion} = PVE::pvecfg::package()

在这个定义的下方添加:

$res->{thermalstate} = `sensors`;

结果如图:

jpg

修改完保存,然后塞回路径。

5.修改这个文件:/usr/share/pve-manager/js/pvemanagerlib.js (建议备份,万一自己改炸就不好了。)

搜索PVE Manager Version

jpg

  • 在这个定义的下方添加一个定义:
	{
          itemId: 'thermal',
          colspan: 2,
          printBar: false,
          title: gettext('CPU温度'),
          textField: 'thermalstate',
          renderer:function(value){
              const p0 = value.match(/Package id 0.*?\+([\d\.]+)Â/)[1];
              const c0 = value.match(/Core 0.*?\+([\d\.]+)Â/)[1];
              const c1 = value.match(/Core 1.*?\+([\d\.]+)Â/)[1];
              const b0 = value.match(/temp1.*?\+([\d\.]+)?/)[1];
              const b1 = value.match(/temp2.*?\+([\d\.]+)?/)[1];
              return `Package: ${p0} ℃ || 核心1: ${c0} ℃ | 核心2: ${c1} ℃ || 主板: ${b0} ℃ | ${b1} ℃ `
            }
    },

结果如图: jpg

因为我是双核心,所以只写了2个核心的温度参数。

  • 如果不要加入主板温度,就是这样:
	{
          itemId: 'thermal',
          colspan: 2,
          printBar: false,
          title: gettext('CPU温度'),
          textField: 'thermalstate',
          renderer:function(value){
              const p0 = value.match(/Package id 0.*?\+([\d\.]+)Â/)[1];
              const c0 = value.match(/Core 0.*?\+([\d\.]+)Â/)[1];
              const c1 = value.match(/Core 1.*?\+([\d\.]+)Â/)[1];
              return `Package: ${p0} ℃ || 核心1: ${c0} ℃ | 核心2: ${c1} ℃ `
            }
    },
  • 如果是四核心的就是这样:
	{
          itemId: 'thermal',
          colspan: 2,
          printBar: false,
          title: gettext('CPU温度'),
          textField: 'thermalstate',
          renderer:function(value){
              const p0 = value.match(/Package id 0.*?\+([\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];
              const b0 = value.match(/temp1.*?\+([\d\.]+)?/)[1];
              const b1 = value.match(/temp2.*?\+([\d\.]+)?/)[1];
              return `Package: ${p0} ℃ || 核心1: ${c0} ℃ | 核心2: ${c1} ℃ | 核心3: ${c2} ℃ | 核心4: ${c3} ℃ || 主板: ${b0} ℃ | ${b1} ℃ `
            }
    },	  
  • 如果是四核心不要加入主板温度就是这样:
	{
          itemId: 'thermal',
          colspan: 2,
          printBar: false,
          title: gettext('CPU温度'),
          textField: 'thermalstate',
          renderer:function(value){
              const p0 = value.match(/Package id 0.*?\+([\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 `Package: ${p0} ℃ || 核心1: ${c0} ℃ | 核心2: ${c1} ℃ | 核心3: ${c2} ℃ | 核心4: ${c3} ℃ `
            }
    },	  
  • 所以自己设备几个核心,按需修改。修改完保存,然后塞回路径。

6.改完重启进PVE主页,就看到温度显示了。

jpg

  • 扩展下,主界面添加CPU频率,显示在温度下面:

  • 也是修改 /usr/share/perl5/PVE/API2/Nodes.pm 和 /usr/share/pve-manager/js/pvemanagerlib.js 这2个文件

  • /usr/share/perl5/PVE/API2/Nodes.pm 刚刚修改温度的下一行添加:

$res->{cpusensors} = `lscpu | grep MHz`;

jpg

  • /usr/share/pve-manager/js/pvemanagerlib.js 刚刚修改温度的下一行添加:
	{
          itemId: 'MHz',
          colspan: 2,
          printBar: false,
          title: gettext('CPU频率'),
          textField: 'cpusensors',
          renderer:function(value){
			  const f0 = value.match(/CPU MHz.*?([\d]+)/)[1];
			  const f1 = value.match(/CPU min MHz.*?([\d]+)/)[1];
			  const f2 = value.match(/CPU max MHz.*?([\d]+)/)[1];
			  return `CPU实时: ${f0} MHz | 最小: ${f1} MHz | 最大: ${f2} MHz `
            }
	},

jpg

  • 效果就是在主界面显示温度的下一行显示频率:

jpg

添加m2硬盘温度

usr/share/perl5/PVE/API2/Nodes.pm 刚刚修改温度的下一行添加:

$res->{nvme_ssd_temperatures} = `smartctl -a /dev/nvme?|grep -E "Model Number|Total NVM Capacity|Temperature:|Percentage|Data Unit|Power On Hours"`;

  • /usr/share/pve-manager/js/pvemanagerlib.js 刚刚修改温度的下一行添加:
{
itemId: 'nvme_ssd-temperatures',
colspan: 2,
printBar: false,
title: gettext('NVME硬盘'),
textField: 'nvme_ssd_temperatures',
renderer:function(value){
if (value.length > 0) {
let nvmedevices = value.matchAll(/^Model.*:\s*([\s\S]*?)(\n^Total.*\[[\s\S]*?\]$|\s{0}$)\n^Temperature:\s*([\d]+)\s*Celsius\n^Percentage.*([\d]+\%)\n^Data Units.*\[([\s\S]*?)\]\n^Data Units.*\[([\s\S]*?)\]\n^Power.*:\s*([\s\S]*?)\n/gm);
for (const nvmedevice of nvmedevices) {
for (var i=5; i<8; i++) {
nvmedevice[i] = nvmedevice[i].replace(/ |,/gm, '');
}
if (nvmedevice[2].length > 0) {
let nvmecapacity = nvmedevice[2].match(/.*\[([\s\S]*?)\]/);
nvmecapacity = nvmecapacity[1].replace(/ /, '');
value = `${nvmedevice[1]} | 已使用寿命: ${nvmedevice[4]} (累计读取: ${nvmedevice[5]}, 累计写入: ${nvmedevice[6]}) | 容量: ${nvmecapacity} | 已通电: ${nvmedevice[7]}小时 | 温度: ${nvmedevice[3]}°C\n`;
} else {
value = `${nvmedevice[1]} | 已使用寿命: ${nvmedevice[4]} (累计读取: ${nvmedevice[5]}, 累计写入: ${nvmedevice[6]}) | 已通电: ${nvmedevice[7]}小时 | 温度: ${nvmedevice[3]}°C\n`;
}
}
return value.replace(/\n/g, '<br>');
} else { 
return `提示: 未安装硬盘或已直通硬盘控制器`;
}
}
},

添加sata硬盘温度

usr/share/perl5/PVE/API2/Nodes.pm 刚刚修改温度的下一行添加:

$res->{hdd_temperatures} = `smartctl -a /dev/sd?|grep -E "Model|Capacity|Power_On_Hours|Temperature"`;

/usr/share/pve-manager/js/pvemanagerlib.js 刚刚修改温度的下一行添加:

{
itemId: 'hdd-temperatures',
colspan: 2,
printBar: false,
title: gettext('SATA硬盘'),
textField: 'hdd_temperatures',
renderer:function(value){
if (value.length > 0) {
let devices = value.matchAll(/(\s*Model.*:\s*[\s\S]*?\n){1,2}^User.*\[([\s\S]*?)\]\n^\s*9[\s\S]*?\-\s*([\d]+)[\s\S]*?(\n(^19[0,4][\s\S]*?$){1,2}|\s{0}$)/gm);
for (const device of devices) {
if(device[1].indexOf("Family") !== -1){
devicemodel = device[1].replace(/.*Model Family:\s*([\s\S]*?)\n^Device Model:\s*([\s\S]*?)\n/m, '$1 - $2');
} else {
devicemodel = device[1].replace(/.*Model:\s*([\s\S]*?)\n/m, '$1');
}
device[2] = device[2].replace(/ |,/gm, '');
if(value.indexOf("Min/Max") !== -1){
let devicetemps = device[5].matchAll(/19[0,4][\s\S]*?\-\s*(\d+)(\s\(Min\/Max\s(\d+)\/(\d+)\)$|\s{0}$)/gm);
for (const devicetemp of devicetemps) {
value = `${devicemodel} | 容量: ${device[2]} | 已通电: ${device[3]}小时 | 温度: ${devicetemp[1]}°C\n`;
}
} else if (value.indexOf("Temperature") !== -1){
let devicetemps = device[5].matchAll(/19[0,4][\s\S]*?\-\s*(\d+)/gm);
for (const devicetemp of devicetemps) {
value = `${devicemodel} | 容量: ${device[2]} | 已通电: ${device[3]}小时 | 温度: ${devicetemp[1]}°C\n`;
}
} else {
value = `${devicemodel} | 容量: ${device[2]} | 已通电: ${device[3]}小时 | 提示: 未检测到温度传感器\n`;
}
}
return value.replace(/\n/g, '<br>');
} else { 
return `提示: 未安装硬盘或已直通硬盘控制器`;
}
}
}

7.如果更新到PVE 7.1-5或者更新,发现改了温度+频率都不显示,前面的步骤又没错,那么就需要改布局:

还是这个文件:pvemanagerlib.js,搜索:

gettext('Status') + ': ' + zpool

7.1-10 往上可能可能没有这个参数 直接修改下面的参数就行了

jpg

将 height: 600 改大为700,然后保存。


搜索widget.pveNodeStatus

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

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

layout: {

两处 height 的值需按情况修改,每多一行数据增加 20,我这边增加一行显示CPU温度,4行显示硬盘温度,所以增加了100。

 


原文地址:http://songw.top/archives/748.html

标签: PVE 温度
最后更新:2022年7月4日

本文作者:博主

个人简介:(未填写)

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • andy

    pve8.03,试了很久,stat硬盘没有传值到web,我使用浏览器调试,只有空字符串值传进来,我改了以下两种还是没有值传过去
    $res->{hdd_temperatures} = `hddtemp /dev/sd? | grep ""`;
    $res->{hdd_temperatures} = `sensors`;

    2023年8月31日
    登录以回复
    • andy

      @andy 找到问题了,在修改notes.pm没有执行systemctl restart pveproxy,所以没有传值。

      2023年8月31日
      登录以回复
      • 博主

        @andy 好的

        2023年9月1日
        登录以回复
  • lk_yeah

    博主你好,按照你文章里的方法添加SATA硬盘温度,只能显示第一块硬盘的温度,我主机上有六块硬盘,该如何全部显示呢?

    2023年1月27日
    登录以回复
    • lk_yeah

      @lk_yeah 重启PVE后显示未安装硬盘或已直通硬盘控制器了。。。

      2023年1月27日
      登录以回复
      • 博主

        @lk_yeah 你的PVE是什么版本

        2023年1月28日
        登录以回复
        • lk_yeah

          @博主 是7.2.3

          2023年1月28日
          登录以回复
          • 博主

            @lk_yeah 该教程适用于PVE7.1X,7.2X不适用,因为7.2X有区别。

            2023年1月28日
          • lk_yeah

            @lk_yeah 如果是在7.1版本上,这段SATA硬盘温度的代码运行效果是怎么样的,是一段代码可以显示所有硬盘,还是一块硬盘就需要一段代码呢?

            2023年1月28日
          • 博主

            @lk_yeah 这个代码是显示所有的

            2023年1月29日
    • zwy6666

      @lk_yeah pve8.0版本已验证:将【】内的代码粘贴即可显示多块硬盘
      - Nodes.pm文件
      【$res->{hdd_temperatures} = `smartctl -a /dev/sda|grep -E "Model|Capacity|Power_On_Hours|Temperature";smartctl -a /dev/sdb|grep -E "Model|Capacity|Power_On_Hours|Temperature"`;】

      - pvemanagerlib.js文件
      【{
      itemId: 'hdd-temperatures',
      colspan: 2,
      printBar: false,
      title: gettext('SATA硬盘'),
      textField: 'hdd_temperatures',
      // 此处为自定义添加的样式,靠右对齐
      style: {
      textAlign: 'right',
      },
      renderer: function (value) {
      if (value.length > 0) {
      let devices = value.matchAll(/(\s*Model.*:\s*[\s\S]*?\n){1,2}^User.*\[([\s\S]*?)\]\n^\s*9[\s\S]*?\-\s*([\d]+)[\s\S]*?(\n(^19[0,4][\s\S]*?$){1,2}|\s{0}$)/gm);
      // 为了显示多块硬盘,通过另一个变量缓存
      let tempValue = ''
      for (const device of devices) {
      if (device[1].indexOf("Family") !== -1) {
      devicemodel = device[1].replace(/.*Model Family:\s*([\s\S]*?)\n^Device Model:\s*([\s\S]*?)\n/m, '$1 - $2');
      } else {
      devicemodel = device[1].replace(/.*Model:\s*([\s\S]*?)\n/m, '$1');
      }
      device[2] = device[2].replace(/ |,/gm, '');
      if (value.indexOf("Min/Max") !== -1) {
      let devicetemps = device[5].matchAll(/19[0,4][\s\S]*?\-\s*(\d+)(\s\(Min\/Max\s(\d+)\/(\d+)\)$|\s{0}$)/gm);
      for (const devicetemp of devicetemps) {
      tempValue += `${devicemodel} | 容量: ${device[2]} | 已通电: ${device[3]}小时 | 温度: ${devicetemp[1]}°C\n`;
      }
      } else if (value.indexOf("Temperature") !== -1) {
      let devicetemps = device[5].matchAll(/19[0,4][\s\S]*?\-\s*(\d+)/gm);
      for (const devicetemp of devicetemps) {
      tempValue += `${devicemodel} | 容量: ${device[2]} | 已通电: ${device[3]}小时 | 温度: ${devicetemp[1]}°C\n`;
      }
      } else {
      // 使用+=添加,而不是替换
      tempValue += `${devicemodel} | 容量: ${device[2]} | 已通电: ${device[3]}小时 | 提示: 未检测到温度传感器\n`;
      }

      }
      return tempValue.replace(/\n/g, '');
      } else {
      return `提示: 未安装硬盘或已直通硬盘控制器`;
      }
      },
      }】

      2023年11月24日
      登录以回复
      • zwy6666

        @zwy6666 注意这里 【smartctl -a /dev/sda | xxxx ; smartctl -a /dev/sdb | xxxx】我用?死活不行,所以用这种方式,有几块硬盘就写几次,用英文分号隔开就像,上面是两块sata,比如你有三块就是【smartctl -a /dev/sda | xxxx ; smartctl -a /dev/sdb|xxxx ; smartctl -a /dev/sdc | xxxx】。填入自己对应的硬盘路径。

        2023年11月24日
        登录以回复
        • 博主

          @zwy6666 PVE8有一键脚本,你可以去看这个教程https://wp.gxnas.com/13756.html

          2023年11月24日
          登录以回复
  • 白雪紫薯

    大佬,旁边显示的“未启用Proxmox VE存储库“有办法去除吗? :lei: 在这个文件里没找到,切成英文搜关键词也没有

    2022年10月14日
    登录以回复
    • 博主

      @白雪紫薯 不太清楚哦,自从转ESXI以后,PVE我研究不多了。建议你去PVE官方论坛发贴咨询。

      2022年10月15日
      登录以回复
  • 上一页
    您需要 登录 之后才可以评论
    站内搜索
    分类
    • IPTV / 15篇
    • Linux / 34篇
    • NAS / 252篇
    • Windows / 21篇
    • 其他 / 37篇
    • 游戏 / 3篇
    • 网站 / 125篇
    • 虚拟化技术 / 55篇
    • 资源下载 / 2篇
    • 路由器 / 46篇
    归档
    博客统计信息
    • 4,910,392
    • 570
    • 16,802
    • 2025年7月8日

    © 2025 GXNAS博客 版权所有,未经许可不得转载或引用本站的内容。

    COPYRIGHT ALL RIGHTS RESERVED.

    网站备案号:桂ICP备18008717号