DOCKER基础技术:AUFS

本文的大部分内容来自 coolshell,我只是为了理解与学习,将这篇内容重新写了一遍

0X00 简介 AUFS 是什么

AUFS 是一种 Union FIle System,可以用来把不同物理位置的东西合并到同一个目录下面(后面会给具体例子!),为了显示自己很牛逼,A 从原来的 Another 变成了 之后的 Advance

接下来通过一个例子学习 AUFS

现在我们有三个文件夹(如下所示),mnt 是空文件夹:

➜  mount : ✗ tree
.
├── A
│   ├── a
│   └── c
├── B
│   ├── b
│   └── c
└── mnt

现在我们通过 aufs 将 A B 合并在一起:

mount git:(master) ✗ sudo mount -t aufs -o br=./A:./B none ./mnt

现在再看 mnt 文件夹:

➜  mnt ls
a  b  c

这就是 AUFS 啦!

0X01 AUFS 的一些小疑问

在 0X00 中你会发现两个文件夹中有一个文件名字一样:

在多次测试后我们会发现:

可见,如果有重复的文件名,在mount命令行上,越往前的就优先级越高

0X02 如何使用——AUFS 的几个例子

首先来看最基础的用法:

 mount -t aufs -o br=./A:./B none ./mnt

前面的 -t -o 基本不变,br 就是不同的目录,中间用 : 分隔。none 是表示没有任何与之相关的设备

添加每个分支的权限

可在每个分支的后面添加=<权限>,比如:

mount -t aufs -o br=./A=rw:./B none ./mnt
  • rw 表示可写可读 read-write。
  • ro 表示 read-only,如果你不指权限,那么除了第一个外 ro 是默认值,对于 ro 分支,其永远不会收到写操作,也不会收到查找 whiteout 的操作。
  • rr 表示 real-read-only,与 read-only 不同的是,rr 标记的是天生就是只读的分支,这样,AUFS 可以提高性能,比如不再设置 inotify 来检查文件变动通知。

解释 whiteout

whiteout 就是隐藏文件的意思。

举个例子:

➜  mount git:(master) ✗ tree
.
├── A
│   ├── a
│   └── c
├── B
│   ├── b
│   └── c
└── mnt

现在要给 mnt 联合挂载:

➜  mount git:(master) ✗ sudo mount -t aufs -o br=./A=rw:./B=ro none ./mnt

如果删除掉 b,但是 B 是只读的,会发生什么?

➜  mnt rm b
➜  mnt ls
a  c

b 没有了,但是 B 里面还是有 b。

这个操作的本质是:

在上层的可写的目录下建立对应的 whiteout 隐藏文件来实现的

所以 rm b 等价于:

现在我们在权限为 rw 的 test 目录下建个 whiteout 的隐藏文件 .wh.b,你就会发现 ./mnt/b这个文件就消失了:

➜  mnt ls
a  b  c
➜  A touch  .wh.b
➜  mount cd mnt 
➜  mnt ls
a  c

这就是 whiteout。

0X03 一些高级操作

通过添加 udba 参数选择是否监听源文件

  • udba=none – 设置上这个参数后,AUFS 会运转的更快,因为那些不在 mount 目录里发生的修改,aufs 不会同步过来了,所以会有数据出错的问题。
  • udba=reval – 设置上这个参数后,AUFS 会去查文件有没有被更新,如果有的话,就会把修改拉到 mount 目录内。
  • udba=notify – 这个参数会让 AUFS 为所有的 branch 注册 inotify,这样可以让 AUFS 在更新文件修改的性能更高一些。

选择保存文件的目录

如果 br 中只有一个 rw 的目录,那么所有的修改就会保存在那。如果有多个 rw 的 br 会怎么样?

aufs提供了一个叫create的参数可以供你来配置相当的创建策略,下面有几个例子

  • create=rr | round−robin 轮询。下面的示例可以看到,新创建的文件轮流写到三个目录中
hchen$ sudo mount -t aufs  -o dirs=./1=rw:./2=rw:./3=rw -o create=rr none ./mnt
hchen$ touch ./mnt/a ./mnt/b ./mnt/c
hchen$ tree
.
├── 1
│   └── a
├── 2
│   └── c
└── 3
    └── b
  • create=mfs[:second] | most−free−space[:second] 选一个可用空间最好的分支。可以指定一个检查可用磁盘空间的时间。
  • create=mfsrr:low[:second] 选一个空间大于low的branch,如果空间小于low了,那么aufs会使用 round-robin 方式。

就学习了这么多!完结撒花!

你可能感兴趣的:(DOCKER基础技术:AUFS)