跳转到内容
搜索 RHEL 文档

    浏览当前文档目录

    RHEL 10 Podman 5.8 rootless:subuid、UID 映射与运行

    rootless Podman 的“root”是命名空间里的 root:容器内 uid=0,宿主机上其实是你的普通用户 + 一段 subuid。理解这一点,才能解释权限、端口、存储为什么和 rootful 不一样。

    在 PVE 390 rhel10-lab(RHEL 10.2 x86_64)上以 cloud-user 执行:

    Terminal window
    podman --version
    podman info --format '{{.Host.Security.Rootless}}'
    grep cloud-user /etc/subuid /etc/subgid
    podman unshare cat /proc/self/uid_map
    podman pull registry.access.redhat.com/ubi10/ubi-minimal
    podman run --rm registry.access.redhat.com/ubi10/ubi-minimal id
    podman images --digests
    podman system df

    E3 记录:plans/content-expansion/evidence/rhel/rhel-podman-rootless/run.json(8 步,含每步输出 sha256)。

    • 容器内是 root,但只在该 user namespace 里有效;
    • 宿主机上对应的是 cloud-user 与 /etc/subuid 分配的 65536 个 UID;
    • 绑定 1024 以下端口、挂载宿主机文件、访问 rootful 容器存储都会受限制;
    • rootless 存储默认在 ~/.local/share/containers,不在 /var/lib/containers。
    $ grep cloud-user /etc/subuid /etc/subgid
    /etc/subuid:cloud-user:524288:65536
    /etc/subgid:cloud-user:524288:65536

    含义:从 524288 开始,给 cloud-user 分配 65536 个从属 UID/GID。没有这两行,rootless Podman 起不来(报 newuidmap: write to uid_map failed)。

    $ podman unshare cat /proc/self/uid_map
    0 1000 1
    1 524288 65536
    • 容器内 0 → 宿主 1000(cloud-user);
    • 容器内 1..65536 → 宿主 524288..589823;
    • 所以容器里的 root 写的文件,在宿主机上属主是 cloud-user 或 524288 起的 UID。
    Terminal window
    podman pull registry.access.redhat.com/ubi10/ubi-minimal
    podman run --rm registry.access.redhat.com/ubi10/ubi-minimal id
    # uid=0(root) gid=0(root) groups=0(root)

    镜像信息:

    REPOSITORY TAG DIGEST SIZE
    registry.access.redhat.com/ubi10/ubi-minimal latest sha256:c039ecb9… 87.9 MB

    id 显示 root,是命名空间内的 root;不要据此认为容器逃逸或拥有宿主 root。

    $ podman info --format '{{.Store.GraphRoot}}'
    /home/cloud-user/.local/share/containers/storage
    $ podman info --format '{{.Store.RunRoot}}'
    /run/user/1000/containers
    $ podman system df
    Images 1 87.86MB 87.86MB (100% reclaimable)

    清理:

    Terminal window
    podman system prune -a

    注意:rootless 的 prune 只清当前用户的存储,不影响 rootful 的 /var/lib/containers。

    现象原因处置
    newuidmap: write to uid_map failed缺 subuid/subgid 或未安装 shadow-utils补 /etc/subuid、/etc/subgid
    绑定 80 端口失败rootless 不能绑 <1024用 8080 或调 net.ipv4.ip_unprivileged_port_start
    看不到 rootful 镜像存储是分开的podman images 用同一用户;需要共享用 podman save/load
    家目录满镜像/层都在 ~/.local/sharepodman system df、迁移 graphroot
    • Host.Security.Rootless 为 true;
    • /etc/subuid、/etc/subgid 有当前用户;
    • podman unshare cat /proc/self/uid_map 映射合理;
    • 镜像 digest 与来源可追溯;
    • 知道存储/运行目录在用户家目录;
    • 端口、挂载、SELinux 标签按 rootless 规则调整。
    • 未测试 podman generate systemd / Quadlet 开机自启;
    • 未测试 rootless 网络(pasta/slirp4netns)与端口转发细节;
    • 未测试 :Z/:z SELinux 标签与卷挂载;
    • 未测试 rootless 与 rootful 镜像迁移。