把 graph root 挪到新路径
目标
将 rootless podman 的 graph root 从主目录迁移到独立路径,并用镜像重新填充新存储。这是实际工作中最常执行的 podman 运维任务之一。
为什么重要
rootless podman 的镜像会累积在 ~/.local/share/containers/storage 中。在一个 CUDA 基础镜像就有 8GB 的 GPU 服务器上,主目录分区很快就会被占满。而一旦主目录已满,不仅 podman,该用户的所有工作都会停止。因此,GPU 节点的标准配置通常直接包含 graphroot 迁移。
需要注意两点。新存储是空的——原有镜像仍留在旧路径,而 podman 不再查看它们。此外,不要迁移 runroot——其中保存运行时锁和临时状态,因此它应位于 tmpfs 上。
步骤
- 创建
/root/gr目录,把podster当前的graphRoot和runRoot各写一行到/root/gr/before.txt(graphRoot 在前)。 - 创建新路径
/srv/podman/podster,将所有者设为podster,权限设为700。 - 在
podster的storage.conf中,将graphroot改为新路径。 - 使用
podman info确认graphRoot是否为新路径,并将其作为一行写入/root/gr/after.txt。 - 将新存储的镜像数量以单独一行数字写入
/root/gr/empty.txt。该值应为0。 - 将
/opt/images/labhub-alpine.tar加载到新存储,并把加载后的镜像列表保存到/root/gr/images.txt。其中必须至少有 1 个镜像。 - 创建包含以下 2 行的
/root/gr/runroot.txt。RUNROOT=<현재 runRoot 값>/WHY=tmpfs - 创建包含以下 4 行的
/root/gr/report.txt。OLD=<1번의 graphRoot>/NEW=/srv/podman/podster/IMAGES_BEFORE=0/IMAGES_AFTER=<6번 이후 이미지 개수>
参考
- 可使用
su - podster -c "podman info --format '{{.Store.GraphRoot}}'"仅提取一个值。 - 使用
podman images --format '{{.Repository}}' | wc -l统计镜像数量。 - 加载命令为
podman load -i /opt/images/labhub-alpine.tar。 - 此节点上的容器运行时可能受到限制。 此时命令会以
cannot re-exec process等错误结束,请将该输出也原样保存到文件。在禁止创建非特权 user namespace 的环境中,rootless podman 如何失败本身就是学习内容;在这种情况下,评分将依据你编写的配置。 - 常见错误 1:让新路径的所有者保持为 root,导致 podman 无法写入。
- 常见错误 2:以 root 身份编辑
storage.conf,导致所有者发生变化。编辑后请再次确认所有权。
记录当前路径
创建 /root/gr 目录,把 podster 当前的 graphRoot 和 runRoot 各写一行到 /root/gr/before.txt(graphRoot 在前)。
podman info 支持使用 Go 模板仅提取指定值。相关路径位于 Store 之下。
准备新路径
创建新路径 /srv/podman/podster,将所有者设为 podster,权限设为 700。
所有者和权限非常重要。该用户必须能够读写,而其他人不应能查看。
修改 storage.conf
在 podster 的 storage.conf 中,将 graphroot 改为新路径。
只需修改 [storage] 段中的 graphroot 值。请保留引号。
确认新路径已生效
使用 podman info 确认 graphRoot 是否为新路径,并将其作为一行写入 /root/gr/after.txt。
修改配置后再次运行 info,值应发生变化。如果没有变化,请检查所有权或路径。
确认新存储为空
将新存储的镜像数量以单独一行数字写入 /root/gr/empty.txt。该值应为 0。
查询镜像列表时,应只有表头而没有条目。统计数量并写入文件。
加载镜像归档
将 /opt/images/labhub-alpine.tar 加载到新存储,并把加载后的镜像列表保存到 /root/gr/images.txt。其中必须至少有 1 个镜像。
podman 提供从 tar 归档读取镜像的命令。加载后,镜像应出现在列表中。
确认 runroot 并记录依据
创建包含以下 2 行的 /root/gr/runroot.txt。
RUNROOT=<현재 runRoot 값> / WHY=tmpfs
不要迁移 runroot。请使用指定关键字写明原因。
迁移报告
创建包含以下 4 行的 /root/gr/report.txt。
OLD=<1번의 graphRoot> / NEW=/srv/podman/podster / IMAGES_BEFORE=0 / IMAGES_AFTER=<6번 이후 이미지 개수>
汇总迁移前后的路径和镜像数量即可。各值必须来自实际检查结果。