sealer中集群镜像的存储和docker镜像很像,也采用了写时复制的技术来提升复用性。
本文聊一下overlay2。
COPY on Write在很多地方都会用到,比如git的存储,去修改一个文件并非真的修改,
而是把文件拷贝出来修改,读的时候读取上层的修改层,同样比如在ceph的后段存储
等系统中都存在应用。好处是可以非常方便的进行回滚,以及存储复用,比如给虚拟机
做快照,那我们并不需要把整个系统盘复制一份,而只需要用指针指一下快照的地方就好。
容器镜像同理,写时复制可以让多个应用共享一个基础镜像。
集群镜像把整个集群打包,用写时复制的方法可以帮助分布式应用共享k8s基础镜像。
以及可以很方便的把各种分布式应用镜像进行融合。
overlay文件系统分为lowerdir、upperdir、merged, 对外统一展示为merged,uperdir和lower的同名文件会被upperdir覆盖
workdir必须和upperdir是mount在同一个文件系统下, 而lower不是必须的
lowerdir可以是多个目录(前面覆盖后面),如果没有upperdir,那merged是read only.
overlay只支持两层,upper文件系统通常是可写的;lower文件系统则是只读,这就表示着,当我们对 overlay 文件系统做任何的变更,都只会修改 upper 文件系统中的文件
来个实际 *** 作:
以上overlay2下面的几个目录就被合并了
对只在 lower 有的文件写时,则会做一个copy_up 的 *** 作,先从 lower将文件拷贝一份到upper,同时为文件创建一个硬链接。此时可以看到 upper 目录下生成了两个新文件,写的 *** 作只对从lower 复制到 upper 的文件生效,而 lower 还是原文件
删除 lower 和 upper 都有的文件时,upper 的会被删除,在 upper 目录下创建一个 ‘without’ 文件,而 lower 的不会被删除
有了上述理论基础,我们先看一段 docker里面的源码
mountTarget就是目标目录, mountData是: fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", string(lowers), path.Join(id, "diff"), path.Join(id, "work"))
可以看到SDK的使用和命令行很像
我们可以做一个封装:
主要是syscall.Mount这个系统调用,参数基本和命令行一一对应
sealer中overlay2源码地址
kubernetes一键安装
sealer集群整体打包!
出现此问题的原因为:设置问题导致的。
解决的方法和详细的 *** 作步骤如下:
1、首先,右键单击任务栏的空白处,然后选择“属性”选项,如下图所示,然后进入下一步。
2、其次,完成上述步骤后,单击“任务栏按钮”这一项,如下图所示,然后进入下一步。
3、最后,完成上述步骤后,选择“当任务栏被占满时才合并”选项,再单击“确定”按钮,如下图所示。这样,问题就解决了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)