|
|
openwrt 24.10 版本来了,现在整个 linux 世界基本上都在用 nftables ,但是 docker 仍然非常顽固的使用 iptables 并且没有任何迁移到 nftables 的迹象。
经过一年多的沉淀,我现在终于在 openwrt 上跑通了 rootless lxc + rootless podman 的组合。当然,这并不是我技术多么好,而是 podman 5.0 以后,他的网络后端 netavark 对 nftables 的支持已经相当完善,基本上能提供开箱即用的体验了。
我知道大多数人的 aio 都是用 pve 做底层的,但是因为我对于虚拟化的需求并不高,我不需要跑太多的虚拟机,只是单纯的写了几个 python 的程序想跑在容器里,享受权限隔离带来的好处,不要影响到 host 系统。所以我的 N100 小主机就用 openwrt 作为 host
他有4个网口,其中eth0插光猫上网。eth1 插光猫 iptv,eth2 插交换机提供内网服务,eth3分配给 lxc 容器独占,也插交换机,假装自己是内网的一台独立小主机。
说说几个关键性的要点:
编译时勾选 lxc 再进到二级菜单里把里面的选项全勾选上,这样必要的内核模块基本上就齐了
openwrt 配置文件里 /etc/subuid 和 /etc/subgid 都加上 root:100000:200000 这里比较必要,给20万个id是因为要套娃,也就是 lxc 容器要65535个id,lxc里跑的 podman还要65535个id,懒得搞的那么精确了,干脆写20万
lxc 配置文件里:
#lxc.include = /usr/share/lxc/config/nesting.conf
这一行不要取消注释,手动在下面加上这两行:
lxc.mount.entry = proc dev/.lxc/proc proc create=dir,optional 0 0
lxc.mount.entry = sys dev/.lxc/sys sysfs create=dir,optional 0 0
然后 idmap 配置:
lxc.idmap = u 0 100000 165536
lxc.idmap = g 0 100000 165536
这里写20万也没毛病
然后务必把 tun 设备直通进去
lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file
另外,在 /etc/rc.local 里加上这几行:
chmod 666 /dev/net/tun
mount -o remount,rw,nosuid,nodev,noexec,relatime proc /proc
mount -o remount,rw,nodev,noexec,relatime sysfs /sys
echo +pids > /sys/fs/cgroup/cgroup.subtree_control
因为 openwrt 默认只给 root 用户自己用 tun 设备, 但是我查了一下手册, tun 设备就是给大家用的,不用担心乱给权限会出问题,所以改成 666 就行了。
然后下面的两行是 openwrt 论坛里别人给的解决方案,我没测试不加上有没有影响。
echo +pids > /sys/fs/cgroup/cgroup.subtree_control 这句必须要有,因为默认情况下 cgroup 里没有 pids 控制器,我不知道为啥,可能是我编译配置有问题?不过加上就好了,因为podman要用到。
最后 lxc 容器的发行版务必选择内置的 podman 版本是 5.0 或以上, netavark 版本 1.10以上(截止到我写这个帖子,最新版本是 1.14),我用的是 fedora 41
至于发行版内部怎么装podman怎么运行这件事,那就是各个发行版自己的事情了,你做了我说的上述事情,至少从 host 层面上不会有什么问题了
|
|