Containerd 的一个重要的组件服务就是 snapshot ,主要的功能就是为容器准备 rootfs 文件系统,为了更好的理解 snapshot 服务的应用逻辑,通过ctr 工具来做一个 snapshot 实验。
实验目标:
- 理解 snapshot 的 prepare、mount 和 commit 功能用途,对看 snapshot 服务源码的理解上将大有裨益;
- 理解镜像层和层的父子关系,每一层都是对变更内容的
快照
,可将 committed 层作为父内容创建新的层; - 理解容器 rootfs 文件系统(扩展学习一下关于本人的 oci image spec )
环境准备
// 本实验 containerd 版本为v1.5.2
// 准备挂载点
$# mkdir /var/lib/containerd/custom_dir
snapshot 操作
// 第一次提交 (根)
$# ctr snapshot prepare activeLayer0 // prepare 创建一个工作状态的层
$# ctr snapshot mount /var/lib/containerd/custom_dir activeLayer0 | xargs sudo // snapshot 文件系统挂载(此挂载类型overlayfs)
$# echo “1" > ./custom_dir/add01 // 增加一次变更文件
$# umount /var/lib/containerd/custom_dir // 卸载点
$# ctr snapshot commit commit_add01 activeLayer0 // 提交 committed,变更snapshot状态,保存Layer
// 第二次提交,以第一次 layer 为 parent
$# ctr snapshot prepare activeLayer0 commit_add01
$# ctr snapshot mount /var/lib/containerd/custom_dir activeLayer0 | xargs sudo
$# echo "2" > /var/lib/containerd/custom_dir/add02
$# umount /var/lib/containerd/custom_dir
$# ctr snapshot commit commit_add02 activeLayer0
查看 snapshot 的过程状态记录 ctr snapshot ls
// 第一次 snapshot prepare
$# ctr snapshot ls
KEY PARENT KIND
activeLayer0 Active
// 第一次 snapshot commit
$# ctr snapshot ls
KEY PARENT KIND
commit_add01 Committed
// 第二次 snapshot prepare
$# ctr snapshot ls
KEY PARENT KIND
activeLayer0 commit_add01 Active
commit_add01 Committed
// 第二次 snapshot commit
$# ctr snapshot ls
KEY PARENT KIND
commit_add01 Committed
commit_add02 commit_add01 Committed
查看系统的挂载信息(linux默认snapshotter:overlayfs)
//第二次挂载后
$# mount
overlay on /var/lib/containerd/custom_dir type overlay (rw,relatime,lowerdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/26/fs,upperdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/27/fs,workdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/27/work)
查看 snapshot layer 父子关系
// 第二次 prepare 后查看 tree
$# ctr snapshot tree
commit_add01
\_ activeLayer0
实验后清理工作
删除层需”先子后父"
$# ctr snapshot rm commit_add01
ctr: failed to remove "commit_add01": cannot remove snapshot with child: failed precondition
$# ctr snapshot rm commit_add02
$# ctr snapshot rm commit_add01
扩展学习: overlayfs 特性介绍
创建(文件/目录)
-在Upper层直接进行创建
修改(文件/目录)
-若指定文件存在于Upper,则直接修改访文件
-若指定文件仅存在于Lower, 则会先从Lower拷贝文件到Upper(copy_up操作),然后再修改
删除(文件)
-若指定文件仅存在于Upper,则直接删除该文件
-若指定文件存在于Lower,则在Upper层创建同名的字符设备
删除(目录)
-若指定目录仅存在于Upper,则直接删除该目录。
-若指定目录存在于Lower,则在Upper层创建同名的字符设备。
-若在删除后再次创建同名目录,且同名目录存在于Lower,此时新的目录成为opaque目录,通过将xattr的“trusted.overlay.opaque”设置为“y”实现标记,此时Upper层的该目录就会完全覆盖Lower中的目录,而非原先的合并。
网友评论