PVE LXC 容器运行 OpenWRT 软路由

status
Published
type
Post
slug
openwrt-in-lxc-on-pve
date
Dec 29, 2023
tags
PVE
Linux
Config
OpenWrt
summary
在 PVE 的 LXC 容器中安装 OpenWRT 作为软路由,可以利用 PVE 的虚拟化技术运行 x86 架构的软路由系统。选择 LXC 容器是因为它具有更高的性能和效率,并且资源开销较少。安装 OpenWRT 的镜像可以选择第三方编译的镜像,也可以自行选择官方镜像。创建容器时需要指定一些参数,如容器 ID、根文件系统模板、主机名等。创建完成后,可以通过 Web 页面配置 OpenWRT,包括网络设置、插件安装等。通过将设备的 Wi-Fi 设置指向 OpenWRT 的 IP 地址,可以实现按需使用,方便维护和故障排除。另外,如果 PVE 运行在老旧电脑上,可以设置功耗墙来限制功耗。
以前自己折腾的都是 ARM 架构的硬路由,虽然也了解过软路由,但总归是纸上谈兵。现在有了 PVE ,可以好好体验一下 x86 架构的软路由了。
软路由的系统首选的自然是开源的 OpenWRT,毕竟刷硬路由时已经较为熟悉了,并且相关的固件资源、软件包等都十分丰富。

虚拟化选择

PVE 支持KVMLXC两种虚拟化技术,各有优势。
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容器
notion image
容器创建完成,为了快速测试,就不做额外配置,直接启动容器。
此固件默认的用户名密码为 root / root
notion image
notion image
因为此固件默认 LAN 口静态地址为 10.0.0.1,现将其修改为同局域网段 IP 用于访问。
vim /etc/config/network
notion image
修改保存后重启 OpenWRT ,查看 IP :
notion image
访问 Web 页面开始配置,此固件提供了网络向导,可快速将其配置为旁路由模式。
notion image
notion image
配置完成后,OpenWRT 即已经工作在旁路由模式。
OpenWRT 中安装去广告、DNS 分流、代理等插件及相应配置等此处暂时略去不表(后续有时间再行整理)。
OpenWRT 上配置完成后,同局域网下其他设备只需要将设备的 Wi-Fi 设置由 DHCP 改为静态 IP,同时将网关指向 OpenWRT 所对应的 IP 地址即可。这样可以实现按需使用,即使 OpenWRT 出现问题,再将 Wi-Fi 设置改回去就是,不会影响基本上网功能。
 

参考致谢

 

其他事项

若PVE是运行在老旧电脑上,一般功耗较大,运行软路由可考虑设置功耗墙
# 安装 apt install powercap-utils # 查询当前功耗信息 powercap-info -p intel-rapl
notion image
# 新建 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