PVE 8.3.1安装后的优化

news/2025/2/24 1:23:56/文章来源:https://www.cnblogs.com/airoot/p/18714975

网上PVE优化文章比较比较多,记录一下优化的过程:

1,删除订阅的弹窗:

sed -Ezi.bak "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js && systemctl restart pveproxy.service
# 执行完成后,浏览器Ctrl+F5强制刷新缓存

2,更换Debian源:

wget --no-check-certificate https://v2rayssr.com/tool/yuan.sh -O yuan.sh && chmod +x yuan.sh && ./yuan.sh

如果以上脚本失效,可以自己编写:

#!/bin/bashdir="/etc/apt/sources.list.d/"
file="/etc/apt/sources.list"if [ -d "$dir" ]; thenecho "Deleting directory $dir..."rm -rf "$dir"echo "Directory deleted."
elseecho "Directory $dir does not exist. Skipping deletion."
fiecho "Replacing content of $file..."echo "deb https://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free non-free-firmware" > "$file"
echo "deb https://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware" >> "$file"
echo "deb https://mirrors.ustc.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware" >> "$file"
echo "deb https://mirrors.ustc.edu.cn/debian-security bookworm-security main" >> "$file"
echo "deb https://mirrors.ustc.edu.cn/proxmox/debian bookworm pve-no-subscription" >> "$file"echo "Content replaced."

 3,pve页面上显示cpu、磁盘等温度、频率、功率等信息

wget --no-check-certificate -c https://raw.githubusercontent.com/a904055262/PVE-manager-status/main/showtempcpufreq.sh && chmod +x showtempcpufreq.sh && ./showtempcpufreq.sh

同样,如果以上脚本失效,自行编写:

#!/usr/bin/env bash# version: 2023.9.5
#添加硬盘信息的控制变量,如果你想不显示硬盘信息就设置为false
#NVME硬盘
sNVMEInfo=true
#固态和机械硬盘
sODisksInfo=true
#debug,显示修改后的内容,用于调试
dmode=false#脚本路径
sdir=$(cd "$(dirname "${BASH_SOURCE[0]}")"; pwd)
cd "$sdir"sname=$(basename "${BASH_SOURCE[0]}")
sap=$sdir/$sname
echo 脚本路径:"$sap"#需要修改的文件
np=/usr/share/perl5/PVE/API2/Nodes.pm
pvejs=/usr/share/pve-manager/js/pvemanagerlib.js
plibjs=/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.jsif ! command -v sensors > /dev/null; thenecho 你需要先安装 lm-sensors 和 linux-cpupower,脚本尝试给你自动安装if apt update ; apt install -y lm-sensors; then echo lm-sensors 安装成功echo 尝试继续安装linux-cpupower获取功耗信息if apt install -y linux-cpupower;thenecho linux-cpupower安装成功elseecho -e "linux-cpupower安装失败,可能无法正常获取功耗信息,你可以使用\033[34mapt update ; apt install linux-cpupower && modprobe msr && echo msr > /etc/modules-load.d/turbostat-msr.conf && chmod +s /usr/sbin/turbostat && echo 成功!\033[0m 手动安装"fielseecho 脚本自动安装所需依赖失败echo -e "请使用蓝色命令:\033[34mapt update ; apt install -y lm-sensors linux-cpupower && chmod +s /usr/sbin/turbostat && echo 成功! \033[0m 手动安装后重新运行本脚本"echo 脚本退出exit 1fi
fi#获取版本号
pvever=$(pveversion | awk -F"/" '{print $2}')
echo "你的PVE版本号:$pvever"restore() {[ -e $np.$pvever.bak ]     && mv $np.$pvever.bak $np[ -e $pvejs.$pvever.bak ]  && mv $pvejs.$pvever.bak $pvejs[ -e $plibjs.$pvever.bak ] && mv $plibjs.$pvever.bak $plibjs
}fail() {echo "修改失败,可能不兼容你的pve版本:$pvever,开始还原"restoreecho 还原完成exit 1
}#还原修改
case $1 in restore)restoreecho 已还原修改if [ "$2" != 'remod' ];then echo -e "请刷新浏览器缓存:\033[31mShift+F5\033[0m"systemctl restart pveproxyelse echo -----fiexit 0;;remod)echo 强制重新修改echo -----------"$sap" restore remod > /dev/null "$sap"exit 0;;
esac#检测是否已经修改过
[ $(grep 'modbyshowtempfreq' $np $pvejs $plibjs | wc -l) -eq 3 ]  && {echo -e "
已经修改过,请勿重复修改
如果没有生效,或者页面一直转圈圈
请使用 \033[31mShift+F5\033[0m 刷新浏览器缓存
如果一直异常,请执行:\033[31m\"$sap\" restore\033[0m 命令,可以还原修改
如果想强制重新修改,请执行:\033[31m\"$sap\" remod\033[0m 命令,可以还原修改
"exit 1
}contentfornp=/tmp/.contentfornp.tmp[ -e /usr/sbin/turbostat ] && {modprobe msrchmod +s /usr/sbin/turbostat
}
echo msr > /etc/modules-load.d/turbostat-msr.confcat > $contentfornp << 'EOF'#modbyshowtempfreq$res->{thermalstate} = `sensors -A`;
$res->{cpuFreq} = `goverf=/sys/devices/system/cpu/cpufreq/policy0/scaling_governormaxf=/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freqminf=/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freqcat /proc/cpuinfo | grep -i  "cpu mhz"echo -n 'gov:'[ -f \$goverf ] && cat \$goverf || echo noneecho -n 'min:'[ -f \$minf ] && cat \$minf || echo noneecho -n 'max:'[ -f \$maxf ] && cat \$maxf || echo noneecho -n 'pkgwatt:'[ -e /usr/sbin/turbostat ] && turbostat --quiet --cpu package --show "PkgWatt" -S sleep 0.25 2>&1 | tail -n1 `;
EOFcontentforpvejs=/tmp/.contentforpvejs.tmpcat > $contentforpvejs << 'EOF'
//modbyshowtempfreq{itemId: 'thermal',colspan: 2,printBar: false,title: gettext('温度(°C)'),textField: 'thermalstate',renderer:function(value){//value进来的值是有换行符的console.log(value)let b = value.trim().split(/\s+(?=^\w+-)/m).sort();let c = b.map(function (v){// 风扇转速数据,直接返回let fandata = v.match(/(?<=:\s+)[1-9]\d*(?=\s+RPM\s+)/ig)if ( fandata ) {return '风扇: ' + fandata.join(';')}let name = v.match(/^[^-]+/)[0].toUpperCase();let temp = v.match(/(?<=:\s+)[+-][\d.]+(?=.?°C)/g);// 某些没有数据的传感器,不是温度的传感器if ( temp ) {temp = temp.map(v => Number(v).toFixed(0))if (/coretemp/i.test(name)) {name = 'CPU';temp = temp[0] + ( temp.length > 1 ? ' ( ' +   temp.slice(1).join(' | ') + ' )' : '');} else {temp = temp[0];}let crit = v.match(/(?<=\bcrit\b[^+]+\+)\d+/);return name + ': ' + temp + ( crit? ` ,crit: ${crit[0]}` : '');} else {return 'null'}});console.log(c);// 排除null值的c=c.filter( v => ! /^null$/.test(v) )//console.log(c);//排序,把cpu温度放最前let cpuIdx = c.findIndex(v => /CPU/i.test(v) );if (cpuIdx > 0) {c.unshift(c.splice(cpuIdx, 1)[0]);}console.log(c)c = c.join(' | ');return c;}},{itemId: 'cpumhz',colspan: 2,printBar: false,title: gettext('CPU频率(GHz)'),textField: 'cpuFreq',renderer:function(v){//return v;console.log(v);let m = v.match(/(?<=^cpu[^\d]+)\d+/img);let m2 = m.map( e => ( e / 1000 ).toFixed(1) );m2 = m2.join(' | ');let gov = v.match(/(?<=^gov:).+/im)[0].toUpperCase();let min = (v.match(/(?<=^min:).+/im)[0]);if ( min !== 'none' ) {min=(min/1000000).toFixed(1);}let max = (v.match(/(?<=^max:).+/im)[0])if ( max !== 'none' ) {max=(max/1000000).toFixed(1);}let watt= v.match(/(?<=^pkgwatt:)[\d.]+$/im);watt = watt? " | 功耗: " + (watt[0]/1).toFixed(1) + 'W' : '';return `${m2} | MAX: ${max} | MIN: ${min}${watt} | 调速器: ${gov}`}},
EOF#检测nvme硬盘
echo 检测系统中的NVME硬盘
nvi=0
if $sNVMEInfo;thenfor nvme in $(ls /dev/nvme[0-9] 2> /dev/null); dochmod +s /usr/sbin/smartctlcat >> $contentfornp << EOF\$res->{nvme$nvi} = \`smartctl $nvme -a -j\`;
EOFcat >> $contentforpvejs << EOF{itemId: 'nvme${nvi}0',colspan: 2,printBar: false,title: gettext('NVME${nvi}'),textField: 'nvme${nvi}',renderer:function(value){//return value;try{let  v = JSON.parse(value);//名字let model = v.model_name;if (! model) {return '找不到硬盘,直通或已被卸载';}// 温度let temp = v.temperature?.current;temp = ( temp !== undefined ) ? " | " + temp + '°C' : '' ;// 通电时间let pot = v.power_on_time?.hours;let poth = v.power_cycle_count;pot = ( pot !== undefined ) ? (" | 通电: " + pot + '时' + ( poth ? ',次: '+ poth : '' )) : '';// 读写let log = v.nvme_smart_health_information_log;let rw=''let health=''if (log) {let read = log.data_units_read;let write = log.data_units_written;read = read ? (log.data_units_read / 1956882).toFixed(1) + 'T' : '';write = write ? (log.data_units_written / 1956882).toFixed(1) + 'T' : '';if (read && write) {rw = ' | R/W: ' + read + '/' + write;}let pu = log.percentage_used;let me = log.media_errors;if ( pu !== undefined ) {health = ' | 健康: ' + ( 100 - pu ) + '%'if ( me !== undefined ) {health += ',0E: ' + me}}}// smart状态let smart = v.smart_status?.passed;if (smart === undefined ) {smart = '';} else {smart = ' | SMART: ' + (smart ? '正常' : '警告!');}let t = model  + temp + health + pot + rw + smart;//console.log(t);return t;}catch(e){return '无法获得有效消息';};}},
EOFlet nvi++done
fi
echo "已添加 $nvi 块NVME硬盘"#检测机械键盘
echo 检测系统中的SATA固态和机械硬盘
sdi=0
if $sODisksInfo;thenfor sd in $(ls /dev/sd[a-z] 2> /dev/null);dochmod +s /usr/sbin/smartctlchmod +s /usr/sbin/hdparm#检测是否是真的机械键盘sdsn=$(awk -F '/' '{print $NF}' <<< $sd)sdcr=/sys/block/$sdsn/queue/rotational[ -f $sdcr ] || continueif [ "$(cat $sdcr)" = "0" ];thenhddisk=falsesdtype="固态硬盘$sdi"elsehddisk=truesdtype="机械硬盘$sdi"fi#[] && 型条件判断,嵌套的条件判断的非 || 后面一定要写动作,否则会穿透到上一层的非条件#机械/固态硬盘输出信息逻辑,#如果硬盘不存在就输出空JSONcat >> $contentfornp << EOF\$res->{sd$sdi} = \`if [ -b $sd ];thenif $hddisk && hdparm -C $sd | grep -iq 'standby';thenecho '{"standy": true}'elsesmartctl $sd -a -jfielseecho '{}'fi\`;
EOFcat >> $contentforpvejs << EOF{itemId: 'sd${sdi}0',colspan: 2,printBar: false,title: gettext('${sdtype}'),textField: 'sd${sdi}',renderer:function(value){//return value;try{let  v = JSON.parse(value);console.log(v)if (v.standy === true) {return '休眠中'}//名字let model = v.model_name;if (! model) {return '找不到硬盘,直通或已被卸载';}// 温度let temp = v.temperature?.current;temp = ( temp !== undefined ) ? " | 温度: " + temp + '°C' : '' ;// 通电时间let pot = v.power_on_time?.hours;let poth = v.power_cycle_count;pot = ( pot !== undefined ) ? (" | 通电: " + pot + '时' + ( poth ? ',次: '+ poth : '' )) : '';// smart状态let smart = v.smart_status?.passed;if (smart === undefined ) {smart = '';} else {smart = ' | SMART: ' + (smart ? '正常' : '警告!');}let t = model + temp  + pot + smart;//console.log(t);return t;}catch(e){return '无法获得有效消息';};}},
EOFlet sdi++done
fi
echo "已添加 $sdi 块SATA固态和机械硬盘"echo 开始修改nodes.pm文件
if ! grep -q 'modbyshowtempfreq' $np ;then[ ! -e $np.$pvever.bak ] && cp $np $np.$pvever.bakif [ "$(sed -n "/PVE::pvecfg::version_text()/{=;p;q}" "$np")" ];then #确认修改点#r追加文本后面必须跟回车,否则r 后面的文字都会被当成文件名,导致脚本出错sed -i "/PVE::pvecfg::version_text()/{r $contentfornp}" $np$dmode && sed -n "/PVE::pvecfg::version_text()/,+5p" $npelseecho '找不到nodes.pm文件的修改点'failfi
elseecho 已经修改过
fiecho 开始修改pvemanagerlib.js文件
if ! grep -q 'modbyshowtempfreq' $pvejs ;then[ ! -e $pvejs.$pvever.bak ]  && cp $pvejs $pvejs.$pvever.bakif [ "$(sed -n '/pveversion/,+3{/},/{=;p;q}}' $pvejs)" ];then sed -i "/pveversion/,+3{/},/r $contentforpvejs}" $pvejs$dmode && sed -n "/pveversion/,+8p" $pvejselseecho '找不到pvemanagerlib.js文件的修改点'failfiecho 修改页面高度#统计加了几条addRs=$(grep -c '\$res' $contentfornp)addHei=$(( 28 * addRs))$dmode && echo "添加了$addRs条内容,增加高度为:${addHei}px"#原高度300echo 修改左栏高度if [ "$(sed -n '/widget.pveNodeStatus/,+4{/height:/{=;p;q}}' $pvejs)" ]; then #获取原高度wph=$(sed -n -E "/widget\.pveNodeStatus/,+4{/height:/{s/[^0-9]*([0-9]+).*/\1/p;q}}" $pvejs)sed -i -E "/widget\.pveNodeStatus/,+4{/height:/{s#[0-9]+#$(( wph + addHei))#}}" $pvejs$dmode && sed -n '/widget.pveNodeStatus/,+4{/height/{p;q}}' $pvejs#修改右边栏高度,让它和左边一样高,双栏的时候否则导致浮动出问题#原高度325echo 修改右栏高度和左栏一致,解决浮动错位if [ "$(sed -n '/nodeStatus:\s*nodeStatus/,+10{/minHeight:/{=;p;q}}' $pvejs)" ]; then #获取原高度nph=$(sed -n -E '/nodeStatus:\s*nodeStatus/,+10{/minHeight:/{s/[^0-9]*([0-9]+).*/\1/p;q}}' "$pvejs")sed -i -E "/nodeStatus:\s*nodeStatus/,+10{/minHeight:/{s#[0-9]+#$(( nph + addHei - (nph - wph) ))#}}" $pvejs$dmode && sed -n '/nodeStatus:\s*nodeStatus/,+10{/minHeight/{p;q}}' $pvejselseecho 右边栏高度找不到修改点,修改失败fielseecho 找不到修改高度的修改点failfielseecho 已经修改过
fiecho 温度,频率,硬盘信息相关修改已完成
echo ------------------------
echo ------------------------
echo 开始修改proxmoxlib.js文件
echo 去除订阅弹窗if ! grep -q 'modbyshowtempfreq' $plibjs ;then[ ! -e $plibjs.$pvever.bak ] && cp $plibjs $plibjs.$pvever.bakif [ "$(sed -n '/\/nodes\/localhost\/subscription/{=;p;q}' $plibjs)" ];then sed -i '/\/nodes\/localhost\/subscription/,+10{/res === null/{Ns/(.*)/(false)/a //modbyshowtempfreq}}' $plibjs$dmode && sed -n "/\/nodes\/localhost\/subscription/,+10p" $plibjselse echo 找不到修改点,放弃修改这个fi
elseecho 已经修改过
fi
echo -e "------------------------
修改完成
请刷新浏览器缓存:\033[31mShift+F5\033[0m
如果你看到主页面提示连接错误或者没看到温度和频率,请按:\033[31mShift+F5\033[0m,刷新浏览器缓存!
如果你对效果不满意,请执行:\033[31m\"$sap\" restore\033[0m 命令,可以还原修改
"systemctl restart pveproxy

4,CT Templates

加速 Proxmox 网页端下载 CT Templates,替换 CT Templates 的源。

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

5,扩充root分区,删除lvm-thin

直接参考:https://www.xiaocaicai.com/2023/04/pve%e7%9a%84local%e5%92%8clocal-lvm/

 

 

其他参考链接:

https://pkernel.com/?p=1415

https://bozai.me/pve-install.html

https://bozai.me/pve.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/883633.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《安富莱嵌入式周报》第350期:Google开源Pebble智能手表,开源模块化机器人平台,开源万用表,支持10GHz HRTIM的单片机,开源CNC控制器

周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版: https://www.bilibili.com/video/BV1YPKEeyEeM/目录: 1、Google开源Pebble 智能手表所有代码 2、开源光谱辐射探测系统Pomelo 3、控制器开源 (1)开…

使用Prometheus+Grafana监控MySQL

前提搭建好Prometheus 本次使用Docker搭建 https://www.cnblogs.com/minseo/p/17913003.html搭建好Grafana环境查看 系统环境# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # uname -a Linux CentOS7K8SHarbor061 3.10.0-1160.102.1.el7.x86_64 #1 SMP Tue…

centos7安装mysql5.6.43报错解决方案!

今天虚拟机安装mysql-community-server-5.6.43版本时出现依赖报错,按照提示的error进行解决! 第一个问题是 Requires: libaio.so.1()(64bit) 解决方案:确保机器联网,使用 yum install -y libaio 第二个问题是缺少perl依赖,可以使用 yum install -y perl* peri-* 安装 这条…

利用apache2本地搭建web环境

下载apache2服务sudo apt install apache2 php -y 启动apache2sudo service apache2 restart命令执行后即可在浏览器访问,访问localhost或127.0.0.1(默认端口为80)即可看到apache的默认页面说明本地站点搭建完毕目录:/var/www/html这个目录下存放的是网站的资源,图片或html…

rancher页面无法显示pod实时日志

异常现象rancher无法通过web页面查看相关pod日志排查步骤1.在k8s的主节点上执行查看日志的命令kubectl get pods -n smartroom-testkubectl logs -f register-85dbdc6df8-nqkc4 -n smartroom-test在k8s主节点上无法查看其它node上运行的pod的运行日志2.在pod运行的主机上查看容…

十. 数据结构

数据结构 二叉树遍历先序遍历:根左右 中序遍历:左根右 后序遍历:左右根 层序遍历:从上到下、从左往右依次遍历通过序列构造二叉树必须有中序序列先序遍历中序遍历后序遍历图的遍历查找哈希表散列表(Hash table, 也叫哈希表), 是根据关键码值(key value)而直接进行访问的数…

微信小程序-引入less

介绍 微信开发者工具默认样式文件是wxss,但该文件格式不支持层级嵌套写法,为了支持此功能可以引入less 或者 sass,微信开发者工具默认不支持less,需要自己安装插件。 Less(Leaner Style Sheets 的缩写)是一种动态样式语言,属于 CSS 预处理器的范畴,它扩展了 CSS 语言,…

unity毛笔笔锋

using System;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI; namespace LastZero.Utility{public class Painting : MonoBehaviour{public Color mColor = Color.black;//画笔颜色//[HideInInspector]public Texture brushTexture;//画笔[HideInI…

.NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案

前言 随着物联网(IoT)技术的迅猛发展,智能设备之间的互联互通变得越来越重要。 推荐一套基于 C# 的高效 IoT 系统,该系统运行在 Linux 开发板上,并支持 Modbus RS485 传感器、NPN/PNP 开关等所有符合 485 通讯协议的设备进行数据采集和指令发送。这套系统在为智能家居、智…

DeepSeek 背后的技术:GRPO,基于群组采样的高效大语言模型强化学习训练方法详解

强化学习(Reinforcement Learning, RL)已成为提升大型语言模型(Large Language Models, LLMs)推理能力的重要技术手段,特别是在需要复杂推理的任务中。DeepSeek 团队在 DeepSeek-Math [2] 和 DeepSeek-R1 [3] 模型中的突破性成果,充分展示了强化学习在增强语言模型数学推…

https://avoid.overfit.cn/post/05d4b8fb001b4adeb4e050fb323cd21f

强化学习(Reinforcement Learning, RL)已成为提升大型语言模型(Large Language Models, LLMs)推理能力的重要技术手段,特别是在需要复杂推理的任务中。DeepSeek 团队在 DeepSeek-Math [2] 和 DeepSeek-R1 [3] 模型中的突破性成果,充分展示了强化学习在增强语言模型数学推…