F45 的 Podman 6:版本、rootless 与 Quadlet 实操
Fedora 45 的容器栈升到 Podman 6.1(官方 ChangeSet:Podman 6)。命令形态基本不变,真正影响迁移的有两处:API 版本跨了大版本,以及 podman generate systemd 正式被标记为弃用。
下面的输出都是 F45 上跑出来的。
先看版本与后端
Section titled “先看版本与后端”podman versionpodman info --format "{{.Host.Security.Rootless}} {{.Store.GraphDriverName}} {{.Version.Version}}"Client: Podman EngineVersion: 6.1.0API Version: 6.1.0Go Version: go1.27rc2-X:nodwarf5Build Origin: Fedora ProjectOS/Arch: linux/amd64
true overlay 6.1.0第二行三个值分别是:是否 rootless、存储驱动、服务端版本。API Version 与 Version 同步跳到 6.1——直接调 API 的脚本要按这个核对字段。
rootless 的 uid 映射
Section titled “rootless 的 uid 映射”rootless 不是”降级模式”,它靠 user namespace 把容器内的 root 映射到你的普通用户:
id -upodman unshare cat /proc/self/uid_map1000 0 1000 1 1 524288 65536读法:容器内 uid 0 → 宿主 uid 1000;容器内 uid 1–65536 → 宿主 524288 起的一段。这解释了为什么容器里的 root 动不了宿主的 root 文件——它根本不是宿主 root。
存储位置也随之落到家目录:
podman info --format "{{.Store.GraphRoot}}"/home/labuser/.local/share/containers/storagerootful 才在 /var/lib/containers/storage。排查”镜像明明拉了却看不到”时,先确认自己在哪个模式。
Quadlet:把容器交给 systemd(推荐做法)
Section titled “Quadlet:把容器交给 systemd(推荐做法)”F45 上 podman generate systemd 会直接打印弃用提示:
DEPRECATED command:It is recommended to use Quadlets for running containers and pods under systemd.替代方案是 Quadlet。完整流程:
第一步,写 unit 文件(注意扩展名是 .container,不是 .service):
mkdir -p ~/.config/containers/systemdcat > ~/.config/containers/systemd/hello.container <<'EOF'[Unit]Description=Hello container
[Container]Image=registry.fedoraproject.org/fedora-minimal:45Exec=sleep infinity
[Install]WantedBy=default.targetEOF第二步,让 systemd 看见它:
systemctl --user daemon-reloadsystemctl --user list-unit-files "hello*"UNIT FILE STATE PRESEThello.service generated -generated 是关键:Quadlet 在 daemon-reload 时把 .container 转成 .service,你不写 service 文件。
第三步,启动并确认:
systemctl --user start hello.servicepodman ps --format "{{.Names}} {{.Status}}"systemd-hello Up 1 second容器名自动是 systemd-hello——Quadlet 用 unit 名派生容器名。
常踩的三个点
Section titled “常踩的三个点”| 现象 | 原因 | 处置 |
|---|---|---|
Unit hello.service not found | 没跑 daemon-reload,或文件不在 ~/.config/containers/systemd/ | 确认路径与扩展名,再 reload |
| 退出 SSH 后容器停了 | 用户级 systemd 会随会话结束 | loginctl enable-linger $USER |
镜像拉了但 podman images 看不到 | 一个在 rootless(家目录),一个在 rootful(/var/lib) | 统一用同一个用户执行 |
loginctl enable-linger $USER # 让用户级服务在退出登录后继续运行升级后核对清单
Section titled “升级后核对清单”podman version确认 6.1,podman info看后端;podman ps -a确认旧容器还在、还能起;- 把所有
podman generate systemd生成的文件改写成 Quadlet(.container); - 重新
daemon-reload并逐个启动,确认 unit 状态是generated而非static。
- Fedora 容器与 rootless — 工具链全景与 SELinux
- 用 Toolbox 做隔离开发环境 — 开发侧的容器
- 命令速查 — podman 常用命令
- Fedora 45:变化、下载与升级入口 — 六项变化总览
- 官方:Fedora 45 ChangeSet