跳转到内容
搜索 Fedora 文档

    浏览当前文档目录

    F45 的 Podman 6:版本、rootless 与 Quadlet 实操

    Fedora 45 的容器栈升到 Podman 6.1(官方 ChangeSet:Podman 6)。命令形态基本不变,真正影响迁移的有两处:API 版本跨了大版本,以及 podman generate systemd 正式被标记为弃用。

    下面的输出都是 F45 上跑出来的。

    Terminal window
    podman version
    podman info --format "{{.Host.Security.Rootless}} {{.Store.GraphDriverName}} {{.Version.Version}}"
    Client: Podman Engine
    Version: 6.1.0
    API Version: 6.1.0
    Go Version: go1.27rc2-X:nodwarf5
    Build Origin: Fedora Project
    OS/Arch: linux/amd64
    true overlay 6.1.0

    第二行三个值分别是:是否 rootless、存储驱动、服务端版本。API Version 与 Version 同步跳到 6.1——直接调 API 的脚本要按这个核对字段。

    rootless 不是”降级模式”,它靠 user namespace 把容器内的 root 映射到你的普通用户:

    Terminal window
    id -u
    podman unshare cat /proc/self/uid_map
    1000
    0 1000 1
    1 524288 65536

    读法:容器内 uid 0 → 宿主 uid 1000;容器内 uid 1–65536 → 宿主 524288 起的一段。这解释了为什么容器里的 root 动不了宿主的 root 文件——它根本不是宿主 root。

    存储位置也随之落到家目录:

    Terminal window
    podman info --format "{{.Store.GraphRoot}}"
    /home/labuser/.local/share/containers/storage

    rootful 才在 /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):

    Terminal window
    mkdir -p ~/.config/containers/systemd
    cat > ~/.config/containers/systemd/hello.container <<'EOF'
    [Unit]
    Description=Hello container
    [Container]
    Image=registry.fedoraproject.org/fedora-minimal:45
    Exec=sleep infinity
    [Install]
    WantedBy=default.target
    EOF

    第二步,让 systemd 看见它:

    Terminal window
    systemctl --user daemon-reload
    systemctl --user list-unit-files "hello*"
    UNIT FILE STATE PRESET
    hello.service generated -

    generated 是关键:Quadlet 在 daemon-reload 时把 .container 转成 .service,你不写 service 文件。

    第三步,启动并确认:

    Terminal window
    systemctl --user start hello.service
    podman ps --format "{{.Names}} {{.Status}}"
    systemd-hello Up 1 second

    容器名自动是 systemd-hello——Quadlet 用 unit 名派生容器名。

    现象原因处置
    Unit hello.service not found没跑 daemon-reload,或文件不在 ~/.config/containers/systemd/确认路径与扩展名,再 reload
    退出 SSH 后容器停了用户级 systemd 会随会话结束loginctl enable-linger $USER
    镜像拉了但 podman images 看不到一个在 rootless(家目录),一个在 rootful(/var/lib)统一用同一个用户执行
    Terminal window
    loginctl enable-linger $USER # 让用户级服务在退出登录后继续运行
    1. podman version 确认 6.1,podman info 看后端;
    2. podman ps -a 确认旧容器还在、还能起;
    3. 把所有 podman generate systemd 生成的文件改写成 Quadlet(.container);
    4. 重新 daemon-reload 并逐个启动,确认 unit 状态是 generated 而非 static。