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 支持
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 用作旁路由。
安装配置
- OpenWRT 镜像
- 官方镜像
- ImmortalWRT 镜像
- 创建 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,这里指定为 200openwrt-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 设置改回去就是,不会影响基本上网功能。
参考致谢
其他事项
若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