# AUFS简介

早期docker的默认文件系统是AUFS(后来是Overlay),今天来简单学习一下。 我们先实验一下,真实感受下aufs。在Ubuntu中默认就安装了aufs,可以直接使用。

# AUFS实验

# 准备

准备三个目录: base ,mnt , top。在base目录下准备base.txt 和 common.txt文件,在top目录下准备common.txt和foo.txt文件, mnt目录用于挂载

# tree
.
├── base
│   ├── base.txt
│   └── common.txt
├── mnt
└── top
    ├── common.txt
    └── foo.txt
# cat base/base.txt 
base base.txt

# cat base/common.txt 
base common.txt

# cat top/foo.txt 
top foo.txt

# cat top/common.txt 
top common.txt

# 开始

用AUFS,把 base 和 top 一起 mount 到 ./mnt 目录:

mount -t aufs -o br=./top:./base none ./mnt

mount 命令的参数意义如下:

-t aufs:mount 的文件类型,使用的是 aufs
-o:传递个 aufs 的选项,每个文件类型的选项不同
br:表示 branch,也就是 aufs 需要的的各个目录
none:这个本来是设备的名字,但是我们并没有用到任何设备,只会用到文件夹,因此这里为 none
./mnt:挂载点,也就是内容最终出现的目录

看下mnt目录:

# ls mnt
base.txt  common.txt  foo.txt

发现common.txt被合并了,看下common.txt的内容:

# cat mnt/common.txt 
top common.txt

修改一下base.txt文件:

# echo 'change base' > mnt/base.txt

会发现top目录下多了一个base.txt文件

# ls top 
base.txt  common.txt  foo.txt

而base目录下的base.txt并没有改变:

# cat base/base.txt 
base base.txt

这一切是为什么?

# AUFS介绍

AUFS 的全称是 Advanced Multi-layered unification filesytem,它的主要功能是:把多个目录结合成一个目录,对外使用。 把多个目录 mount 成一个,读写操作步骤如下:

  1. 默认情况下,最上层的目录为读写层,只能有一个
  2. 下面可以有一个或者多个只读层读文件
  3. 读文件,从最上面一个开始往下逐层去找,打开第一个找到的文件,读取其中的内容
  4. 写文件,如果在最上层找到了该文件,直接打开 否则,从上往下开始查找,找到文件后,把文件复制到最上层,然后再打开这个 copy
  5. 删除文件:在最上层创建一个 whiteout 文件,.wh.<origin_file_name>,就是在原来的文件名字前面加上 .wh.

# 参考

https://cizixs.com/2017/09/13/docker-aufs-storage-driver/