| title | date | tags |
|---|---|---|
绿联4800+上PVE系统安装配置 | 2025-01-02 13:13:40 -0800 | ugreen, pve, 4800 |
按ctrl + F2进入BIOS后,再按ctrl + F1打开详细菜单;
关闭看门狗,否则3分钟自动重启,注意改完保存退出后再进行BIOS其他配置,否则3分钟到就重启;
节能配置打开cpu cstate,设备ASPM:
参照:Trying to modify BIOS to lower power consumption : r/UgreenNASync (reddit.com)
Advanced -> Power & Performance -> CPU - Power Management Control C states -> Enabled Package C State Limit -> Auto Advanced -> Power Settings Enable ACPI Auto Configuration -> Enabled Advanced -> PCI Subsystem Settings PCI Express Settings ASPM Support -> Auto Chipset -> OnBoard Lan 1 -> Disabled (Disables LAN 1 10GB Interface if not needed, also seems like it doesn't support ASPM) Chipset -> System Agent Configuration -> PCI Express Configuration PCI Express Root Port 1-3 ASPM -> L0sL1 Chipset -> PCH-IO Configuration PCI Express Configuration PCI Express Root Port x ASPM -> Auto
如果用不到双网卡,可以关闭万兆卡来节能,设置完毕后准系统在15w左右,带4块机械硬盘在40w上下,硬盘都休眠后也能回落到16w。
cpu部分,很容易爆表,从正常温度秒上100度,似乎是原厂自带的硅脂导热效果不好,换了霍尼韦尔7950相变片,之后
stress压测温度最高只能到达85度(室温20度的情况下),相变片裁剪晶片大小即可,覆盖cpu+gpu部分就行。
机箱风扇散热,BIOS默认根据it87芯片温度调速,我自己改了根据硬盘温度(多个硬盘取最高温度)调速,这样即使硬盘各自休眠也可以智能调节,实测风扇噪音很小,硬盘温度可以维持在
/etc/fancontrol设定的温度上。
参照文章《PVE文件系统对比,备份和恢复》
修改debian系统源
## 替换系统软件仓库 $ 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
如果希望能更新 CPU 的 microcode ,则需要手动添加镜像 non-free 、 non-free-firmware 参数,完整系统源示例如下。
deb https://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free non-free-firmware deb https://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware # security updates deb https://mirrors.ustc.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware
修改PVE 软件源
默认情况下,PVE 额外启用了 2 个官方源,且为订阅收费制,因此需要替换为免费源。
首先创建 PVE 免费软件源,执行以下命令。
## 创建 PVE 免费软件源 $ 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
对于 Proxmox Backup Server 和 Proxmox Mail Gateway,请将以上命令中的 pve 分别替换为 pbs 和 pmg 。
进一步创建 PVE Ceph 免费软件源,Ceph 软件源为 PVE 8 之后默认安装,执行以下命令。
## 创建 PVE Ceph 免费软件源脚本
if [ -f /etc/apt/sources.list.d/ceph.list ]; then
CEPH_CODENAME=`ceph -v | grep ceph | awk '{print $(NF-1)}'`
source /etc/os-release
echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-$CEPH_CODENAME $VERSION_CODENAME no-subscription" > /etc/apt/sources.list.d/ceph-no-subscription.list
fi最后,删除 PVE 官方付费软件源,执行以下命令。
注意:rm 为高风险命令,请正确使用,请勿手抖,请勿手抖。
## 删除付费软件源 $ rm -rvf /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/ceph.list
创建完成后对其进行检查。
修改PVE CT 源
如果需要使用 Proxmox 网页端下载 CT Templates ,可替换 CT Templates 源。
由于该功能暂时未被使用,因此本文只做记录。
## 备份 CT Templates 源 $ cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm.bak ## 替换 CT Templates 链接 $ sed -i 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm ## 重启 PVE API 守护进程 $ systemctl restart pvedaemon.service ## 更新 CT Templates 列表 $ pveam update
镜像同步
更换完成系统源之后,需要同步系统源数据。
考虑到 “离线” 安装时无法同步系统源,因此该步骤可以等到 PVE 正确连接 Internet 后再执行。
## 清理软件包 $ apt clean && apt autoclean && apt autoremove --purge ## 清理系统缓存 $ rm -rvf /var/cache/apt/* /var/lib/apt/lists/* /tmp/* ## 清理系统日志 $ find /var/log/ -type f | xargs rm -rvf ## 清理命令历史记录文件 $ rm -rvf ~/.bash_history && history -c ## 同步软件源 $ apt update ## 更新系统 $ apt full-upgrade
安装常用包
$ apt install --no-install-recommends --no-install-suggests btop lm-sensors unzip neovim tmux unattended-upgrades powermgmt-base linux-cpupower intel-microcode git htop s-tui powertop stress build-* dkms proxmox-headers-$(uname -r) proxmox-kernel-$(uname -r) sysfsutils i2c-tools fancontrol ## 更新 PCI 数据库 $ update-pciids
关闭订阅提醒
备份并编辑/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
输入 / ,搜索:No valid subscription,定位。
使用以下方法之一修改文件,保存并退出后,执行:
systemctl restart pveproxy.service
强制刷新/禁用浏览器缓存,注销后重新登录 PVE。
方法一
将上方
.data.status.toLowerCase() !== 'active') {
更改为
.data.status.toLowerCase() == 'active') {
方法二
将上方
Ext.Msg.show({
更改为:
void({ //Ext.Msg.show({项目:miskcoo/ugreen_leds_controller: An LED Controller for UGREEN's DX/DXP NAS Series (github.com)
安装release中的两个deb,cp /etc/ugreen-leds.example.conf /etc/ugreen-leds.conf 然后 /etc/ugreen-leds.conf文件内可以修改配置
安装i2c-tools
# change enp2s0 to the network device you want to monitor systemctl start ugreen-netdevmon@enp5s0 systemctl start ugreen-diskiomon # if you confirm that everything works well, # run the command below to make the service start at boot systemctl enable ugreen-netdevmon@enp5s0 systemctl enable ugreen-diskiomon
修改/etc/lvm/lvm.conf文件
global_filter=["r|/dev/zd.*|","r|/dev/rbd.*|","r|/dev/sd.*|","r|/dev/mapper/vg[0-9]+-.*|","r|/dev/md.*|"] $ pvestatd stop #为了不停这个,如果挂载的是LVM磁盘(比如群晖的)需要自己做systemctl服务
安装发布 ·adelolmo/hd-idle (github.com)
修改配置文件/etc/default/hd-idle
START_HD_IDLE=true HD_IDLE_OPTS="-i 0 -a sda -i 1200 -a sdb -i 1200 -l /var/log/hd-idle.log"
# systemctl start hd-idle # systemctl enable hd-idle
开机服务
在/etc/systemd/system下新建服务:
lvm_scan_pre.service
[Unit] Description=Run lvm_scan.sh pre early in boot process Before=local-fs-pre.target DefaultDependencies=no Conflicts=shutdown.target Wants=local-fs-pre.target [Service] Type=oneshot ExecStart=/usr/local/bin/lvm_scan.sh pre [Install] WantedBy=local-fs-pre.target
lvm_scan_post.service
[Unit] Description=Run lvm_scan.sh post after system startup After=multi-user.target [Service] Type=oneshot ExecStart=/usr/local/bin/lvm_scan.sh post [Install] WantedBy=multi-user.target
创建脚本/usr/local/bin/lvm_scan.sh
#!/bin/bash
LVM_CONF="/etc/lvm/lvm.conf"
# 转义特殊字符用于 grep
escape_grep() {
echo "$1" | sed -e 's/[|]/\\|/g'
}
# 添加规则到 global_filter
add_filter() {
local filter
filter=$(escape_grep "$1")
if ! grep -qE "^[^#]*$filter" "$LVM_CONF"; then
echo "Adding '$1' to global_filter..."
sed -i "/^[^#]*global_filter/ s@]@, \"$1\"]@" "$LVM_CONF"
else
echo "'$1' is already present."
fi
}
# 从 global_filter 移除规则
remove_filter() {
local filter
filter=$(escape_grep "$1")
if grep -qE "^[^#]*$filter" "$LVM_CONF"; then
echo "Removing '$1' from global_filter..."
#sed -i "/^[^#]*global_filter/ s/, \"$1\"//" "$LVM_CONF"
escaped_filter=$(echo "$1" | sed 's/[][\/.^$*]/\\&/g') # 转义特殊字符
sed -i "/^[^#]*global_filter/ s/, \"$escaped_filter\"//" "$LVM_CONF"
else
echo "'$1' is already absent."
fi
}
# 检查是否有挂载的 VG
vgs_mounted() {
grep -q "^/dev/mapper/.*-volume_" /etc/mtab
}
case "$1" in
pre)
echo "Executing pre-scan adjustments..."
if ! vgs_mounted; then
remove_filter "r|/dev/sd.*|"
remove_filter "r|/dev/md.*|"
remove_filter "r|/dev/mapper/vg.*|"
else
echo "VGs are already mounted. Skipping adjustments."
fi
;;
post)
echo "Executing post-scan adjustments..."
add_filter "r|/dev/sd.*|"
add_filter "r|/dev/md.*|"
add_filter "r|/dev/mapper/vg.*|"
;;
*)
echo "Usage: $0 {pre|post}"
exit 1
;;
esac启动服务
sudo systemctl enable lvm_scan_pre.service sudo systemctl enable lvm_scan_post.service sudo systemctl start lvm_scan_pre.service sudo systemctl start lvm_scan_post.service journalctl -u lvm_scan_pre.service journalctl -u lvm_scan_post.service
安装it87驱动:https://github.com/frankcrawford/it8
clone && make dkms或者下载畅网大佬的①(it87 系列传感器驱动,显示 PVE 风扇转速):IT87传感器驱动_it87-dkms_1.0.63-1_all.deb
开机加载驱动
##编辑/etc/modules,加入 coretemp drivetemp
3.用pwmconfig生成:/etc/fancontrol
# Configuration file generated by pwmconfig, changes will be lost INTERVAL=10 DEVPATH=hwmon3=devices/platform/it87.2608 hwmon4=devices/platform/coretemp.0 DEVNAME=hwmon3=it8613 hwmon4=coretemp FCTEMPS=hwmon3/pwm2=hwmon4/temp1_input hwmon3/pwm3=/var/run/hwmon_fake/hwmon0/temp1_input FCFANS=hwmon3/pwm2=hwmon3/fan2_input hwmon3/pwm3=hwmon3/fan3_input MINTEMP=hwmon3/pwm2=25 hwmon3/pwm3=30 MAXTEMP=hwmon3/pwm2=80 hwmon3/pwm3=45 MINSTART=hwmon3/pwm2=82 hwmon3/pwm3=50 MINSTOP=hwmon3/pwm2=22 hwmon3/pwm3=30 MINPWM=hwmon3/pwm2=22 hwmon3/pwm3=30
此处我用了fake hwmon来把所有硬盘的最高温度告知fancontrol,同样需要systemctl服务:
新建fake_temp_fs.service
[Unit] Description=Setup fake temperature file system Before=fancontrol.service DefaultDependencies=no Conflicts=shutdown.target After=local-fs.target [Service] Type=oneshot ExecStart=/usr/local/bin/aggregate_temp.sh
新建定时器fake_temp_fs.timer
[Unit] Description=Run fake_temp_fs.service every 10 seconds Before=fancontrol.service [Timer] OnBootSec=0 OnUnitActiveSec=10s [Install] WantedBy=multi-user.target
$ sudo systemctl daemon-reload $ sudo systemctl enable fake_temp_fs.service $ systemctl enable fake_temp_fs.timer $ systemctl start fake_temp_fs.timer $ systemctl list-timers --all $ systemctl list-dependencies fancontrol.service ## 生成的 boot.svg 文件中会显示所有服务的启动顺序 $ systemd-analyze plot > boot.svg ## 模拟开机测试 $ journalctl -b | grep -E "fake_temp_fs|fancontrol"
创建脚本aggregate_temp.sh
#!/bin/bash
## 获取硬盘最高温度,同时兼顾cpu温度,把cpu温度范围映射到磁盘温度,把cpu温度作为
## 一个假硬盘温度一起参与调速,防止所有硬盘休眠后系统风扇停转,而cpu温度上升却不工作
# 定义虚拟传感器文件路径
BASE_PATH="/var/run/hwmon_fake"
HW_PATH="$BASE_PATH/hwmon0"
TEMP_FILE="$HW_PATH/temp1_input"
# 设置CPU温度范围和目标硬盘温度范围,根据自己情况和/etc/fancontrol配合设置
cpu_min_temp=25000 # CPU最小温度(25°C)
cpu_max_temp=85000 # CPU最大温度(80°C)
disk_min_temp=30000 # 映射的硬盘最小温度(30°C)
disk_max_temp=45000 # 映射的硬盘最大温度(45°C)
# 检查并创建 tmpfs 挂载
if [ ! -d "$BASE_PATH" ]; then
mkdir -p "$BASE_PATH"
mount -t tmpfs -o size=1M tmpfs "$BASE_PATH"
fi
# 检查并创建虚拟传感器路径和文件
if [ ! -d "$HW_PATH" ]; then
mkdir -p "$HW_PATH"
fi
if [ ! -f "$TEMP_FILE" ]; then
echo 0 | tee "$TEMP_FILE" > /dev/null
fi
# 读取实际温度值(单位:milli-degrees)
temp1=$(cat /sys/class/hwmon/hwmon5/temp1_input 2>/dev/null || echo 0)
temp2=$(cat /sys/class/hwmon/hwmon6/temp1_input 2>/dev/null || echo 0)
temp3=$(cat /sys/class/hwmon/hwmon7/temp1_input 2>/dev/null || echo 0)
temp4=$(cat /sys/class/hwmon/hwmon8/temp1_input 2>/dev/null || echo 0)
# 获取CPU温度值(假设使用coretemp或者it8613)
cpu_temp=$(cat /sys/class/hwmon/hwmon4/temp1_input 2>/dev/null || cat /sys/class/hwmon/hwmon3/temp1_input 2>/dev/null || echo 0)
# 计算CPU温度映射到硬盘温度的值
if [ "$cpu_temp" -le "$cpu_min_temp" ]; then
fake_disk_temp=$disk_min_temp # 如果CPU温度低于最小值,硬盘温度设为最低值
elif [ "$cpu_temp" -ge "$cpu_max_temp" ]; then
fake_disk_temp=$disk_max_temp # 如果CPU温度高于最大值,硬盘温度设为最大值
else
# 使用线性插值公式来计算映射后的硬盘温度
fake_disk_temp=$(echo "scale=2; $disk_min_temp + (($cpu_temp - $cpu_min_temp) * ($disk_max_temp - $disk_min_temp)) / ($cpu_max_temp - $cpu_min_temp)" | bc)
fi
# 取整
fake_disk_temp=$(printf "%.0f" "$fake_disk_temp")
# 计算最大温度
max_temp=$(echo "$temp1 $temp2 $temp3 $temp4" | awk '{
max=$1;
for(i=2;i<=NF;i++) if($i>max) max=$i;
print max
}')
echo "真实硬盘最高温度: $max_temp"
# 输出映射后的硬盘温度
echo "CPU Temp: $cpu_temp°C"
echo "CPU映射磁盘温度: $fake_disk_temp°C"
max_temp=$(( $fake_disk_temp > $max_temp ? $fake_disk_temp : $max_temp ))
echo "真实硬盘最高温度: $max_temp"
# 写入最大温度到虚拟传感器文件
echo "$max_temp" | tee "$TEMP_FILE" > /dev/null我运行的模式是双系统:sd卡装RR引导群晖,同时绿联自带的m2刷了pve系统,另外添加1t的m2做数据盘,存放虚拟机虚拟磁盘和运行所需文件;
经过测试,群晖7.0以下创建的btrfs格式磁盘挂载不上,可能和系统btrfs版本过高有关,群晖官方建议要用老版本内核;该用7.0系统重建后挂载没问题,特别系统盘(装套件的盘)用btrfs似乎还是会报一些错,所以又改成了ext4格式;
群晖7.0后的磁盘采用了LVM:
使用
lsblk -f获取uuid
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS sda ├─sda1 linux_raid_member 1.2 SynologyNAS:0 60957d6e-92de-76ab-b078-5a75ed8e6bc4 │ └─md0 ext4 1.0 1.44.1-72806 ed5d6969-8f61-48d0-87c6-e7d27d29bc34 ├─sda2 linux_raid_member 1.2 SynologyNAS:1 e24e0edb-3703-8a1b-5d10-0e907e9cf556 │ └─md1 swap 1 8fe6046e-f334-4706-aed7-8c0ec5624916 └─sda3 linux_raid_member 1.2 sa6400:2 870f99e8-4f5b-878d-caa6-8e0ac1736357 └─md2 LVM2_member LVM2 001 daijlv-jUKo-wryc-4YLq-dvXR-guRy-AuyyQr ├─vg3-syno_vg_reserved_area └─vg3-volume_1 ext4 1.0 1.44.1-72806 806f03f3-e970-4539-9dd4-98ea8ad9011d
配置/etc/fstab开机自动挂载
# <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 UUID=806f03f3-e970-4539-9dd4-98ea8ad9011d /mnt/volume1 ext4 defaults,nofail 0 0 UUID=4a32bac0-c8ed-4a2b-9541-5eb3e5caa47a /mnt/volume2 ext4 defaults,nofail 0 0 UUID=25f86ee0-c988-40dc-9665-79fabd97d905 /mnt/volume3 btrfs defaults,nofail 0 0 UUID=4de05f4d-014a-4d71-9d2d-bf3cabca7758 /mnt/volume4 btrfs defaults,nofail 0 0
还有一个问题,由于我的磁盘有些是RR下创建,有些是群晖NAS下创建的,混装拿到一起的时候存在md编号冲突,pve的mdadm会识别成一样的,这样会导致某些磁盘无法挂载,其实是被其他磁盘抢占了编号;
查看
mdadm的配置文件/etc/mdadm/mdadm.conf是否有重复的阵列定义:
cat /etc/mdadm/mdadm.conf
如果发现重复的阵列条目,例如:
ARRAY /dev/md/5 UUID=b2b40ae7:ffd083c4:ff01ee04:c8c20a37 ARRAY /dev/md/5 UUID=3c7d47dc:9ebe7a18:7d866bd5:087fa516
将其中一个条目删除,或为冲突阵列分配新的设备名称(例如 /dev/md/6):
ARRAY /dev/md/6 UUID=3c7d47dc:9ebe7a18:7d866bd5:087fa516
保存后,重新加载配置:
mdadm --assemble --scan
磁盘直通给lxc容器
pct set 100 -mp0 /mnt/volume1,mp=/volume1 或者 pct set 100 -mp0 /dev/disk/by-uuid/806f03f3-e970-4539-9dd4-98ea8ad9011d,mp=/volume1
## 安装一些必须的如build-* dkms proxmox-headers-6.8.8-2-pve proxmox-kernel-6.8.8-2-pve, 上面系统配置部分已经安装 $ git clone https://github.com/strongtz/i915-sriov-dkms $ cd i915-sriov-dkms && dkms add . $ dkms install -m i915-sriov-dkms -v $(cat VERSION) --force
echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf
添加内核启动参数:
/etc/default/grub(ext4/xfs的情况)
GRUB_CMDLINE_LINUX_DEFAULT+=intel_iommu=on i915.enable_guc=3 i915.max_vfs=7
执行
update-grub和update-initramfs/etc/kernel/cmdline(zfs)加入参数
root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on i915.enable_guc=3 i915.max_vfs=7
重启lspci应该可以看到多出来几张VGA设备,注意给虚拟机直通的时候不能直通02:00.0主设备,也就是不要勾选
全部功能。执行
proxmox-boot-tool refreshSR-IOV启用后dmesg报错版本不匹配问题
dmesg报错:
[ 5.593081] i915 0000:00:02.3: Running in SR-IOV VF mode [ 5.593390] i915 0000:00:02.3: [drm] *ERROR* GT0: IOV: Unable to confirm version 1.13 (0000000000000000) [ 5.593432] i915 0000:00:02.3: [drm] *ERROR* GT0: IOV: Found interface version 0.1.13.4
此时需要修改i915-sriov-dkms源码的Makefile,源码安装,9改成13(按照dmesg里报错的1.13改),strongtz/i915-sriov-dkms#186 (comment)
sed -i 's/GUCFIRMWARE_MINOR:-9/GUCFIRMWARE_MINOR:-13/' Makefile rm -rf /usr/src/i915-sriov-dkms-* /var/lib/dkms/i915-sriov-dkms dkms add . dkms install -m i915-sriov-dkms -v $(cat VERSION) -k $(uname -r) --force update-grub && update-initramfs -u reboot
查看firmware版本是否和i915固件匹配
$ apt policy pve-firmware pve-firmware: Installed: 3.14-1 Candidate: 3.14-1 Version table:
页面配置vGPU配置参考:proxmox-vGPU.md (github.com)

lxc核显权限开启
## 磁盘绑定 mp0: /mnt/volume1,mp=/volume1,replicate=0 ## 指定绑定核心 lxc.cgroup2.cpuset.cpus: 2-5 lxc.apparmor.profile: unconfined lxc.cap.drop: ## 核显 lxc.cgroup2.devices.allow: c 226:* rwm lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir ## tun lxc.cgroup2.devices.allow: c 10:200 rwm lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
核显使用查看
intel_gpu_top -d drm:/dev/dri/renderD128、journalctl -b -o short-monotonic -k|egrep -i 'i915|dmr|dmc|guc|huc'