| title | date | tags |
|---|---|---|
| 绿联4800+上PVE系统安装配置 | 2025-01-02 13:13:40 -0800 | ugreen, pve, 4800 |
BIOS调整节能
- 按ctrl + F2进入BIOS后,再按ctrl + F1打开详细菜单;
- 关闭看门狗,否则3分钟自动重启,注意改完保存退出后再进行BIOS其他配置,否则3分钟到就重启;
- 节能配置打开cpu cstate,设备ASPM:参照:Trying to modify BIOS to lower power consumption : r/UgreenNASync (reddit.com)
Bash
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系统源
Bash
## 替换系统软件仓库
$ 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 参数,完整系统源示例如下。
Bash
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 免费软件源,执行以下命令。
Bash
## 创建 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 之后默认安装,执行以下命令。
Bash
## 创建 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 为高风险命令,请正确使用,请勿手抖,请勿手抖。
Bash
## 删除付费软件源
$ rm -rvf /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/ceph.list
创建完成后对其进行检查。
- 修改PVE CT 源
如果需要使用 Proxmox 网页端下载 CT Templates ,可替换 CT Templates 源。
由于该功能暂时未被使用,因此本文只做记录。
Bash
## 备份 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 后再执行。
Bash
## 清理软件包
$ 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
- 安装常用包
Bash
$ 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
Bash
输入 / ,搜索:No valid subscription,定位。
使用以下方法之一修改文件,保存并退出后,执行:
systemctl restart pveproxy.service
强制刷新/禁用浏览器缓存,注销后重新登录 PVE。
方法一
将上方
.data.status.toLowerCase() !== 'active') {
更改为
.data.status.toLowerCase() == 'active') {
方法二
将上方
Ext.Msg.show({
更改为:
void({ //Ext.Msg.show({
绿联led灯
项目: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
Bash
# 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文件
Bash
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
Bash
START_HD_IDLE=true
HD_IDLE_OPTS="-i 0 -a sda -i 1200 -a sdb -i 1200 -l /var/log/hd-idle.log"
Bash
# systemctl start hd-idle
# systemctl enable hd-idle
开机服务
在/etc/systemd/system下新建服务:
lvm_scan_pre.service
Bash
[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
Bash
[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
Bash
#!/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
启动服务
Bash
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 - 开机加载驱动
Bash
##编辑/etc/modules,加入
coretemp
drivetemp
3.用pwmconfig生成:/etc/fancontrol
Bash
# 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
Bash
[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
Bash
[Unit]
Description=Run fake_temp_fs.service every 10 seconds
Before=fancontrol.service
[Timer]
OnBootSec=0
OnUnitActiveSec=10s
[Install]
WantedBy=multi-user.target
Bash
$ 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
Bash
#!/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
- 使用
Bash
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开机自动挂载
Bash
# <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是否有重复的阵列定义:
Bash
cat /etc/mdadm/mdadm.conf
如果发现重复的阵列条目,例如:
Bash
ARRAY /dev/md/5 UUID=b2b40ae7:ffd083c4:ff01ee04:c8c20a37
ARRAY /dev/md/5 UUID=3c7d47dc:9ebe7a18:7d866bd5:087fa516
将其中一个条目删除,或为冲突阵列分配新的设备名称(例如 /dev/md/6):
Bash
ARRAY /dev/md/6 UUID=3c7d47dc:9ebe7a18:7d866bd5:087fa516
保存后,重新加载配置:
Bash
mdadm --assemble --scan
磁盘直通给lxc容器
Bash
pct set 100 -mp0 /mnt/volume1,mp=/volume1
或者
pct set 100 -mp0 /dev/disk/by-uuid/806f03f3-e970-4539-9dd4-98ea8ad9011d,mp=/volume1
核显SR-IOV
Bash
## 安装一些必须的如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
Bash
echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf
添加内核启动参数:
/etc/default/grub(ext4/xfs的情况)
Bash
GRUB_CMDLINE_LINUX_DEFAULT+=intel_iommu=on i915.enable_guc=3 i915.max_vfs=7
- 执行
update-grub和update-initramfs /etc/kernel/cmdline(zfs)加入参数
Bash
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 refresh
- 执行
- SR-IOV启用后dmesg报错版本不匹配问题
dmesg报错:
Bash
[ 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)
Bash
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固件匹配
Bash
$ apt policy pve-firmware
pve-firmware:
Installed: 3.14-1
Candidate: 3.14-1
Version table:
- 页面配置vGPU配置参考:proxmox-vGPU.md (github.com)

lxc核显权限开启
Bash
## 磁盘绑定
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'