示例图

温度显示:

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

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();
		    }
		},
	    },
	);
    },