Podman 6.0 升级笔记:BoltDB、cgroups v1、CNI 全被移除,升级前先跑这几条检查
Podman 6.0 的升级路径和以往不同:它移除的旧组件比新增的功能更值得关注——BoltDB 存储、cgroups v1、CNI 网络、slirp4netns、iptables 都在删除列表里。机器如果还跑在这些底座上,升级后不是“行为变化”,而是直接不可用或语义反转。下面按升级顺序记一遍。
一、先把版本对齐,6.0 不是单独升的
6.0 要求与 Buildah v1.44.0、Skopeo v1.23、Netavark 与 Aardvark v2.0.0、container-libs common/v0.68.0 的配置文件配合使用。构建 Podman 所需最低 Go 版本为 1.25,Go 导入路径从 github.com/containers/podman/v5 改为 go.podman.io/podman/v6(已迁入 CNCF 所属 GitHub 组织)。
上游计划 6.0 在 2026 年春季 GA,目标随 Fedora 44 发布。打包或批量升级时注意这几个依赖要一起升,别只动 podman 一个包。
二、升级前检查
podman info | grep -Ei 'cgroupversion|databasebackend'
podman volume ls
ls /etc/cni/net.d
nft list ruleset | head -20
iptables-save | head -20
systemctl --version
podman machine list
判读方式:
cgroupVersion是 1 的机器,必须先切到 cgroups v2(systemd 247 起默认 unified 层级,或内核参数systemd.unified_cgroup_hierarchy=1)。6.0 不再支持 v1。databaseBackend是 boltdb 的,不能直接跳 6.0。/etc/cni/net.d下有配置、iptables 表里存在容器相关规则的,需要提前迁到 Netavark + nftables。- 记下
podman volume ls的结果,后面 prune 语义变了。 podman machine list里有 VM 的,做好重建准备。
三、BoltDB:迁移要分两步走
6.0 移除 BoltDB 支持,用 BoltDB 的实例在启动 Podman 6 时会自动从 BoltDB 迁移到 SQLite。但迁移要在 5.x 上完成:先把 Podman 升到 5.8 并重启,确认迁移完成,再升 6.0。直接跳到 6.0 有 container state 不可用的风险。这是一次性动作,顺序不能反。
四、底座换血:cgroups v2 / Netavark / Pasta / nftables
四组旧组件一起移除:cgroups v1、CNI 网络、slirp4netns rootless 网络栈、iptables。对应必须的替代是 cgroups v2、Netavark、Pasta、nftables。仅服务于 slirp4netns 的全局选项 --network-cmd-path 也一并移除。
对 rootless 用户影响最大的是 slirp4netns → Pasta 这一跳,网络行为和性能特征会变;写死的 CNI 配置和 iptables 规则在 6.0 上不会再生效。
五、网络隔离默认开启
6.0 起网络隔离默认开启,提升 Docker 兼容性与安全性,同时移除了 Docker 兼容 API 中与“隔离被关闭”相关的特殊 workaround(#27349)。依赖关闭网络隔离的应用,升级后会突然发现容器之间不通——这类应用需要在配置里显式关掉隔离。
六、CLI 语义反转,脚本要重点看
podman volume prune现在与 Docker 一致,只清理未使用的匿名卷;要旧行为(清理所有卷)必须加新增的--all。podman volume list的多个 filter 从 OR 改为 AND,即所有 filter 都必须匹配(#26786)。label!=filter 多次出现同样从 OR 改为 AND。podman ps、podman pod ps、podman volume ls的--format '{{json .Labels}}'输出从 JSON map 变成逗号分隔的key=value对,以改善 Docker 兼容(#21847)。podman commit提交期间默认暂停容器,限制并发修改;旧行为用--pause=false恢复。
前四条会让现有脚本在升级后静默地少选或多选对象,最好先在测试机上对比一遍输出。
七、machine 与 Quadlet
Linux 上 podman machine 创建的 VM 改用 systemd 挂载宿主卷,已有 VM 的卷挂载会失效,需要重建 VM。podman machine list 的 --all-providers 被移除,所有 provider 的 machine 都能被所有命令访问。
Quadlet 相关文件以前用 .app 文件跟踪,删 Quadlet 会连带删掉所有非 Quadlet 文件;现在改成放进子目录管理,减少 bug,也方便手工维护 podman quadlet install 添加的内容。
八、其他变动
containers.conf 与 storage.conf 改为统一解析,解决远程客户端与 server 之间的困惑。podman inspect 的 MemorySwappiness 字段在用户未显式设置时从 -1 改为 nil,改善 Docker 兼容(#23824)。REST API 的 Go 绑定中 artifacts.Remove() 去掉了多余的 nameOrID 参数。
平台支持方面,Intel Mac 与 Windows 10 支持被移除;Mac 上新 machine 的默认 provider 从 applehv 改为 libkrun,与 Podman Desktop 1.21 保持一致。