AM40 折腾记录

在AM40 上安装 pve 以及 openwrt, homeassistant 实现all in one
基本配置
AM40, 4g+32g ram, rk3399
装好测试了一下, pve + openwrt + homeassistant, 功耗大约不到 6w, 非常省电, 微微发热, 不需要设置风扇.
不过如果要长期使用, 记得定期备份重要数据, 防止哪天存储卡或者 mmc 就坏了.

1. 硬件说明

AM40 主体已经带了一个电源接口和一个开关按键接口,更多信息可以查看这里, 网站挂掉了.
接入 12v 电源后,短接一下开关后放开即可开机。
如果用不到wifi ,也可以想我这样, 用8MM 钻头对wifi 口扩一下后,焊接一个延长线到面板,方便平时操作。
钻孔作业记得把主板取出来.
电源线需要焊接一下,开关可以用ph20 插口插进去,插入之前,用刀子削去卡扣即可。

电源实际测试,最低需要 9v 电源方可启动。
注意,机器主体带的 HDMI 接口不能输出视频,如果需要看输出内容,需要插上扩展座。实际安装中没有扩展座也无所谓。

2. 安装 armbian

2.0. 环境准备

  1. 你需要一个12v, 至少1.5A 的电源。
  2. 一个存储卡,如果作直接系统盘使用,最好大一点。如果只是用来装系统,可以小一点,至少4g.
  3. 一个读卡器,用来写入镜像。
  4. 两根根网线,用来接入网络
  5. 一个可以上网的环境,最好需要能访问国外的网站。
  6. 一个 USB 网卡或者卖一个m2 e-key 的有线网卡, 建议有线网卡, usb 网卡我买了一个, 稳定性太差了。

另外,软路由的网段最好和目前的网段保持一致,这样迁移起来比较方便。

2.1. 系统下载

首先需要安装一个 armbian 作为基础。
已经有大神做好系统了, 直接下载即可armbian
我这里使用的是 Armbian_24.11.0_rockchip_smart-am40_bookworm_6.1.118_server_2024.11.20.img.gz 版本。
也可以选择其他 bookworm 版本。
备注: 有些机器装上这个版本后(比如我的), 上方的 usb 接口无法使用, 需要使用其他版本的 dtb 文件. 可以试试我编译的版本, 也可以安装完成后, 手动替换 dtb 文件(下面有写替换方法).

2.2. 系统安装

使用 balenaEtcher 写入sd 卡。
机器断电后,插入SD 卡, 插好网线。插入电源线,短接一下开关,稍等片刻即可开机。开机大约需要1,2分钟左右。
重要: 如果一直不开机, 可能是网卡卡的兼容性问题, 等装完系统再安装网卡
开机后,从路由器中找到机器的IP, 或者尝试 ping 一下 armbian/armbian.local/armbian.lan 试试,说不定可以直接找到机器的地址。

1
2
3
➜  ~ ping armbian
PING armbian.lan (192.168.2.237): 56 data bytes
64 bytes from 192.168.2.237: icmp_seq=0 ttl=64 time=2.348 ms

拿到IP 地址后。
之后,使用任何你喜欢的shell,使用 ssh root@x.x.x.x 连上你的armbian。初始密码是 1234.
第一次需要初始化管理员密码并选择命令行环境,命令行环境可以选 bash 或者 zsh 均可。
初始化好之后,会创建第一个普通用户,这里可以创建,也可以直接 ctrl-c 退出。
如果你不需要把系统安装到内置的 mmc, 那么安装就算完成了。
如果需要安装到内置mmc, 将之前下载的 xxx.img.gz 上传到服务器,这一步可以使用scp 上传或者其他软件上传(filezilla 之类的)。(在你的电脑上执行)

1
scp ./Armbian_24.11.0_rockchip_smart-am40_bookworm_6.1.118_server_2024.11.20.img.gz root@192.168.2.237:/tmp/

上传完成后,在ssh 中解压并刷入, 这一步很慢,需要等待一会。(在am40 上执行)

1
gzip -dc /tmp/Armbian_24.11.0_rockchip_smart-am40_bookworm_6.1.118_server_2024.11.20.img.gz | dd of=/dev/mmcblk0

写入完成后,执行poweroff 命令关机。等灯灭了之后,拔掉电源,拔掉存储卡,重新开机。
如果这个sd 卡后面要作为存储设备, 那记得先格式化再插入, 否则又会从这个存储卡启动.
重新开机后,IP 地址理论上还是一样的,ssh 链接的时候需要可能会提示 ssh key 对不上之类错误,可以选择忽略或修改 known_hosts。
进入系统后,需要重新初始化一次, 操作同上。

2.3. 完成系统设置

2.3.1. 基础设置

由于总所周知的原因,我们需要使用国内的镜像地址,要不然会很慢。参考

1
2
sed -i.bak 's|http://deb.debian.org|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list
sed -i.bak2 's#http://apt.armbian.com#https://mirrors.tuna.tsinghua.edu.cn/armbian#g' /etc/apt/sources.list.d/armbian.list

替换之后,执行以下命令更新源

1
apt update

更新成功后,执行这个命令安装必要的驱动参考

1
apt install armbian-firmware-full

2.3.2. 设置静态 IP

PVE 需要设置一个静态IP地址才可以工作。参考
注意,下面的IP 地址与网关地址,DNS 地址,请根据实际情况填写!!!
首先获取网卡名字,

1
nmcli connection

返回一般是类似这样

1
2
3
NAME                UUID  TYPE      DEVICE 
Wired connection 1 xxxx ethernet eth0
lo yyyy loopback lo

可以看到有线网卡名称是 Wired connection 1, 拷贝出来.
准备一个一会准备给他使用的静态IP地址,例如 192.168.2.15,执行这个命令设置。(请根据实际情况填写!!!)

1
nmcli connection modify 'Wired connection 1' ipv4.address 192.168.2.15/24

设置网关 (请根据实际情况填写!!!)

1
nmcli connection modify 'Wired connection 1' ipv4.gateway 192.168.2.1

设置ip 获取方式为手动

1
nmcli connection modify 'Wired connection 1' ipv4.method manual

设置 DNS (请根据实际情况填写!!!)

1
nmcli connection modify 'Wired connection 1' ipv4.dns '192.168.2.1'

设置完成后,reboot 命令重启,重启后,用新的 IP 地址链接服务器。

2.3.3. 设置 hosts 文件

使用的下面的 hosts 文件替换原有的 /etc/hosts 文件。参考
注意,IP 地址换成你实际的IP 地址。

1
2
3
4
5
6
7
8
9
10
cat >/etc/hosts<<EOF
127.0.0.1 localhost
192.168.2.15 armbian.pvetest.com armbian

::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF

结束后,执行hostname -i 检查一下输出是否是当前ip 地址

1
2
armbian:~:# hostname -i         
192.168.2.15

2.4. 修改dtb

如果安装完系统后,机身的USB 一切正常, 就跳过这一步.
如果只有一个可用,那么首先需要检查机内的调试开关是否切换到 NORMAL
如果已经切换,仍然无法使用上方的USB 接口,那么可能需要更新 dtb 文件。

下载 这个文件 https://github.com/xiayang0521/rk-images/blob/main/rk3399-smart-am40.dtb
移动到 /boot/dtb/rockchip/ 替换同名的文件,权限需要修改一下

1
chmod 644 /boot/dtb/rockchip/rk3399-smart-am40.dtb

一切完成后,reboot 重启机器。

3. 安装PVE

3.1. 添加 PVE 源以及设置gpg key

1
2
3
curl -L https://mirrors.lierfang.com/pxcloud/lierfang.gpg -o /etc/apt/trusted.gpg.d/lierfang.gpg
source /etc/os-release
echo "deb https://mirrors.lierfang.com/pxcloud/pxvirt $VERSION_CODENAME main">/etc/apt/sources.list.d/pxvirt-sources.list

设置完成后,更新

1
apt update && apt full-upgrade

3.2. 安装 ifupdown2

1
apt install ifupdown2

不知到为啥,安装完后会报错。可以删除一个文件绕过后重装一次。参考

1
2
rm -rf /tmp/.ifupdown2-first-install
apt install ifupdown2

3.3. 安装pve

执行这个命令安装 参考

1
apt install proxmox-ve postfix open-iscsi

执行到中途,会弹出一个提示框,让选择模式
选择 No Configuration 即可
后面会再弹一个提示,让你选择是否覆盖 /etc/apt/sources.list.d/pxvirt-sources.list,
直接回车,选择默认即可(不替换)。
安装好之后,浏览器打开 https://192.168.2.15:8006/ 试试能打开不。

如果你浏览器打开控制台时,一直转圈到白屏,可以看看是不是 pveproxy 服务异常了。

1
systemctl status pveproxy.service

如果输出有类似下面的内容,那么可能是证书错误了。重新生成一次即可。参考

1
2
3
4
5
Nov 24 15:33:20 armbian pveproxy[2143]: worker exit
Nov 24 15:33:20 armbian pveproxy[1646]: worker 2143 finished
Nov 24 15:33:20 armbian pveproxy[1646]: starting 1 worker(s)
Nov 24 15:33:20 armbian pveproxy[1646]: worker 2181 started
Nov 24 15:33:20 armbian pveproxy[2181]: /etc/pve/local/pve-ssl.pem: failed to use local certificate chain (cert_file or cert) at /usr/share/perl5/PVE/APIServer/AnyEvent.pm line 2028.

重新生成证书命令:

1
2
rm -f /etc/pve/pve-root-ca.pem /etc/pve/priv/pve-root-ca.* /etc/pve/local/pve-ssl.*;
pvecm updatecerts -f;

如果发现安装完pve 后,机器无法解析域名,可以检查一下DNS 是否正确设置
数据中心 > armbian > 网络 > DNS

3.4. Rockchip 需要的特殊处理

参考原文描述 参考

All rockchip soc are not compatible with the mainline OVMF.

1
2
apt download pve-edk2-firmware-aarch64=3.20220526-rockchip
dpkg -i pve-edk2-firmware-aarch64_3.20220526-rockchip_all.deb

3.5. 安装后优化

由于我们机器内存和cpu 都比较首先, 有些服务和设置可以优化,可以减少内存和cpu消耗。

3.5.1. 减少worker数量

默认的workers是3,可以修改下面PVE/Service对应的文件,最低worker为1

1
2
3
sed -i.bak 's/max_workers => [0-9]\+/max_workers => 1/g' /usr/share/perl5/PVE/Service/pvedaemon.pm
sed -i.bak 's/max_workers => [0-9]\+/max_workers => 1/g' /usr/share/perl5/PVE/Service/pveproxy.pm
sed -i.bak 's/max_workers => [0-9]\+/max_workers => 1/g' /usr/share/perl5/PVE/Service/spiceproxy.pm

3.5.2. 停用HA服务

集群可以使用HA服务,如果是单节点,或者没有HA场景,可以禁用

1
2
3
4
systemctl stop pve-ha-lrm.service
systemctl stop pve-ha-crm.service
systemctl disable pve-ha-lrm.service
systemctl disable pve-ha-crm.service

3.5.3. 停用防火墙服务

1
2
systemctl disable pve-firewall.service 
systemctl stop pve-firewall.service

3.5.4. 停用调度服务

如果不需要计划任务,如备份。

1
2
systemctl stop pvescheduler.service
systemctl disable pvescheduler.service

3.5.5. 停用Spiceproxy

Arm版本就不支持Spice,可以停用

1
2
systemctl stop spiceproxy.service 
systemctl disable spiceproxy.service

3.5.6. 禁用zram

1
2
systemctl disable armbian-zram-config.service
systemctl disable armbian-ramlog.service

一切完成后,重启一次服务器。
重启之后,浏览器访问 https://192.168.2.15:8006 应该能打开pve 界面。
用户名 root, 密码是之前安装armbian 设置的密码

4. 安装openwrt

安装openwrt 可以使用lxc 或者裸机安装,我这里选择lxc, 性能损失更少。

4.1. 准备模版

部署 lxc 容器需要准备一个模版,可以在这里下载,如果不想自己编译,可以在这里下载原版的openwrt。https://mirrors.ustc.edu.cn/openwrt/releases/23.05.5/targets/armsr/armv8/openwrt-23.05.5-armsr-armv8-rootfs.tar.gz.
如果下载地址失效了,可以切换到其他版本试试,重点就是,架构要选择 armv8, 文件选择 rootfs.tar.gz 结尾的。
可以直接在 PVE 中下载。
左侧依次选择 数据中心 > armbian > local(armbian) ,中间菜单选择 CT 模版,上方有一个从 URL 下载,输入链接后,点击查询网址,然后下载即可。

上面的链接下载完成后,得到的是纯净版的 openwrt, 没有任何插件,如果需要更多功能,可以自己编译或是选择其他人编译好的镜像自己提取。提取教程参考

我最终选择的是更适合国内用户的 immortalwrt
我直接选择的最新版本(24.10.2), 需要按照上面的教程提取一下rootfs.固件链接
当然也可以自己编译, 我在另一边文章中详细编写了编译教程.

4.2. 创建虚拟网桥

机器自己只有一个网口,为了做软路由,我们需要再插一个 USB 网卡或者拆掉内置的无线网卡, 插一张有线网卡进去,这个第二网卡会被识别为 eth1.
这里我们把另外一张网卡作为wan 口,内置的网卡作为 lan 口。
内置网卡作为 lan 的好处在于, 这样即使软路由系统配置错误, 或者外置网卡本身故障, 我们还可以给电脑配置固定ip, 进入pve 控制台.
接下来我们需要直通网卡, 让软路由可以提供服务.
但是有一个问题, 如果两个都直通到容器里面,那 pve 自己就无法访问了,那么其他虚拟机也没办法联网.
所以海需要一个创建虚拟网桥了,作用上类似一个虚拟交换机。
我们只需要 lan 做网桥就可以了。
外置网卡wan 直通就行。
左侧依次选择 数据中心 > armbian, 中间菜单选择 系统 > 网络,顶部选择 创建>linux bridge
名称我们这里取名 lan, 方便后面使用,
IPV4/CIDR 填入机器的静态IP/子网大小,子网家用通常填写 24, 本教程中,最终填入的内容就是 192.168.2.15/24
网关填写实际的网关即可,桥接端口输入 eth0, 其他保持默认即可。
确认无误后,点击创建,顶部选择应用配置。
一定仔细检查,否则机器会断网,最坏的结果就是可能会需要重新安装系统。

4.3. 创建容器

重新回到命令行,执行下面命令创建容器,参考

1
2
3
4
5
6
7
8
9
10
pct create 100 \
local:vztmpl/openwrt-23.05.5-armsr-armv8-rootfs.tar.gz \
--rootfs local:4 \
--ostype unmanaged \
--hostname openwrt2 \
--arch arm64 \
--cores 4 \
--memory 1024 \
--swap 0 \
-net0 bridge=lan,name=eth0

命令表示创建一个 lxc 容器,id 是 100,
使用模版openwrt-23.05.5-armsr-armv8-rootfs.tar.gz
分配硬盘存储空间 4G,可以根据需要自由调整
主机名为 openwrt2, 按照实际需求调整
架构是 arm64,
核心4个,这个可以按照实际需要调整
内存 1G (1024M),无swap 分区,可以按照需要自行调整。
创建一个网卡,eth0, 桥接到 lan。

4.4. 修改容器配置

虚拟机还需要调整一下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat >>/etc/pve/lxc/100.conf<<EOF
features: mknod=1
hookscript: local:snippets/openwrt-hookscript.pl
lxc.apparmor.profile: unconfined
lxc.include: /usr/share/lxc/config/openwrt.common.conf
lxc.cgroup2.devices.allow: a
lxc.cap.drop:
lxc.mount.auto: proc:mixed sys:ro cgroup:mixed
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
lxc.mount.entry: /dev/ppp dev/ppp none bind,create=file

#直通网口
lxc.net.1.type: phys
lxc.net.1.link: eth1
lxc.net.1.flags: up
EOF

配置解释如下

  • features: mknod=1
    • 含义:允许容器内创建特殊设备文件(mknod)。
    • 作用:支持容器内动态创建字符设备或块设备节点,例如 /dev/net/tun
  • hookscript: local:snippets/openwrt-hookscript.pl
    • 含义:指定一个钩子脚本。用于我们后面自动添加tun 后 ppp 设备。
  • lxc.apparmor.profile: unconfined
    • 含义:指定容器使用的 AppArmor 配置文件。
    • 作用unconfined 表示容器运行时不受 AppArmor 的限制,目的主要是提升权限
  • lxc.include: /usr/share/lxc/config/openwrt.common.conf
    • 含义:加载一个额外的 LXC 配置文件。
    • 作用:添加一些 openwrt 的基础配置
  • lxc.cgroup2.devices.allow: a
    • 含义:允许容器访问的设备。
    • 作用a 表示所有设备。
  • lxc.cap.drop:
    • 含义:指定要从容器中删除的 Linux 功能(capabilities)。
    • 作用:默认容器运行时会移除一些危险的功能(如直接修改网络配置的 CAP_NET_ADMIN)。留空时,容器保留所有功能。
  • lxc.mount.auto: proc:mixed sys:ro cgroup:mixed
    • 含义:定义自动挂载的文件系统。
    • 作用:提供容器运行时所需的核心文件系统支持。
  • lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
    • 含义:绑定宿主机的设备 /dev/net/tun 到容器内的同路径。
    • 作用:容器内允许使用 TUN/TAP 接口,用于支持 VPN 业务。
  • lxc.mount.entry: /dev/ppp dev/ppp none bind,create=file
    • 含义:绑定宿主机的 /dev/ppp 到容器内。
    • 作用:容器内允许使用 PPP(Point-to-Point Protocol)设备,拨号用。

最终文件可能如下(mac 地址不要照抄啊):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
arch: arm64
cores: 4
hostname: openwrt2
memory: 1024
net0: name=eth0,bridge=lan,hwaddr=BC:24:11:BC:B9:14,type=veth
ostype: unmanaged
rootfs: local:100/vm-100-disk-0.raw,size=4G
swap: 0

features: mknod=1
hookscript: local:snippets/openwrt-hookscript.pl
lxc.apparmor.profile: unconfined
lxc.include: /usr/share/lxc/config/openwrt.common.conf
lxc.cgroup2.devices.allow: a
lxc.cap.drop:
lxc.mount.auto: proc:mixed sys:ro cgroup:mixed
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
lxc.mount.entry: /dev/ppp dev/ppp none bind,create=file

#直通网口
lxc.net.1.type: phys
lxc.net.1.link: eth1
lxc.net.1.flags: up

4.5. 添加钩子脚本

上面配置中,引用了一个钩子脚本,用于设置tun 设备 和 ppp 设备, 这两个设备用于拨号和某些 vpn 服务.
执行这个命令创建这个脚本.

1
2
3
4
# 执行这个
mkdir -p /var/lib/vz/snippets
cp /usr/share/pve-docs/examples/guest-example-hookscript.pl /var/lib/vz/snippets/openwrt-hookscript.pl
sed -i '/^[[:space:]]*print "$vmid started successfully.\\n";/{h;s/^\([[:space:]]*\).*/\1/;x;G;s/\(.*\n\)\(.*\)/\2system("lxc-device add -n \$vmid \/dev\/ppp");\n\2system("lxc-device add -n \$vmid \/dev\/net\/tun");\n\1/}' /var/lib/vz/snippets/openwrt-hookscript.pl

4.6. 启动openwrt

使用命令启动容器

1
pct start 100

普通的openwrt, 在第一次启动后, 默认使用 192.168.1.1/24 网段, 和我们之前设置的网段冲突了,所以还需要改一下 IP 地址.
将lan 口的网线从路由器拔下来,插到你自己电脑上,设置本机使用静态IP 地址, IP 为 192.168.1.x 网段的IP。
浏览器访问 192.168.1.1,账号root, 默认无密码登陆。
进入之后,切换到 network > interfaces > lan, edit, ip 地址改为 192.168.2.1(这里使用你实际用的网段,不需要照抄)
修改好之后,点击 save 保存配置,再点击 save& apply 应用配置, 二次确认窗口选择 apply and keep setting
去掉本机设置的 ip, 改为自动获取或者修改为新的网段,稍后就可以 新的 ip 地址访问openwrt 了。
接下来就是设置拨号之类,自行设置即可。

4.7. 剩下的事情

  1. 设置为开机启动, 不然每次重启pve 后, 还需要手动启动openwrt.
  2. 性能测试: 开启openvpn 后, 访问异地的网络, 下载速度7M 左右时, cpu 占用约 22%

5. homeassistant

homeassistant 并没有官方的lxc 容器支持, 只能使用虚拟机模式, 这也就是为什么我们需要安装pve 虚拟机的原因.

5.1. 下载镜像

可以在 这里下载到官方编译的所有镜像.
选择下载类似 haos_generic-aarch64-xx.yy.qcow2.xz 的磁盘文件. 下载解压后, 上传到pve.
如果pve 可以直接访问github, 也可以直接下载解压.

1
2
3
# 链接根据实际情况替换.
curl -L -O https://github.com/home-assistant/operating-system/releases/download/16.0/haos_generic-aarch64-16.0.qcow2.xz
xz -d haos_generic-aarch64-16.0.qcow2.xz

5.2. 创建空白虚拟机

打开pve 网页控制台, 右上角有一个创建虚拟机的链接.
选择创建虚拟机.
下面依次说明

5.2.1. 常规

可以保持原状, 也可以修改一下名称. 方便使用.

5.2.2. 操作系统

左侧的光驱不需要, 选择不实用任何介质. 右侧的系统, 类别选择 Linux, 版本选择 6.x - 2.6 Kernel

5.2.3. 系统

SCSI 控制器改为 VirIO SCSI, 记住别选哪个带 single 的
BIOS 选择 OVMF, 去掉默认勾选的添加EFI 磁盘.
其他保持默认.

5.2.4. 磁盘

左侧列表中, 直接删掉默认磁盘. 我们使用下载好的磁盘即可.

5.2.5. CPU

homeassistant 还是毕竟消耗cpu 的, 所以我这里选择使用 4个核心(不能选 6 个)
打开高级选项, 设置cpu 绑定为 0-3.
这里也可以根据你的需要, 选择其他设置. 但是cpu 类别不能改. 也不能绑定的时候, 同时使用大小核.

5.2.6. 其他

其他根据需要即可. 如果没有特别要求, 使用默认值就行.

创建好之后, 左侧列表中会有一个虚拟机. 记住那个id, 比如 101. 暂时不用启动.

5.3. 导入磁盘.

回到pve 命令行, 找到之前准备好的 qcow2 文件.
执行命令导入的磁盘

1
qm importdisk 101 haos_generic-aarch64-xx.yy.qcow2  local --format qcow2  

101 是虚拟机id, 这个根据实际情况选择.
haos_generic-aarch64-xx.yy.qcow2 是之前准备的磁盘.
local 是存储的名字, 默认是这个, 如果要安装到其他地方, 或者sd 之类的, 需要根据实际情况调整.

5.4. 使用磁盘

在web 控制台中, 选择之前创建的虚拟机, 打开硬件子菜单.
应该可以看到一个磁盘, 双击添加.
默认磁盘有点太小了, 我们调整一下大小.
然后再次选择添加好的磁盘, 上面的磁盘操作, 选择调整大小, 输入要增加的空间.
不要超过实际可用空间了, 否则后面用的时候会报错的.

5.5. 调整开机选项

打开虚拟机的选项子菜单.
选择引导顺序, 把之前导入好的磁盘勾选, 并移动到顶部.

5.6. 开机.

打开虚拟机的控制台, 开机即可.
初始化过程非常漫长, 特别是网络不太好的情况下.

6. 总结

我的openwrt 和 pve 运行在内置存储, 另外插了一张 32g 的 sd 卡给 homeassistant 作为存储.
homeassistant 分配了 2g, 安装了 hacs, homekit, esphome 等少量插件. 由于房间很小, 接入的设备数量不多, 目前看起来还够用.
我试过分配 2.5g 内存, 但是会导致pve 内存吃紧, 遂放弃.
openwrt 装了 openvpn 做异地组网, 带宽大的时候, cpu 会占用比较多. 其他时候还好.
装完homeassistant 明显感觉机器发热变严重了, 不过不烫手, 也算是能接受的程度.

参考资料

PVE系统安装LXC版OpenWrt
immortalwrt
pveproxy fails to load local certificate chain after upgrade to pve 6
Install Proxmox VE on Debian bookworm
Error while installing fupdown2 version 3.2.0-1+pmx7
xiayang0521/rk-images
佛西大佬的安装Arm版本的Proxmox VE
Debian 12 (bookworm)设置静态IP

最后也要感谢deepseek, 有不懂的可以多多问问.