什么是AUFS? 简单说就是一个文件系统,可以把不同的目录联合在一起。这种文件系统不用格式化,直接挂载即可。之所以有这篇博文,是因为Docker中要使用它。在Ubuntu 12.0.4下安装比较简单,其他系统需自己研究。直接apt-get install就可以了,安装后如下:
root@localhost:/tmp/test/aufs#cat /etc/issue
Ubuntu12.04.5 LTS \n \l
root@localhost:/tmp/test/aufs#dpkg -l | grep aufs
ii aufs-tools 1:3.0+20111101-1ubuntu1 Tools to manage aufs filesystems
按传统文件系统使用习惯,分区、格式化、挂载,大概就这三板斧,在AUFS里不用这么麻烦,操作如下:
root@localhost:/tmp/aufs1#mkdir a b c d
root@localhost:/tmp/aufs1#echo aaaaaaa > a/a.txt
root@localhost:/tmp/aufs1#echo bbbbbbb > b/b.txt
root@localhost:/tmp/aufs1#echo ccccccc > c/c.txt
root@localhost:/tmp/aufs1#mkdir root
root@localhost:/tmp/aufs1#ls
a b c d root
首先建四个目录 a b c d,然后在a bc 下各生成一个文件,下面做的操作就是要把ab c 三个目录通过AUFS挂载到root目录下
root@localhost:/tmp/aufs1#mount -v -t aufs -o br=/tmp/aufs1/a:/tmp/aufs1/b:/tmp/aufs1/c none/tmp/aufs1/root/
noneon /tmp/aufs1/root type aufs (rw,relatime,si=e7143f80f3aede09)
root@localhost:/tmp/aufs1#cd root/
root@localhost:/tmp/aufs1/root#ll
total20
drwxr-xr-x4 root root 4096 Dec 19 15:12 ./
drwxr-xr-x7 root root 4096 Dec 19 15:07 ../
-rw-r--r--1 root root 8 Dec 19 15:07 a.txt
-rw-r--r--1 root root 8 Dec 19 15:07 b.txt
-rw-r--r--1 root root 8 Dec 19 15:07 c.txt
root@localhost:/tmp/aufs1/root#cat *
aaaaaaa
bbbbbbb
ccccccc
解释下mount命令各参数含义:
-t aufs 指定文件系统类型为aufs
-o 后面是挂载选项,指定我们要挂载哪些目录
none 说明我们挂载的不是设备文件,因为这里我们是直接挂载目录的
通过cat命令可以查看内容,可以看到就是原文件的内容。
AUFS的检测级别可以通过udba指定
root@localhost:/tmp/aufs1# mount -v -t aufs -obr=/tmp/aufs1/a:/tmp/aufs1/b:/tmp/aufs1/c -o udba=none none /tmp/aufs1/root/
noneon /tmp/aufs1/root type aufs (rw,relatime,si=e7143f80fc7a7609,udba=none)
udba有三种级别:none、reval、inotify,对性能的影响依次增加,当然安全性也有所增强。
None: 这种检测是最快的,但可能导致错误的数据,例如在原始目录修改文件,在aufs中读取,不完全保证正确
reval:aufs会访问重新原始目录,如果文件有更新,在会反映在aufs中
Notify: 会在所有原始目录中的所有目录上注册notify事件,这会严重的影响性能,不建议使用。
AUFS中可以对不同的挂载目录指定不同权限,只读、读写两种权限可以在挂载时指定。
root@localhost:/tmp/aufs1#mount -v -t aufs -o br=/tmp/aufs1/a=ro:/tmp/aufs1/b=rw -o udba=none none /tmp/aufs1/root/
mount:warning: /tmp/aufs1/root/ seems to be mounted read-only.
noneon /tmp/aufs1/root type aufs (rw,relatime,si=e7143f87d915ee09,udba=none)
root@localhost:/tmp/aufs1#cd root/
root@localhost:/tmp/aufs1/root#ls
a1.txt a.txt b.txt
root@localhost:/tmp/aufs1/root#cat *
aaaaaaa
bbbbbbb
root@localhost:/tmp/aufs1/root#echo AAAA > a.txt
-bash:a.txt: Read-only file system
root@localhost:/tmp/aufs1/root#echo BBBB > b.txt
root@localhost:/tmp/aufs1/root#cat b.txt
BBBB
root@localhost:/tmp/aufs1/root#cat /tmp/aufs1/b/b.txt
BBBB
由于aufs并不挂载块设备,所以所有创建的文件会在被挂载的目录中,当有很多目录时,就涉及到了原始目录的选择策略,先看下rr的策略如何使用:
root@localhost:/tmp/aufs1/b#mount -v -t aufs -o br=/tmp/aufs1/a=rw:/tmp/aufs1/b=rw -o udba=reval -ocreate=rr none /tmp/aufs1/root
noneon /tmp/aufs1/root type aufs (rw,relatime,si=e7143f84e8324e09,create=rr)
root@localhost:/tmp/aufs1/b#cd ../root/
root@localhost:/tmp/aufs1/root#ll
total20
drwxr-xr-x6 root root 4096 Dec 19 16:13 ./
drwxr-xr-x7 root root 4096 Dec 19 15:07 ../
-rw-r--r--1 root root 0 Dec 19 15:24 a1.txt
-rw-r--r--1 root root 8 Dec 19 15:07 a.txt
-rw-r--r--1 root root 5 Dec 19 15:58 b.txt
-rw-r--r--1 root root 5 Dec 19 16:02 root.txt
root@localhost:/tmp/aufs1/root#rm -f root.txt
root@localhost:/tmp/aufs1/root#touch root1 root2 root3 root4
root@localhost:/tmp/aufs1/root#tree -l /tmp/aufs1/
/tmp/aufs1/
├──a
│ ├──a1.txt
│ ├──a.txt
│ ├──root1
│ └──root3
├──b
│ ├──b.txt
│ ├──root2
│ └──root4
├──c
│ └──c.txt
├──d
└──root
├──a1.txt
├──a.txt
├──b.txt
├──root1
├──root2
├──root3
└──root4
上面命令首先挂载ab两个目录到root,然后创建四个文件,最后通过tree命令查看,我们看到文件均衡的分布到了ab两个目录中,这是受create=rr命令影响造成的。rr是轮询策略,在所有可用目录中轮询创建文件,如果只有一个目录是可写的,那就没什么意义了。Create有如下选项:
rr: 轮询选择可写分支
mfs: 选择剩余空间最多的分支
mfsrr:首先选择剩余空间最多的分支,然后选择rr方式
pmfs:选择存在负目录的可写分支
AUFS支持对现有的AUFS增加新的分支(目录)或删除,deladd等操作,对于一个已有的AUFS,我们如何知道他包含哪些目录呢?
可以通过下面的步骤来实现:
root@localhost:/tmp/aufs1#mount -v
noneon /dockerdata type aufs (rw,relatime,si=e7143f87c2262e09)
noneon /tmp/test/aufs type aufs (rw,relatime,si=e7143f878b324c09)
noneon /tmp/aufs1/root type aufs (rw,relatime,si=e7143f84e8324e09,create=rr)
记住si的值
root@localhost:/tmp/aufs1#ls /sys/fs/aufs/si_e7143f84e8324e09/
br0 br1 xi_path
root@localhost:/tmp/aufs1#ls /sys/fs/aufs/si_e7143f84e8324e09/br
br0 br1
root@localhost:/tmp/aufs1#ls /sys/fs/aufs/si_e7143f84e8324e09/br0
/sys/fs/aufs/si_e7143f84e8324e09/br0
root@localhost:/tmp/aufs1#ls /sys/fs/aufs/si_e7143f84e8324e09/br1
/sys/fs/aufs/si_e7143f84e8324e09/br1
root@localhost:/tmp/aufs1#cat /sys/fs/aufs/si_e7143f84e8324e09/br1
/tmp/aufs1/b=rw
可以看到原始目录和权限信息。