关于容器技术的原理,我在很早之前翻译过命名空间相关的文章,但这还远远不够,需要切入的还有cgroup、文件系统和网络相关方面的细节。
到了招聘季,稍微有点时间整理这方面的资料,索性先从文件系统入手,本文的目标仅仅是“知其然”。
0x00 对于分层的需求
在LiveCD的场景下,有这么一种需求:要求在发行版启动后,在逻辑上得到一个统一的文件系统,用户能够对其进行读写,而该文件系统中的基础部分来自一个只读文件系统,无法对其进行写操作。
容器镜像的需求也是类似,用户需要能够根据基础镜像构建新镜像,出于共享基础镜像的目的,整个过程并不能影响基础镜像本身,也就是说最终得到的是一个逻辑意义上的新镜像。
通俗而言,就是要求文件系统提供“层次”的概念,目前可选的方案有AUFS,OverlayFS,DeviceMapper等。
作为UnionFS之一的OverlayFS就是这么一种文件系统,它于2014年被合并到3.18内核,顾名思义其主要特性就是“覆盖”,可以结合下图进行理解(图非原创)。
0x01 特性介绍
正如上图所示,在OverlayFS中,存在Lower和Upper的概念,指定的Lower和Upper文件系统共同组成了新的文件系统。
其效果就如同上图所示,我们从Upper的正上方向下观察,存在文件和目录的位置是“不透明”的,因此最终得到的俯视图应该就如同Overlay那一层所示。
对于文件系统而言,“不透明”的另一种表达方式即为覆盖。也就是说Upper中存在的文件会覆盖Lower中的同名文件,但这对于目录而言稍有不同,同名文件会被覆盖,而不同名的则是合并。
对于文件/目录的修改,处理策略如下:若指定文件存在于Upper,则直接修改该文件。
若指定文件仅存在于Lower,则会先从Lower拷贝该文件到Upper(copy_up操作),然后进行修改。
对于文件/目录的创建,效果等同于在Upper层直接进行创建。
对于文件的删除,处理策略如下:若指定文件仅存在于Upper,则直接删除该文件。
若指定文件存在于Lower,则在Upper层创建同名的字符设备。
对于目录的删除,处理策略如下:若指定目录仅存在于Upper,则直接删除该目录。
若指定目录