在 iStoreOS(OpenWRT)上安装 Proxmox VE

在 iStoreOS(OpenWRT)的 Docker 上安装 Proxmox VE

提醒:

如果你认为本文在讲的PVE in Docker就是虚拟机套虚拟机,container = hypervisor,“就像vmware里面套vbox套hyperv日用一样”,对不起,这篇文章不适合你,请立即关闭,否则你会获得吃💩体验!

本文比较抽象,着重于解决抽象问题,不喜勿喷。狗子差点因为这个问题被爆。

一般情况下,我们自组 HomeLab(All in Boom),会选择使用一些专业的虚拟机管理系统作为底层,然后在宿主机上安装各种虚拟机,实现各种功能。

最近主子发现,在 iStoreOS / OpenWRT 的 Docker 中安装 Proxmox VE 真的超级爽

  1. OpenWRT 作为专业的路由器系统,你可以单独给虚拟机划分一个网段、设置网络转发等,能够在 LuCI 中提供完善的网络功能,无需复杂命令。
  2. 虚拟机崩掉不会影响家里设备上网,iStoreOS 也可直接作为轻 NAS 使用,存储位置更加灵活,能够降低 All in Boom 的风险。
  3. 对比那些 NAS 系统自带的、同是移植到 Docker 的 WebVirtCloud、美味十足小红帽的Cockpit,Proxmox VE的虚拟机管理系统十分直观,搞点直通啥的也不用编辑 xml 文件,也不依赖 libvirt,提高易用性,降低学习成本。
  4. 安装 OpenWRT 的设备大多性能不足、不支持直通 / SR-IOV 等高级操作,将路由器放到虚拟机里面后可能需要使用到网桥,会增加一些CPU转发网络的开销,这种方案可以极大提高网络转发效率,实现真正意义上的降本增效。
  5. 摸摸党,装两天虚拟机就不想用了,用Docker装PVE不会污染宿主机环境,等要用的时候再开就行。

个人认为这套方案适合于那种低功耗多网口小主机搞All in One,同时担任路由器应用服务器,日常任务能用 Docker 搭建完成,偶尔跑点虚拟机,要不是缺管理软件,这种情况真没必要上物理 Proxmox VE。

当然这种方案也存在弊端,因为不是原生 Proxmox VE 系统,只是相当于在 debian 的 Docker 容器中安装了 Proxmox VE 的相关软件包,集群、网络、存储等方面肯定受到一些功能限制,不过受到的限制也可通过大神的 Patch 解决,至于集群的话,应该没有勇士敢在生产环境用的吧。

前提准备

  1. 知道我这篇文章里面出现的名词有什么含义。

  2. 内存要大一点,最好预留 1-2GB 内存给 OpenWRT 和 Proxmox VE 使用。

  3. 什么BIOS开启VT那些我就不啰嗦了,下面的是重点。

  4. 你用的 OpenWRT 要有 Docker 支持,建议你在编译的时候就搞进去。

  5. 你用的 OpenWRT 要有 kvm 支持,具体可以参考这篇文章:OpenWrt as QEMU/KVM host server 的“Installing QEMU”一节,配置好相关依赖:

    你的设备上需要以下软件包:kmod-tunqemu-bridge-helper。根据客户机架构,安装 qemu-x86_64-softmmuqemu-arm-softmmu。如果你的硬件支持,请同时安装 kmod-kvm-amdkmod-kvm-intel 以获得更好的性能。

    Intel 系统和 x86_64 客户机的示例:

    1
    opkg install kmod-tun qemu-bridge-helper qemu-x86_64-softmmu kmod-kvm-intel

    首次安装后,重新启动设备。

安装PVE Docker

这里主子测试了一下几个容器:

  1. makedie/proxmox_ve
  2. neomediatech/pve

个人感觉第一个会更好用些,制作者也提供了在 DSM6、fnOS 上的安装教程:

为了实现数据持久化,我们需要手动从容器里面将 /etc/pve/var/lib/pve-cluster/var/lib/pve-manager 这几项复制出来后再映射回去,如果跳过复制直接映射(/var/lib/vz 除外)会导致无法进入Web UI,已向制作者建议能够增加相关逻辑自动创建/初始化配置文件。

建议先拉取好镜像,一般建议能用就不要升级,所以固定版本号。

具体哪个版本,去Docker Hub上查有哪些Tags。

1
docker pull makedie/proxmox_ve:8.2.7

进入到你要安装的目录:

1
2
mkdir /mnt/sata1-4/Configs/pve/
cd /mnt/sata1-4/Configs/pve/

先运行一个能够启动的容器:

1
2
3
4
5
6
7
8
9
docker run -idt \
--network host \
--privileged \
--name pve \
--device /dev/kvm \
--add-host pve-docker:10.0.8.1 \
--hostname pve-docker \
-v $PWD/vz:/var/lib/vz \
makedie/proxmox_ve:8.2.7

进入容器,将配置文件复制出来:

1
2
3
4
5
6
7
8
9
10
11
12
docker exec -it pve bash

mkdir /var/lib/data
mkdir /var/lib/data/pve
mkdir /var/lib/data/pve-cluster
mkdir /var/lib/data/pve-manager

cp -rf /etc/pve /var/lib/data/pve
cp -rf /var/lib/pve-cluster /var/lib/data/pve-cluster
cp -rf /var/lib/pve-manager /var/lib/data/pve-manager

exit

删除刚刚创建的容器:

1
2
docker stop pve
docker rm pve

创建可数据持久化的容器:

这里仅加了 kvm 和 vfio 支持,不知道是否支持 LXC,具体参考这个 Docker Compose:deploy.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mv ./vz/data .
docker run -idt \
--network host \
--privileged \
--name pve \
--device /dev/kvm \
--device /dev/vfio \
--add-host pve-docker:10.0.8.1 \
--hostname pve-docker \
--restart=always \
-v $PWD/vz:/var/lib/vz \
-v $PWD/data/pve:/etc/pve \
-v $PWD/data/pve-cluster:/var/lib/pve-cluster \
-v $PWD/data/pve-manager:/var/lib/pve-manager \
-e TZ=Asia/Shanghai \
-e root_password=root \
makedie/proxmox_ve:8.2.7

上述命令在iStoreOS中经过测试工作良好,请修改root_password后面的root为您的密码。

访问:https://10.0.8.1:8006 ,使用root用户和您的密码登录

你可以创建几个虚拟机,测试一下删除 PVE Docker 容器然后再重新创建,虚拟机配置文件和磁盘应该不会丢。如果丢了,检查一下文件位置。

创建虚拟机

别告诉我你不会,直接下一步下一步就好,网络设置我们后面还要改。

配置虚拟机网络

最头疼的就是这一步配置虚拟机的网络了。

在 Proxmox VE 中,虚拟机开机后会通过 perl 脚本自动创建虚拟网络设备(TAP)加入网桥,关机后自动删除这个 TAP,帮我们省了好些事情,这和 Docker 一样,不然我们还得手动创建TAP设备。

Proxmox VE 默认通过 ifupdown2 管理系统的网络,这个容器的 ifupdown2 是经过修改的,Proxmox VE 无法管理和配置宿主机网络设备,这意味着你能够在外部(OpenWRT)帮Proxmox VE完成网桥配置,只要名字对得上即可。

了解这些原理就轻松多了。

我是单网口台式机安装的 iStoreOS,eth0 接入到 br-lan 然后通过 DHCP 获取上级路由器分配的 IP。你的方案可能和我不太一样,但桥接上网的步骤基本是一样的。

桥接上网

在 OpenWRT 环境下,默认就有 br-lan 可以用,而且我们的 Proxmox VE 容器使用了 host 网络,能够共享主机的网络设备,我们只需手动编辑虚拟机配置文件 /etc/pve/qemu-server/<vmid>.conf(界面改不了),将网卡的 vmbr0 替换成 br-lan 即可桥接上网。

理论上你给 OpenWRT 的 br-lan 重命名为 vmbr0 也能实现,或者修改Proxmox VE容器的 /etc/network/interfaces 将vmbr0替换成 br-lan 也行。

题外话:其实一般情况下双网口机器你没必要设置 br-lan,唯一用途就在这里你创建虚拟机的时候有用,否则只是浪费CPU。

性能测试:

这个速度基本上和宿主机上跑的一样了,损失很小。

NAT上网

在OpenWRT LuCI 网络->接口->设备 里面创建一个网桥设备 vmbr0,MAC地址MTU啥的会自动给你生成不用管,勾上允许启动空网桥。

然后配置好 DHCP 和 NAT(充分利用 OpenWRT LuCI 的便利性,弥补 Proxmox VE 在这方面的不足)。

创建虚拟机专用的接口(这里是pvevm),不会就找台多网口的路由器照着他的LAN口参数抄。

我这边是单网口机器,所以lan的作用相当于WAN(还要负责上网),有点神奇,而且pvevm也划分到防火墙的LAN区域了,所以要启用LAN区域间NAT转发。

如果你是多网口且有WAN口,那么只用配置到防火墙的LAN区域即可,不过好像也得启用LAN区域间NAT转发,除非你想隔离虚拟机,不然真心推荐你使用回第一种桥接上网方案。

建议配置好后重启一下 Proxmox VE 的容器,刷新一下使 vmbr0 被识别为 Active 状态。

虚拟机开机后会通过 perl 脚本自动创建 TAP 设备加入到这个 vmbr0(正常操作),即可通过 NAT 上网,PVE 里面啥也不用设置。

性能测试:

有一点损失,和你挂一台路由器差不多。

User模式上网

如果您不方便给 Proxmox VE 的 Docker 容器使用 host 网络类型,您也可以使用 QEMU 的 User 模式进行上网。相当于 QEMU 自动完成了 NAT 操作,只要容器能上网虚拟机就能上网。由于不是专业的转发软件,性能比较一般。属于是有不起 OpenWRT 又配置不起 NAT 才用的方案。而且这种情况下基本不用想着搭建服务了,怎么从外部访问还要再打一个问号。

Proxmox VE不支持直接配置User模式上网,我们需要删除掉 Proxmox VE 里面的网卡,然后手动添加 QEMU 的运行参数。

1
qm set <VMID> -args '-netdev user,id=n0 -device virtio-net-pci,netdev=n0,mac=02:11:32:2a:76:f2'

性能测试:

这个勾💩网速还是在2代i5上跑的,你的CPU估计都跑不到这个水平。

直通物理设备

iStoreOS 照顾到了我们虚拟机用户,在 LuCI 界面即可完成直通的相关 GRUB 启动参数的配置,如果你是其它系统,可能要手动改一下 GRUB 的启动参数,加上对于 CPU 平台的 IOMMU 支持。

这里以直通集成声卡为例,在虚拟机里面直接添加 PCI 设备,一次就能成功。

启动到 WinPE 放歌,因为是老机型 ALC662 免驱,能听得到声音,说明能够直通PCI-E设备。

直通USB,我试了鼠标可以用,你可以放心共享你的只支持 Windows 驱动的打印机了。

直通显卡我的 Q67 平台比较老就不试了。就算是能直通也不用想着直通给Windows,我相信你的设备带不动的,驱动也不一定打得上,顶多弄个Kodi能亮就不得了了。

直通SATA控制器的,如果你真有这个需求,我觉得你不应该考虑这个方案。