PVE LXC 容器运行 OpenWRT 软路由

✨ 在 PVE 的 LXC 容器中安装 OpenWRT 作为软路由,可以利用 PVE 的虚拟化技术运行 x86 架构的软路由系统。选择 LXC 容器是因为它具有更高的性能和效率,并且资源开销较少。安装 OpenWRT 的镜像可以选择第三方编译的镜像,也可以自行选择官方镜像。创建容器时需要指定一些参数,如容器 ID、根文件系统模板、主机名等。创建完成后,可以通过 Web 页面配置 OpenWRT,包括网络设置、插件安装等。通过将设备的 Wi-Fi 设置指向 OpenWRT 的 IP 地址,可以实现按需使用,方便维护和故障排除。另外,如果 PVE 运行在老旧电脑上,可以设置功耗墙来限制功耗。

以前自己折腾的都是 ARM 架构的硬路由,虽然也了解过软路由,但总归是纸上谈兵。现在有了 PVE ,可以好好体验一下 x86 架构的软路由了。

软路由的系统首选的自然是开源的 OpenWRT,毕竟刷硬路由时已经较为熟悉了,并且相关的固件资源、软件包等都十分丰富。

虚拟化选择

PVE 支持KVM和LXC两种虚拟化技术,各有优势。

KVM ——(Kernel-based Virtual Machine),是完全基于硬件的虚拟化技术。多个 KVM 虚拟机各自运行着独立的操作系统内核,因此有着更高的隔离性和安全性。

LXC —— (Linux Containers),顾名思义就是 Linux 系统下的容器,是操作系统级的虚拟化技术。共享宿主机内核,因此只能安装 Linux 系统,但也有着更高的性能和效率,以及更少的资源开销。

扩展:LXC 对比 Docker
  • 虚拟化范围

    • LXC提供操作系统级虚拟化,虚拟出来的是完整的Linux系统环境。
    • Docker针对的是应用级虚拟化,每一个容器虚拟化的是某个应用所需的运行环境。
  • 实现技术

    • LXC通过内核的namespace和cgroups实现资源隔离。
    • Docker在LXC之上构建了自己的容器格式和运行时。
  • 镜像构建

    • LXC类似虚拟机,需要安装操作系统和软件打包。
    • Docker有联合文件系统,可以基于base镜像增量构建。
  • 移植性

    • LXC移植性较差,与操作系统内核耦合。
    • Docker实现应用打包,可以跨操作系统环境运行。

总体来说,LXC 提供系统级虚拟化,Docker 实现应用级打包。LXC 相当于一个轻量级的 Linux 虚拟机,而 Docker 则是在其基础上构建的应用容器引擎。

结合软路由特性,在此我选用 LXC 来运行 OpenWRT。

💡
因 PVE 宿主机仅有单网口,且身边也没有支持 VLAN 的交换机,故暂时只能将 OpenWRT 用作旁路由。

安装配置

  • 创建 LXC 容器

登录到 PVE 宿主机 Shell

# 下载镜像
wget https://dl.openwrt.ai/releases/targets/x86/64/openwrt-11.19.2023-x86-64-generic-rootfs.tar.gz

# 创建容器
pct create 200 openwrt-11.19.2023-x86-64-generic-rootfs.tar.gz --rootfs local-lvm:0.5 --ostype unmanaged --hostname ct-openwrt --arch amd64 --cores 2 --memory 512 --swap 0 -net0 bridge=vmbr0,name=eth0 --unprivileged 1

上面创建容器命令参数说明如下:

pct create:创建一个容器

200:容器的 ID,这里指定为 200

openwrt-11.19.2023-x86-64-generic-rootfs.tar.gz:容器使用的根文件系统模板

  • -rootfs local-lvm:0.5:给容器分配 0.5G 的本地 LVM 存储
  • -ostype unmanaged:标记该容器的类型为 unmanaged,即未托管
  • -hostname ct-openwrt:容器的主机名为 ct-openwrt
  • -arch amd64:容器架构为 amd64
  • -cores 2:分配 2 个 CPU 核心给容器
  • -memory 512:分配 512 MB 内存给容器
  • -swap 0:不分配 swap
  • -net0 bridge=vmbr0,name=eth0:分配 eth0 网卡,桥接 vmbr0 接口
  • --unprivileged 1:创建一个无特权(unprivileged)的LXC容器

容器创建完成,为了快速测试,就不做额外配置,直接启动容器。

此固件默认的用户名密码为 root / root

因为此固件默认 LAN 口静态地址为 10.0.0.1,现将其修改为同局域网段 IP 用于访问。

vim /etc/config/network

修改保存后重启 OpenWRT ,查看 IP :

访问 Web 页面开始配置,此固件提供了网络向导,可快速将其配置为旁路由模式。

配置完成后,OpenWRT 即已经工作在旁路由模式。

OpenWRT 中安装去广告、DNS 分流、代理等插件及相应配置等此处暂时略去不表(后续有时间再行整理)。

OpenWRT 上配置完成后,同局域网下其他设备只需要将设备的 Wi-Fi 设置由 DHCP 改为静态 IP,同时将网关指向 OpenWRT 所对应的 IP 地址即可。这样可以实现按需使用,即使 OpenWRT 出现问题,再将 Wi-Fi 设置改回去就是,不会影响基本上网功能。

参考致谢

https://openwrt.org/docs/guide-user/virtualization/lxchttps://helper-scripts.com/https://zenofhacking.com/zh/posts/openwrt-from-kvm-to-lxc/


其他事项

若PVE是运行在老旧电脑上,一般功耗较大,运行软路由可考虑设置功耗墙
# 安装
apt install powercap-utils
# 查询当前功耗信息
powercap-info -p intel-rapl
# 新建 systemd 启动脚本
vim /etc/systemd/system/powerlimit.service

# 脚本内容如下:限制为 12 W
# Simple service unit file to optimize power limit

[Unit]
Description=Power limit tune script
After=loadcpufreq.service
Wants=loadcpufreq.service

[Service]
Type=oneshot
ExecStart=powercap-set -p intel-rapl -z 0 -c 0 -l 12000000

[Install]
WantedBy=multi-user.target