PVE三部曲之一:在概要中显示温度的方法

着对Proxmox虚拟化的深入使用,我觉得ProxmoxVMware干没了不是没有原因的。

当然,不仅仅是VMware的vSphere,还有微软的Hyper-V,Crtrix的XenServer,在开源的PVE面前,没有一个能打的。

开源平台Proxmox VE无需任何许可证费用,提供所有功能的完整访问权限,并提高了IT基础架构的灵活性,安全性和可靠性。

话不多说,我将通过PVE三部曲来验证虚拟化之王当之无愧。

  • PVE温度显示
  • QEMU Guest Agent
  • 备份和还原

📌PVE显示温度

默认情况下,PVE的概要面板是不会收集硬件温度信息的,所以源生的PVE不会显示温度信息。而我们要做的就是让它收集并显示出来,配置之后的效果如下:

yeah

我虽然已经做了很多次了,但是每次版本的迭代,系统总会覆盖概要面板的控制脚本,所以这次我们将采用一个高级的方法:

写一个自定义的API来通过安全的inline injection(JS注入,不破坏源生结构),感谢ChatGPT5.1帮我想到的好方法。

安装sensors

sensors是一个用来显示Linux硬件温度的软件,执行安装命令:

shell
apt install lm-sensors -y

执行sensors命令

shell
root@pve:~# sensors
amdgpu-pci-c400
Adapter: PCI adapter
vddgfx:        1.43 V  
vddnb:       645.00 mV 
edge:         +45.0°C  
PPT:          16.20 W  (avg =  12.25 W)

k10temp-pci-00c3
Adapter: PCI adapter
Tctl:         +51.9°C  

acpitz-acpi-0
Adapter: ACPI interface
temp1:        +20.0°C  

iwlwifi_1-virtual-0
Adapter: Virtual device
temp1:            N/A  

nvme-pci-0100
Adapter: PCI adapter
Composite:    +41.9°C  (low  = -273.1°C, high = +89.8°C)
                       (crit = +94.8°C)
Sensor 1:     +41.9°C  (low  = -273.1°C, high = +65261.8°C)
Sensor 2:     +28.9°C  (low  = -273.1°C, high = +65261.8°C)

✅后端修改点:Nodes.pm

能查询到温度信息后,我们先增加后端的API。

路径:

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

新增一个方法:

perl
__PACKAGE__->register_method({
    name => 'hwtemp',
    path => 'hwtemp',
    method => 'GET',
    proxyto => 'node',
    permissions => {
        check => ['perm', '/nodes/{node}', ['Sys.Audit']],
    },
    description => "Read hardware temperature from sensors -j",
    parameters => {
        additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
        },
    },
    returns => {
        type => "object",
    },
    code => sub {
        my ($param) = @_;

        my $json = '';
        my $cmd = ['sensors', '-j'];
        PVE::Tools::run_command($cmd, outfunc => sub { $json .= shift });

        my $decoded = decode_json($json);
        return $decoded; 
    },
});

✅前端修改点:pvemanagerlib.js

文件:

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

搜索内容:

shell
Ext.define('PVE.node.StatusView'

在 items[] 里插入:

javascript
{
    xtype: 'component',
    itemId: 'hwtemp',
    colspan: 2,
    padding: '10 10 10 10',
    style: 'border:1px solid #ccc; margin-top:10px',
    tpl: new Ext.XTemplate(
        '<h3>Hardware Temperature</h3>',
        '<table>',
        '<tr><td><b>CPU:</b></td><td>{cpu}</td></tr>',
        '<tr><td><b>GPU:</b></td><td>{gpu}</td></tr>',
        '<tr><td><b>NVMe:</b></td><td>{nvme}</td></tr>',
        '<tr><td><b>Mainboard:</b></td><td>{acpi}</td></tr>',
        '</table>'
    ),
    data: {
        cpu: 'Loading…',
        gpu: 'Loading…',
        nvme: 'Loading…',
        acpi: 'Loading…',
    },
},

📌 添加 updateHwTemp() 函数(前端 JS)

仍在 StatusView 内添加函数:

javascript
function updateHwTemp() {
    Ext.Ajax.request({
        url: `/api2/json/nodes/${nodename}/hwtemp`,
        method: 'GET',
        success: function(resp){
            let json = JSON.parse(resp.responseText).data;

            function get(path){
                try { return path.split('.').reduce((o,k)=>o[k], json); }
                catch(e){ return null; }
            }

            let cpu  = get('k10temp-pci-00c3.Tctl.temp1_input');
            let gpu  = get('amdgpu-pci-c400.edge.temp1_input');
            let nvme = get('nvme-pci-0100.Composite.temp1_input');
            let acpi = get('acpitz-acpi-0.temp1.temp1_input');

            function fmt(v){ return v ? v.toFixed(1)+'°C' : 'N/A'; }

            me.down('#hwtemp').update({
                cpu: fmt(cpu),
                gpu: fmt(gpu),
                nvme: fmt(nvme),
                acpi: fmt(acpi),
            });
        },
    });
}

📌 触发温度刷新:在 initComponent() 里加入

javascript
let timer = setInterval(updateHwTemp, 3000);
me.on('destroy', () => clearInterval(timer));

📌重启服务

执行:

bash
systemctl restart pveproxy
systemctl restart pvedaemon

重启之后,刷新页面即可看到PVE的温度。

yeah

💖后记

PVE 虽然是企业级产品,但依旧保留了足够开放的架构。 你可以像本文这样,自由扩展 API、修改前端 JS、甚至在节点首页加入自定义的硬件监控模块。 这种“可玩性”是很多虚拟化平台给不了的。

当然,也要记住一句老话:

动手之前先备份,动手之后再重启。

无论是修改 Nodes.pm,还是 patch pvemanagerlib.js, 都建议:

  • 改之前 cp filename filename.bak

  • 改过程中多观察 systemctl status pveproxy

  • 出现异常时随时回滚

这样即使改坏了,也能迅速恢复。

最后,希望这篇文章能给到你启发: PVE 并不是“只能用”,它是一个能让你自己“造功能”的平台。

yeah

PVE三部曲之二:QEMU Guest Agent的用法
基于ChatGPT的中央空调维修方案