N5105 Proxmox VE (PVE) 主页添加温度硬盘等信息
Fanx / 2023-06-26 / Linux / 阅读量 2185

前言

以下配置只适用于 N5105 使用 NVMe 硬盘的情况,其它机型请自行酌情修改。(例如更多的 CPU 核心、机械硬盘、风扇转速等)

效果图

显示 CPU 实时频率、各核心温度、硬盘型号、寿命、温度等信息
PVE 主界面

安装监控软件

安装 lm-sensors

apt install lm-sensors patch

初始化 sensors

sensors-detect

给予 smartctl 权限(用于读取 NVMe 信息)

chmod +s /usr/sbin/smartctl

修改文件

修改 /usr/share/perl5/PVE/API2/Nodes.pm

添加在 PVE::pvecfg::version_text(); 的下一行
'Nodes.pm'

    $res->{sensors_json} = `sensors -j`; # 获取 CPU 、主板温度及风扇转速
    $res->{smartctl_nvme_json} = `smartctl -a -j /dev/nvme?`; # 读取 nvme 硬盘 S.M.A.R.T. 值,获取硬盘寿命、容量、温度等
    $res->{cpusensors} = `lscpu | grep MHz`; # 读取 CPU 频率

修改 /usr/share/pve-manager/js/pvemanagerlib.js

添加信息

itemId: 'version' 所处的 json 块后添加
'pvemanagerlib.js'

PVE 8.0

在 PVE 8.0 中,lscpu | grep MHz 的输出格式有变化:

root@PVE:~# lscpu | grep MHz
CPU(s) scaling MHz:              93%
CPU max MHz:                     2900.0000
CPU min MHz:                     800.0000

我这里通过 CPU(s) scaling MHz 来换算实时频率,如果你的输出格式不同,请自行修改。

    {
        itemId: 'MHz',
        colspan: 2,
        printBar: false,
        title: gettext('CPU频率'),
        textField: 'cpusensors',
        renderer:function(value){
                var f1 = value.match(/CPU min MHz.*?([\d]+)/)[1];
                var f2 = value.match(/CPU max MHz.*?([\d]+)/)[1];
                var f0 = value.match(/CPU.*scaling MHz.*?([\d]+)/)[1];
                var f0 = f0*f2/100;
            return `实时: ${f0} MHz || 最小: ${f1} MHz | 最大: ${f2} MHz `
        }
    },
    {
        itemId: 'thermal',
        colspan: 2,
        printBar: false,
        title: gettext('CPU温度'),
        textField: 'sensors_json',
        renderer: function(value) {
            value = value.replace(/temp([0-9]{1,})_input/g,'input');
            if (value.indexOf("coretemp-isa") != -1 ) {
                value = value.replace(/coretemp-isa-(.{4})/g,'coretemp-isa');
                value = JSON.parse(value);
                try {var cpu_Intel = 'CPU: ' + value['coretemp-isa']['Package id 0']['input'].toFixed(1) + '°C';} catch(e) {var cpu_Intel = '';} 
                if (cpu_Intel.length > 0) {
                    try {var cpu0 = ' || 核心 0 : ' + value['coretemp-isa']['Core 0']['input'].toFixed(1) + '°C';} catch(e) {var cpu0 = '';} 
                    try {var cpu1 = ' | 核心 1 : ' + value['coretemp-isa']['Core 1']['input'].toFixed(1) + '°C';} catch(e) {var cpu1 = '';} 
                    try {var cpu2 = ' | 核心 2 : ' + value['coretemp-isa']['Core 2']['input'].toFixed(1) + '°C';} catch(e) {var cpu2 = '';} 
                    try {var cpu3 = ' | 核心 3 : ' + value['coretemp-isa']['Core 3']['input'].toFixed(1) + '°C';} catch(e) {var cpu3 = '';} 
                    return `${cpu_Intel}${cpu0}${cpu1}${cpu2}${cpu3}`;
                } 
            } else {
                return `提示: CPU 温度读取异常`;
            }
        }
    },
    {        
        itemId: 'nvme_ssd',
        colspan: 2,
        printBar: false,
        title: gettext('NVME'),
        textField: 'smartctl_nvme_json',
        renderer: function(value) {
            value = JSON.parse(value);
            if (value['model_name']) {
                try {var model_name = value['model_name'];} catch(e) {var model_name = '';} 
                try {var percentage_used = ' | 使用寿命: ' + value['nvme_smart_health_information_log']['percentage_used'].toFixed(0) + '% ';} catch(e) {var percentage_used = '';} 
                try {var data_units_read = value['nvme_smart_health_information_log']['data_units_read']*512/1024/1024;var data_units_read = '(读: ' + data_units_read.toFixed(2) + 'GB, ';} catch(e) {var data_units_read = '';} 
                try {var data_units_written = value['nvme_smart_health_information_log']['data_units_written']*512/1024/1024;var data_units_written = '写: ' + data_units_written.toFixed(2) + 'GB)';} catch(e) {var data_units_written = '';} 
                try {var power_on_time = ' | 通电: ' + value['power_on_time']['hours'].toFixed(0) + '小时';} catch(e) {var power_on_time = '';} 
                try {var temperature = ' | 温度: ' + value['temperature']['current'].toFixed(1) + '°C';} catch(e) {var temperature = '';} 
                return `${model_name}${percentage_used}${data_units_read}${data_units_written}${power_on_time}${temperature}`;
            } else { 
                return `提示: 未安装硬盘或已直通硬盘控制器`;
            }
        }
    },

PVE 7.X

    {
        itemId: 'MHz',
        colspan: 2,
        printBar: false,
        title: gettext('CPU频率'),
        textField: 'cpusensors',
        renderer:function(value){
            var f0 = value.match(/CPU MHz.*?([\d]+)/)[1];
            var f1 = value.match(/CPU min MHz.*?([\d]+)/)[1];
            var f2 = value.match(/CPU max MHz.*?([\d]+)/)[1];
            return `实时: ${f0} MHz || 最小: ${f1} MHz | 最大: ${f2} MHz `
        }
    },
    {
        itemId: 'thermal',
        colspan: 2,
        printBar: false,
        title: gettext('CPU温度'),
        textField: 'sensors_json',
        renderer: function(value) {
            value = value.replace(/temp([0-9]{1,})_input/g,'input');
            if (value.indexOf("coretemp-isa") != -1 ) {
                value = value.replace(/coretemp-isa-(.{4})/g,'coretemp-isa');
                value = JSON.parse(value);
                try {var cpu_Intel = 'CPU: ' + value['coretemp-isa']['Package id 0']['input'].toFixed(1) + '°C';} catch(e) {var cpu_Intel = '';} 
                if (cpu_Intel.length > 0) {
                    try {var cpu0 = ' || 核心 0 : ' + value['coretemp-isa']['Core 0']['input'].toFixed(1) + '°C';} catch(e) {var cpu0 = '';} 
                    try {var cpu1 = ' | 核心 1 : ' + value['coretemp-isa']['Core 1']['input'].toFixed(1) + '°C';} catch(e) {var cpu1 = '';} 
                    try {var cpu2 = ' | 核心 2 : ' + value['coretemp-isa']['Core 2']['input'].toFixed(1) + '°C';} catch(e) {var cpu2 = '';} 
                    try {var cpu3 = ' | 核心 3 : ' + value['coretemp-isa']['Core 3']['input'].toFixed(1) + '°C';} catch(e) {var cpu3 = '';} 
                    return `${cpu_Intel}${cpu0}${cpu1}${cpu2}${cpu3}`;
                } 
            } else {
                return `提示: CPU 温度读取异常`;
            }
        }
    },
    {        
        itemId: 'nvme_ssd',
        colspan: 2,
        printBar: false,
        title: gettext('NVME'),
        textField: 'smartctl_nvme_json',
        renderer: function(value) {
            value = JSON.parse(value);
            if (value['model_name']) {
                try {var model_name = value['model_name'];} catch(e) {var model_name = '';} 
                try {var percentage_used = ' | 使用寿命: ' + value['nvme_smart_health_information_log']['percentage_used'].toFixed(0) + '% ';} catch(e) {var percentage_used = '';} 
                try {var data_units_read = value['nvme_smart_health_information_log']['data_units_read']*512/1024/1024;var data_units_read = '(读: ' + data_units_read.toFixed(2) + 'GB, ';} catch(e) {var data_units_read = '';} 
                try {var data_units_written = value['nvme_smart_health_information_log']['data_units_written']*512/1024/1024;var data_units_written = '写: ' + data_units_written.toFixed(2) + 'GB)';} catch(e) {var data_units_written = '';} 
                try {var power_on_time = ' | 通电: ' + value['power_on_time']['hours'].toFixed(0) + '小时';} catch(e) {var power_on_time = '';} 
                try {var temperature = ' | 温度: ' + value['temperature']['current'].toFixed(1) + '°C';} catch(e) {var temperature = '';} 
                return `${model_name}${percentage_used}${data_units_read}${data_units_written}${power_on_time}${temperature}`;
            } else { 
                return `提示: 未安装硬盘或已直通硬盘控制器`;
            }
        }
    },

修改 div 高度

同样是修改 /usr/share/pve-manager/js/pvemanagerlib.js

如不修改会导致信息显示不全
搜索 widget.pveNodeStatus

PVE 8.1

由于 PVE 8.1 新增了一行 Boot Mode,所以需要更高的高度

height: 410,

PVE 8.1 以下

height: 390,

去除订阅提示

修改 /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js

找到以下字段

Ext.Msg.show({
title: gettext('No valid subscription'),

修改为

void({
title: gettext('No valid subscription'),

修改完成后重载 PVE 界面

systemctl restart pveproxy

参考

基于 tty228 的文章进行轻量化修改,去除了一些 N5105 不支持的功能,如需要完整版请移步原文:
【Proxmox VE】PVE 首页显示 CPU、主板、NVME、硬盘 温度等信息

9 + 8 =
4 评论
    himooEdge Chromium 115Windows 10 / 11
    2023年08月17日 回复

    N5105,pve8.0下,获取的实时频率有问题,网页刷新后显示出来,数值就固定了,再刷新(手动、自动)也不变;而网页温度是变化的。控制台打印出来的实时频率数值却是变化的。
    而且,网页上的各核心频率虽然变化,但是一直显示2800MHz上下几、几十变化,不像控制台里面打出来的800-2900之间变化。
    猜测是Nodes里面获取的值和手动控制台打印的不一样。
    我看博主的也是5105 cpu。

      FanxSafari 16Mac OS X
      2023年08月19日 回复

      @himoo debug 了一下,每次获取频率 cpu 一瞬间的频率达到了 98% 上下,所以界面上就显示那么高了.

      > value
      < "CPU(s) scaling MHz:              98%
      CPU max MHz:                     2900.0000
      CPU min MHz:                     800.0000
      "

      等官方优化吧,或者你 lscpu | grep MHz && grep 'cpu MHz' /proc/cpuinfo | tail -n 1
      /proc/cpuinfo 的值,可能会低一点,我也没做测试.

    colinChrome 115Windows 10 / 11
    2023年08月14日 回复

    我的pve8.0管理后台,nvme的温度显示“提示: 未安装硬盘或已直通硬盘控制器”,但通过命令smartctl -a -j /dev/nvme?能获取到nvme磁盘的信息,不知道是不是还需要额外做一些别的什么操作

      FanxSafari 16iPhone
      2023年08月15日 回复

      @colin 应该是哪里填错了导致的