找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 2683|回复: 16

openwrt 运行 rootless lxc 并在其中运行 rootless podman

[复制链接]
发表于 2025-2-14 14:48 | 显示全部楼层 |阅读模式
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 层面上不会有什么问题了
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
 楼主| 发表于 2025-2-14 14:51 | 显示全部楼层
对了, lxc 装好之后还是得检查一下容器内部的 /etc/subuid 和 /etc/subgid ,因为我们只给容器 20 万个 id,有的发行版一上来 subuid 就从524288开始分,改成 10万就好了
至于podman运行可能还会有别的报错,大多数都是从你容器内部找原因,都是简单的小问题,比如我用的 fedora 41 ,他的 newuidmap 和 newgidmap 缺少权限,你要手动加一下:
sudo setcap cap_setuid+ep /usr/bin/newuidmap
sudo setcap cap_setgid+ep /usr/bin/newgidmap
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2025-2-15 10:54 | 显示全部楼层
成功用 Quadlet 配置生成 systemd 单元跑起来了 homeassistant


[Unit]
Description=homeassistant server

[Container]
Environment=TZ=Asia/Shanghai
Image=ghcr.io/home-assistant/home-assistant:stable
Network=macvlan.network
PodmanArgs=--mac-address 00:11:22:33:44:55:66 --memory 4G
Volume=/srv/docker/root/volumes/homeassistant/:/config:Z

[Service]
Restart=always

[Install]
WantedBy=multi-user.target

只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2025-3-4 12:43 | 显示全部楼层
目前还没luci-app-podman

点评

不需要,直接 lxc 建一个 fedora ,然后在 fedora 里跑 podman 有 systemd 的加持,可以做到开机启动,崩溃重启,自动更新 而且配置简单,有 podlet 这种工具帮忙写配置文件  详情 回复 发表于 2025-3-10 10:35
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2025-3-10 10:35 | 显示全部楼层
那个男人 发表于 2025-3-4 12:43
目前还没luci-app-podman

不需要,直接 lxc 建一个 fedora ,然后在 fedora 里跑 podman
有 systemd 的加持,可以做到开机启动,崩溃重启,自动更新
而且配置简单,有 podlet 这种工具帮忙写配置文件

点评

目前用的openwrt 跑不了podman  详情 回复 发表于 2025-3-14 16:15
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2025-3-14 16:15 | 显示全部楼层
迷路的羽先生 发表于 2025-3-10 10:35
不需要,直接 lxc 建一个 fedora ,然后在 fedora 里跑 podman
有 systemd 的加持,可以做到开机启动,崩 ...

目前用的openwrt  跑不了podman

点评

可以的, openwrt 本身有 podman 软件包,我之前就是用 openwrt 跑的 podman 只不过没有 daemon 负责故障重启,所以才改了 lxc 方案。 而且也是 openwrt 做 host 跑 lxc  详情 回复 发表于 2025-3-20 08:55
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2025-3-20 08:55 | 显示全部楼层
那个男人 发表于 2025-3-14 16:15
目前用的openwrt  跑不了podman

可以的, openwrt 本身有 podman 软件包,我之前就是用 openwrt 跑的 podman 只不过没有 daemon 负责故障重启,所以才改了 lxc 方案。
而且也是 openwrt 做 host 跑 lxc

点评

我也尝试在openwrt跑podman,发现提示Error: configure storage: 'overlay' is not supported over overlayfs, a mount_program is required: backing file system is unsupported for this graph driver 不知道如何  详情 回复 发表于 2025-9-2 01:52
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2025-7-11 17:37 | 显示全部楼层
请教一下楼主,如果直接在 openwrt 上跑 podman ,接口和设备该如何配置。
我直接在immortalwrt上装了podman,然后部署了镜像,但是却无法通过IP:端口的方式访问到该镜像。
固件版本:ImmortalWrt 24.10.2
内核版本:6.6.93
感谢
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2025-7-26 16:48 | 显示全部楼层
https://github.com/breeze303/openwrt-podman
我收集整理了一个luci-podman,bug还很多,正在优化中

点评

已经有可以用的luci了https://github.com/Zerogiven-OpenWRT-Packages/luci-app-podman  详情 回复 发表于 2026-1-28 22:41
podman的默认存储路径系统重启部署的镜像都没了!哎!太难用了!只能继续忍受docker的iptables 了!  详情 回复 发表于 2025-8-14 12:42
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2025-8-14 12:42 | 显示全部楼层
breeze303 发表于 2025-7-26 16:48
https://github.com/breeze303/openwrt-podman
我收集整理了一个luci-podman,bug还很多,正在优化中
...

podman的默认存储路径系统重启部署的镜像都没了!哎!太难用了!只能继续忍受docker的iptables 了!
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2025-9-2 01:52 来自手机 | 显示全部楼层
迷路的羽先生 发表于 2025-3-20 08:55
可以的, openwrt 本身有 podman 软件包,我之前就是用 openwrt 跑的 podman 只不过没有 daemon 负责故障 ...

我也尝试在openwrt跑podman,发现提示Error: configure storage: 'overlay' is not supported over overlayfs, a mount_program is required: backing file system is unsupported for this graph driver
不知道如何解决

点评

这个提示还挺明显的,这是让你 overlay 的路径选一个其他文件系统, 比如 xfs  详情 回复 发表于 2025-9-4 15:35
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2025-9-4 15:35 | 显示全部楼层
xingmiye 发表于 2025-9-2 01:52
我也尝试在openwrt跑podman,发现提示Error: configure storage: 'overlay' is not supported over overl ...

这个提示还挺明显的,这是让你 overlay 的路径选一个其他文件系统, 比如 xfs

点评

原来是因为我装的支持选overlay的模块没有成功加载,加载了就正常了,不需要选其他文件系统  详情 回复 发表于 2025-9-8 10:36
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2025-9-8 10:36 | 显示全部楼层
迷路的羽先生 发表于 2025-9-4 15:35
这个提示还挺明显的,这是让你 overlay 的路径选一个其他文件系统, 比如 xfs ...

原来是因为我装的支持选overlay的模块没有成功加载,加载了就正常了,不需要选其他文件系统
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-1-28 22:41 | 显示全部楼层
breeze303 发表于 2025-7-26 16:48
https://github.com/breeze303/openwrt-podman
我收集整理了一个luci-podman,bug还很多,正在优化中
...

已经有可以用的luci了https://github.com/Zerogiven-OpenWRT-Packages/luci-app-podman
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-3-4 11:15 | 显示全部楼层
lz我这边设置root:100000:200000后启动容器发现挂载rootfs的权限不对:lxc-start: debian: ../src/lxc/storage/dir.c: dir_mount: 163 Permission denied - Failed to open "/srv/lxc/debian/rootfs"
看了下应该是拉取容器是使用root拉的,所以uid是0,之后启动容器是使用映射后的uid挂载,所以没权限。lz有遇到类似情况吗

点评

创建容器的时候就要写好 config 文件  详情 回复 发表于 2026-3-4 16:10
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /2 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2026-8-23 20:06

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 电话:13506125623

快速回复 返回顶部 返回列表