overlayfs是内核支持的文件系统,具体可参考overlayfs in kernel文档中的解释。overlaylfs是文件系统之上的文件系统。可以称之为上层文件系统。了解虚拟化的同学应该了解underly网络和overlay网络。所谓overlay网络也就是在物理网络基础上虚一个网络平面出来。Overlayfs 既然是上层文件系统,他就不需要直接和磁盘等存储系统进行交互,他就直接和其他文件系统交互就行了。
Mount -t overlay overlay -o lowerdir=/low1,low2,low3,upperdir=/upper,workdir=/work merged_dir
命令把多个目录整合成一个目录。用户添加和更新、删除的文本都存放在upper目录中。而lowder是只读的。work 目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见。merged_dir则是把upper目录和lowerer目录合并,这个合并规则就是overlayfs要实现的逻辑。新增文件写入uppder目录。Workerdir删除文件需要记录一个标记.Low1 、low2 、low3、upper优先级逐步提高,如果存在同名同目录文件,以优先级高的为本。修改low目录中文件,则需要拷贝一份low目录文件到upper层。然后修改。此处会导致第一次拷贝慢。
lower层:拉镜像解压而成,只读
upper层:创建容器时生成,可写层
containerd中的overlayfs 原理
1)在containerd中,用户pull拉镜像时,会返回多个层(layer),这些层都是压缩文件。containerd会把这些压缩文件解压然后存到/var/lib/containerd/io.containerd.snapshooter.v1.overlay中(lowder)。io.containerd.snapshotter.v1.overlayfs中对应的是layer解压后的文件夹。我们看到这些文件夹以1、2、3等命名。镜像对应的层文件夹都是只读的。
2)容器启动时,在/var/lib/containerd/io.containerd.snapshooter.v1.overlay创建一个读写目录,也就是所谓的upper层。
Containerd的配置文件中有如下两个配置:
cat /etc/containerd/config.toml
root = "/var/lib/containerd"
state = "/run/containerd"
root配置的目录是用来保存持久化数据的目录,包括content
, snapshot
, metadata
和runtime
。
state配置的目录是用来保存运行时数据。
pull镜像时,镜像对应的config、index、layer、manifest都存储在/var/lib/containerd/io.containerd.content.v1.content/blob/sha256中。index和manifest可以直接用cat命令查看,layer文件可以用tar解压缩。因此content中保存的是config, manifest, tar文件是OCI镜像标准的那套东西。(镜像存放在/var/lib/containerd/io.containerd.content.v1.content/blob/sha256中)
启动镜像后,会在目录/run/containerd/io.containerd.runtime.v2.task/k8s.io/和/var/run/containerd/io.containerd.runtime.v2.task/k8s.io下面生成一个$CONTAINER ID的文件夹,这个目录就是overlayfs 中merge目录。
验证overlayfs文件系统挂载
mount |grep overlayfs标签:upper,--,Containerd,overlayfs,io,containerd,镜像,目录 From: https://blog.51cto.com/u_11791718/6091847