PVE配置:(2023.12.13)SHELL脚本:一键给PVE增加温度,cpu功耗频率,硬盘等信息

获取温度信息。返回信息大概如下:

脚本自动检测:一键给PVE增加温度和cpu频率显示,NVME,机械固态硬盘信息

  • 理论上适合任何设备
  • 自动适配传感器数据
  • 自动检测NVME硬盘数量
  • 自动检测机械,固态硬盘数量
  • 自动检测CPU核心数量

使用方法:
可以一键执行下面:

(curl -Lf -o /tmp/temp.sh https://raw.githubusercontent.com/a904055262/PVE-manager-status/main/showtempcpufreq.sh || curl -Lf -o /tmp/temp.sh https://mirror.ghproxy.com/https://raw.githubusercontent.com/a904055262/PVE-manager-status/main/showtempcpufreq.sh) && chmod +x /tmp/temp.sh && /tmp/temp.sh remod

 

没有显示功耗的,请执行下面的命令安装依赖,请确保安装成功,就是最后的一行的输出,必须为 “成功!” 才表示安装成功了。

apt update ; apt install linux-cpupower && modprobe msr && echo msr > /etc/modules-load.d/turbostat-msr.conf && chmod +s /usr/sbin/turbostat && echo 成功!

 

如果你已经用别人的脚本之类的修改过页面,请先用下面命令先回复官方设置之后,才可以运行本脚本:

 
apt update 
apt install pve-manager  proxmox-widget-toolkit  --reinstall
rm -f /usr/share/perl5/PVE/API2/Nodes.pm*bak
rm -f /usr/share/pve-manager/js/pvemanagerlib.js*bak
rm -f /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js*bak

另外:每次pve升级之后都需要执行一次脚本,因为升级后PVE会自己还原文件

更新:

  • 2023.1.10
    理论上适合任意设备!
    添加nvme硬盘信息显示
  • 2023.1.11
    效果优化
    加入固态硬盘和机械硬盘信息
    CPU频率加入调速器,最大最小频率
    NVME加入读写数据量显示
    修复bug
  • 2023.1.12
    细节优化
  • 2023.1.14
    细节优化
  • 2023.1.15
    修正右栏高度和左栏一致,解决双栏浮动布局错位问题
  • 2023.1.18
    优化布局,修正温度获取bug
  • 2023.4.14
    添加NVME健康度和0E显示
  • 2023.9.4
    修复一些设备因为温度问题无限转圈圈
  • 2023.9.5
    增加CPU功耗显示
  • 2023.12.13
    机械硬盘休眠状态不去获取SMART

如果你对效果不满意,请执行:"/tmp/temp.sh" restore 命令,可以还原修改

温度显示:

首先我们要先安装温度检测工具

apt-get install lm-sensors

lm_sensors可以用来监控CPU和主板温度以及风扇速度

在shell中输入命令sensors,就能显示信息

root@pve:~# sensors
coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +48.0°C  (high = +105.0°C, crit = +105.0°C)//cpu温度
Core 0:        +48.0°C  (high = +105.0°C, crit = +105.0°C)
Core 1:        +49.0°C  (high = +105.0°C, crit = +105.0°C)
Core 2:        +49.0°C  (high = +105.0°C, crit = +105.0°C)
Core 3:        +49.0°C  (high = +105.0°C, crit = +105.0°C)

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

nvme-pci-0100
Adapter: PCI adapter
Composite:    +62.9°C  (low  = -273.1°C, high = +89.8°C)//nvme硬盘温度
                       (crit = +89.8°C)
ERROR: Can't get value of subfeature temp2_min: I/O error  //这两个是读不出来
ERROR: Can't get value of subfeature temp2_max: I/O error
Sensor 1:     +62.9°C  (low  =  +0.0°C, high =  +0.0°C)

需要修改的文件

/usr/share/perl5/PVE/API2/Nodes.pm   //数据来源
/usr/share/pve-manager/js/pvemanagerlib.js  //桌面版的js
/usr/share/pve-manager/touch/pvemanager-mobile.js  //手机版的js

在Nodes.pm中搜索pveversion,在这段代码下面加入

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

pc端浏览器界面增加温度显示

在pvemanagerlib.js文件中也是搜索pveversion,在它这段代码下面加入

{
      itemId: 'thermal',
      colspan: 2,
      printBar: false,
      title: gettext('Temperature'),
      textField: 'thermalstate',
      renderer:function(value){
        const c0 = value.match(/Package id 0.*?\+([\d\.]+)?/)[1];
        const c1 = value.match(/Composite.*?\+([\d\.]+)?/)[1];
        return `CPU: ${c0}   |  NVME: ${c1} `
     }     
  },

要注意的事情是cpu和nvme的温度是根据正则表达式从数据字符串里取的,需要根据sensors中输出的信息做相应修改,注意红色字体部分可以。

pve7.0 pveversion代码下面还有一段输出订阅状态的代码,看需求可以删除掉。

手机端增加温度显示

在pvemanager-mobile.js文件中搜索PVE.NodeInfo,具体代码显示如下

Ext.define('PVE.NodeInfo', {
    extend: 'Ext.Component',
    alias: 'widget.pveNodeInfo',

    config: {
	style: 'background-color: white;',
	styleHtmlContent: true,
	data: [],
	tpl: [
	    '<table style="margin-bottom:0px;">',
	    '<tr><td>Version:</td><td>{pveversion}</td></tr>',
	    '<tr><td>Memory:</td><td>{[this.meminfo(values)]}</td></tr>',
	    '<tr><td>CPU:</td><td>{[this.cpuinfo(values)]}</td></tr>',
	    '<tr><td>Uptime:</td><td>{[Proxmox.Utils.format_duration_long(values.uptime)]}</td></tr>',
	    '<tr><td>Temp:</td><td>{[this.tempinfo(values)]}</td></tr>',//增加页面显示温度是位置
	    '</table>',
	    {
		meminfo: function(values) {
		    var d = values.memory;
		    if (!d) {
			return '-';
		    }
		    return Proxmox.Utils.format_size(d.used || 0) + " of " + Proxmox.Utils.format_size(d.total);
		},

         //增加获取温度的方法
		tempinfo: function(values) {
		    var d = values.thermalstate;
		    if (!d) {
			return '-';
		    }
                    var c0 = d.match(/Package id 0.*?\+([\d\.]+)?/)[1];
                    var c1 = d.match(/Composite.*?\+([\d\.]+)?/)[1];
		    return 'CPU:'+c0+'   |  NVME:'+c1;
		},
		cpuinfo: function(values) {
		    if (!values.cpuinfo) {
			return '-';
		    }
		    var per = values.cpu * 100;
		    return per.toFixed(2) + "% (" + values.cpuinfo.cpus + " CPUs)";
		}
	    }
	]
    },
});

修改完成后在shell中重启pve的web管理器:

systemctl restart pveproxy

完成温度显示操作。

关闭ksm 内核共享内存

进程有一个ksm的进程会占用一部分cpu,会一直检测虚拟机的空闲内存,可以空出来给其他虚机用,用不到可以关闭

systemctl disable ksmtuned
systemctl stop ksmtuned

去登陆后的订阅弹窗

需要修改文件/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js

搜索关键字 checked_command 定位,if判断改成false即可,然后重启pve的web管理器

    checked_command: function(orig_cmd) {
	Proxmox.Utils.API2Request(
	    {
		url: '/nodes/localhost/subscription',
		method: 'GET',
		failure: function(response, opts) {
		    Ext.Msg.alert(gettext('Error'), response.htmlStatus);
		},
		success: function(response, opts) {
		    let res = response.result;
		    if (false) { //这里改成false
			Ext.Msg.show({
			    title: gettext('No valid subscription'),
			    icon: Ext.Msg.WARNING,
			    message: Proxmox.Utils.getNoSubKeyHtml(res.data.url),
			    buttons: Ext.Msg.OK,
			    callback: function(btn) {
				if (btn !== 'ok') {
				    return;
				}
				orig_cmd();
			    },
			});
		    } else {
			orig_cmd();
		    }
		},
	    },
	);
    },
THE END