PVE安装后的初始化配置
内容目录

关于PVE的一些初始化配置记录

去除订阅提示

pvetools是一个开源的pve工具,可以快速帮我们实现一些常用的pve配置。

这里我仅用来去除订阅提示。

pvetools托管在github上,只需要克隆git库即可:

cd ~
apt update
apt -y install git 
git clone https://github.com/ivanhao/pvetools.git

克隆后直接使用pvetools即可:

cd pvetools
./pvetools.sh

我这里是使用xshell连接pve,运行后出现图形界面:

image-20240412110644979

这里可以方便的配置apt国内源、去除企业源等功能。

这里我只用到了去除订阅提示功能,只需要选择这个选项一路回车,期间黑屏等待几秒即可跳出成功。

修改安装源与去除PVE企业源

修改安装源为中科大源。

cd /etc/apt
cp sources.list sources.list.bak
sed -i 's|^deb http://ftp.debian.org|deb https://mirrors.ustc.edu.cn|g' /etc/apt/sources.list
sed -i 's|^deb http://security.debian.org|deb https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list

PVE企业源需要订阅,这里修改为中科大的不需要订阅的源:

cd /etc/apt
cp -r sources.list.d/ sources.d.bak
cd sources.list.d/
rm -rf ceph.list
rm -rf pve-enterprise.list
source /etc/os-release
echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/pve $VERSION_CODENAME pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list

替换CT Template

cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm.bak
sed -i 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm

安装常用软件

apt clean && apt autoclean && apt autoremove --purge
apt update
apt dist-upgrade
apt install htop lm-sensors unzip fail2ban vim tmux unattended-upgrades apt-listchanges powermgmt-base
apt install iperf iperf3 iftop net-tools ethtool

至此一些基础配置已经完成。

配置sensors监控数据

基于上述常用软件中已安装 lm-sensors 包的情况下配置,如果没有安装,则可以单独安装:

apt install lm-sensors

之后配置监控的数据源:

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

编辑该文件,你可以使用 vim 工具来编辑,也可以用ftp客户端下载下来后用编辑器编辑,这里我下载到windows内用vscode来编辑:

根据文本 Read node status 来搜索,找到状态信息源配置处,在该方法内的最后, return $res; 前添加代码:

    $res->{temperature} = `sensors`;
    $res->{tdata} = `/usr/bin/s.sh`;

这里的 s.sh 文件可能是之前通过pvetools增加监控信息后遗留的,这里直接使用,s文件内容为:

r=`sensors|grep -E 'Package id 0|fan|Physical id 0|Core'|grep '^[a-zA-Z0-9].[[:print:]]*:.\s*\S*[0-9].\s*[A-Z].' -o|sed 's/:\ */:/g'|sed 's/:/":"/g'|sed 's/^/"/g' |sed 's/$/",/g'|sed 's/\ C\ /C/g'|sed 's/\ V\ /V/g'|sed 's/\ RP/RPM/g'|sed 's/\ //g'|awk 'BEGIN{ORS=""}{print $0}'|sed 's/\,$//g'|sed 's/°C/\&degC/g'`
curC=`cat /proc/cpuinfo|grep MHz|awk 'NR==1{print $4}'`
max=`cat /proc/cpuinfo|grep GHz|awk -F "@" 'NR==1{print $2}'|sed 's/GHz//g'|sed 's/\ //g'`
maxC=`echo "$max * 1000"|bc -l`
minC=`lscpu|grep 'min MHz'|awk '{print $4}'`
c="\"CPU-MHz\":\""$curC"\",\"CPU-max-MHz\":\""$maxC"\",\"CPU-min-MHz\":\""$minC"\""
r="{"$r","$c"}"
echo $r

之后编辑js文件:

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

通过搜索 Boot Mode 找到目标位置,在 Boot Mode 这个json的下方新增json:

{
        itemId: 'temperature',
        colspan: 2,
        printBar: false,
        title: gettext('Temperature'),
        textField: 'temperature',
        renderer: function(value) {
            value = value.replace(/Â/g, '');
            let data = [];
            let cpus = value.matchAll(/^coretemp-isa-(\d{4})$\n.*?\n((?:Package|Core)[\s\S]*?^\n)+/gm);
            for (const cpu of cpus) {
                let cpuNumber = parseInt(cpu[1], 10);
                data[cpuNumber] = {
                    packages: [],
                    cores: []
                };
                let packages = cpu[2].matchAll(/^Package id \d+:\s*([^°]+).*$/gm);
                for (const package of packages) {
                    data[cpuNumber]['packages'].push(package[1]);
                }
                let cores = cpu[2].matchAll(/^Core \d+:\s*([^°]+).*$/gm);
                for (const core of cores) {
                    data[cpuNumber]['cores'].push(core[1]);
                }
            }
            let output = '';
            for (const [i, cpu] of data.entries()) {
                output += `CPU ${i}: `;
                if (cpu.packages.length > 0) {
                    for (const packageTemp of cpu.packages) {
                        output += `${packageTemp}°C `;
                    }
                }
                if (cpu.cores.length > 0) {
                    output += '(';
                    for (const coreTemp of cpu.cores) {
                        output += `${coreTemp}, `;
                    }
                    output = output.slice(0, -2);
                    output += ')°C';
                }
                output += ' | ';
            }
            let boardTemp = value.match(/^acpitz-acpi-\d+$\n.*?\n^temp1:\s*([^°]+).*$/m);
            if (boardTemp.length > 0) {
                output += `Board: ${boardTemp[1]}°C | `
            }
            let nvmeTemp = value.match(/^nvme-pci-\d+$\n.*?\n^Composite:\s*([^°]+).*$/m);
            if (nvmeTemp.length > 0) {
                output += `NVME: ${nvmeTemp[1]}°C | `
            }
            output = output.slice(0, -3);
            return output;
        }
    },
    {
        itemId: 'version',
        colspan: 2,
        printBar: false,
        title: gettext('Manager Version'),
        textField: 'pveversion',
        value: '',
    },
             ,{
             itemId: 'MHz',
             colspan: 2,
             printBar: false,
             title: gettext('CPU频率'),
             textField: 'tdata',
             renderer:function(value){
                 var d = JSON.parse(value);
                 f0 = d['CPU-MHz'];
                 f1 = d['CPU-min-MHz'];
                 f2 = d['CPU-max-MHz'];
                 return  `CPU实时(Cur): ${f0} MHz | 最小(min): ${f1} MHz | 最大(max): ${f2} MHz `;
         }
     }

完成后重启pveproxy即可:

systemctl restart pveproxy

重启后页面需要 Ctrl + F5 强制刷新,在PVE概要页即可展示结果:

image-20240412113738604

如果高度不够,修改 /usr/share/pve-manager/js/pvemanagerlib.js 文件的如下位置,可根据 extend 内容搜索至对应位置,修改 height 数值即可,420即上图的高度。


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

    // 监控面板高度
    height: 420,
    bodyPadding: '15 5 15 5',

    layout: {
    type: 'table',
    columns: 2,
    tableAttrs: {
        style: {
        width: '100%',
        },
    },
    },

总结

记录PVE安装后的初始配置,以备不时之需。

上一篇
下一篇