OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 121

Rootless 配置:映射、ICMP 与注册表

在已有权限边界文章基础上,补充管理员配置和 rootless 环境条件。

所在专题Podman 容器工作流 ↗
约 6 分钟阅读开始阅读

先阅读 Rootless 的权限边界,理解 UID 翻译、挂载权限、存储和发布端口。本文保留进一步配置与特殊操作的细节。

subordinate ID 的分配与变更#

/etc/subuid 与 /etc/subgid 授权用户使用额外 UID/GID;newuidmap/newgidmap 辅助设置命名空间。范围必须由管理员确认没有冲突,不能把一个固定区间视为通用答案。

# 只读检查;把 user 换为实际用户名
cat /etc/subuid
cat /etc/subgid
# 示意记录:user:100000:65536

# 仅供非声明式发行版管理员在确认未重叠范围后使用
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 user
# 两项也可以分别设置
sudo usermod --add-subuids 100000-165535 user
sudo usermod --add-subgids 100000-165535 user

显式 usermod --add-* 是人工分配,不是自动分配;不必用 touch 创建文件来掩盖缺失的系统配置。改变已使用范围可能影响现有存储文件归属和长存命名空间,重新登录不保证完整迁移;维护时按所装版本查 podman system migrate 的影响并备份数据。NixOS 应声明 subUidRanges、subGidRanges 或合适的自动分配选项,不能直接修改受管理文件。没有 subordinate ID 时某些单 UID 情况仍可能运行,但多用户镜像解包或身份切换可失败,具体以错误阶段为准。

低端口与 ICMP 的系统政策#

低端口边界受系统配置影响,不能一律写成普通用户禁止 1024 以下端口:

# 查询
sysctl net.ipv4.ip_unprivileged_port_start
sysctl net.ipv4.ping_group_range

# 先用明确的高端口和 loopback 发布
podman run -p 127.0.0.1:8080:80 docker.io/library/nginx:alpine

# 以下会改变系统政策,只供管理员评估后在可变系统使用
sudo sysctl net.ipv4.ip_unprivileged_port_start=80
# 仅放行已确认的实际组 ID 范围,而不是所有组
sudo sysctl net.ipv4.ping_group_range="1000 1000"

ICMP 报错还可能来自容器没有 ping、user namespace、网络后端或过滤策略。原始 socket 权限与允许 ping socket 的组范围不同;不要仅凭 ping 失败断言应用网络断开。放宽低端口或 ping 组是全系统政策,NixOS 用 boot.kernel.sysctl 表达并保持管理员授权边界。示例组号需替换为实际授权组,不能直接照搬。

用户级存储和注册表配置#

# ~/.config/containers/storage.conf;不复制他人的固定 UID 路径
[storage]
driver = "overlay"
# runroot/graphroot 通常先保留工具推导的默认值

# 仅在确认底层文件系统/驱动支持相应配额后考虑:
# [storage.options.overlay]
# size = "20G"

overlay 是驱动名,fuse-overlayfs 可能是其 mount_program;不能把二者简单列为两个驱动。size 不是全局镜像、卷和所有容器共用的 20GB 限额,依驱动和文件系统的配额能力决定。已有存储迁移、NFS home 与根目录调整的边界见权限文章。

# ~/.config/containers/registries.conf
unqualified-search-registries = ["docker.io", "ghcr.io"]

[[registry]]
prefix = "docker.io"
location = "docker.io"

搜索列表决定未限定短名的查找,prefix/location 可用于注册表映射;配置镜像源需要验证来源、认证和可用性。教程优先使用完整镜像名,避免不同机器搜索顺序造成结果差异。没有公开任何商业订阅或私人镜像源。

何时需要 rootful 与额外能力#

低端口政策不可改变、特定设备/内核功能或不支持 rootless 的工作流可能需要管理员级运行;并非给 rootless 容器加 SYS_ADMIN 就能获得宿主 root 权限。加载宿主内核模块应由宿主管理员完成,不宜为了方便交给普通容器。

# 仅在确有需求并确认端口与授权后,管理员使用 rootful 存储视图
sudo podman run -p 127.0.0.1:8080:80 docker.io/library/nginx:alpine
# 当前用户与 root 分别管理不同资源
podman ps
sudo podman ps

rootless 容器也能读取或破坏已授权的个人文件。不要用挂载整个 / 并读取 /etc/shadow 的演示来验证安全;查询 rootless 标志、实际 userns 映射与受限演示目录更合适。

参考与延伸

  1. Podman 官方 run 手册 ↗
  2. Podman 官方总览与 rootless ↗
  3. Podman system migrate ↗
  4. containers/storage 配置 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

Podman 容器工作流

  1. 01Podman 基础原理
  2. 02Podman 基本使用指南
  3. 03Rootless 容器,文件权限到底算谁的?
  4. 04Rootless 配置:映射、ICMP 与注册表
  5. 05Pod 体系与 Kubernetes 清单
  6. 06Quadlet 如何把容器声明变成服务?
  7. 07Quadlet 的 Pod 与多服务配置
  8. 08Compose provider 与 Docker 工具互操作
  9. 09NixOS 上的 Podman 管理
  10. 10Podman 高级运维与调优
  11. 11Docker 与 Podman:架构、兼容与共存
CONTINUE READING / 下一篇Pod 体系与 Kubernetes 清单

组织共享网络的本地容器,并检查 Kubernetes 清单导入导出的范围。