AUFS技术
AUFS是一种联合文件系统 (Union File System, UnionFS, UFS)。AUFS又叫Another UnionFS,后来叫Alternative UnionFS,后来可能觉得不够霸气,叫成Advance UnionFS。
mount -t aufs -o dirs=[被挂载目录1]:[被挂载目录2]:[...]:[被挂载目录n] none [挂载点]
# 概括AUFS
# 一种分层的文件系统
- 不同物理位置的目录和文件合并挂载到同一个目录
- 上层文件覆盖下层文件,逐层覆盖
- 最上层的文件可读写,其余的文件只读
# AUFS是什么:三个规则
# 把不同物理位置的目录和文件合并mount到同一个挂载目录中
那么在这个挂载目录下就可以同时看到来自所有这些物理位置的目录和文件了。
挂载多个物理位置时,挂载操作逐层进行,且只有一个物理位置是可读写的,其他的物理位置都是只读。这个可读写物理位置位于逻辑上的“顶层”。
# 上层物理位置的文件覆盖下层物理位置的文件
如果没重名那啥事没有,有重名则最终读文件显示的文件内容是有这个文件的最上层物理位置的文件的内容。
这里说的最上层是指有这个文件的最上层物理位置,不一定是那个位于顶层的可读写物理位置。
# 在这个目录下进行的写操作必定写入到顶层中
如果写入的是几个物理位置上都没有的新文件或者就是可读写物理位置上的文件,则正常写入或者新建,啥事没有。
如果写入的是存在于某个只读位置的文件而不是顶层的文件,这个文件依然会写入到顶层,但是会按照上面那条上层覆盖下层的规则代替原来只读位置的文件mount在挂载目录下,此后的读取都会读取到这个新文件而不会读到那个只读物理位置上的文件。
(什么?你问文件修改是怎么回事?文件修改不就是先读取文件到内存进行修改操作再把改完的内容写回去么?按照上面这条规则就相当于读了只读位置的文件然后写到了可读写的位置(复制-修改-粘贴))
# 在顶层删除文件或目录会发生什么?
- 如果这个文件或目录只有顶层有而下层没有,正常删除,啥事没有。
- 如果下层还有这个文件,那么原来的位置会出现一个只读的Whiteout文件:
.wh.<文件名>
- 如果下层还有这个目录,那么原来的位置会出现一个只读的Opaque目录:
.wh.__dir_opaque
注:如果建立了.wh.<文件名>
或.wh.__dir_opaque
,则会看到对应的文件或文件夹直接消失
# AUFS用来干什么
# 典型用例:Linux系统急救光盘
- 将光盘和某个外接的硬盘或者U盘组成AUFS。根据上一节所述组成如下的AUFS结构:
- 光盘和外接盘合并mount到根目录
- 以外接盘为顶层可读写物理位置
- 按照AUFS规则不管,怎么修改根目录的文件,修改只会写入到顶层(外接盘),光盘不受任何影响
- 用正常方法mount要急救的系统盘,开始愉快的Hack
# 典型用例:Docker build和Docker容器
- 读取Dockerfile,从Registry拉取指定的Image
- 创建一个新的虚拟磁盘,和Image一起mount到根目录下,即可形成容器:
- 把Image放在下层,新的虚拟磁盘放在上层
- 按照Dockerfile所指定的操作(docker build)或是用户手动对容器的内容进行各种修改:
- 按照AUFS规则,所有的改动都会被写到上层的新虚拟磁盘中,而不会对下层的Image造成影响
- 修改后的容器可以作为新的Image上传到Registry中,并且只需要上传新虚拟磁盘的内容即可
正因为此种结构,Docker在从Registry处pull Image时是以“pulling fs layer”这样一层一层的方式下载。这里下载的每一层都是某个镜像开发者在前一层上创建的虚拟磁盘。
上图是一个典型的Apache服务器容器结构,在最下面的Kernel是Docker外面的操作系统内核,最底层的Image是Debian,上层的Image依次添加了emacs和Apache,最上层的writable部分即是正在运行的可读写的容器。