AUFS文件系统简单实验
本节通过一个简单的例子理解如何使用AUFS和CoW实现文件管理。
AUFS是Advanced Multi-Layered Unification Filesystem(高级多层统一文件系统)的简称。
本实验在aufs目录下进行。
1、文件准备。在当前目录下,分别创建container-layer、image-layer{i}(i=1-4) 、以及mnt文件夹。其中mnt内为空,而container-layer和image-layer{i}文件夹下分别包含一个文件,显示如下。
[kkbill@ubuntu aufs]$ ls
container-layer image-layer1 image-layer2 image-layer3 image-layer4 mnt
[kkbill@ubuntu aufs]$ tree .
.
├── container-layer
│ ├── container-layer.txt
├── image-layer1
│ └── image-layer1.txt
├── image-layer2
│ └── image-layer2.txt
├── image-layer3
│ └── image-layer3.txt
├── image-layer4
│ └── image-layer4.txt
└── mnt
[kkbill@ubuntu aufs]$ cat container-layer/container-layer.txt
I am container layer
[kkbill@ubuntu aufs]$ cat image-layer1/image-layer1.txt
I am image layer 1
[kkbill@ubuntu aufs]$ cat image-layer2/image-layer2.txt
I am image layer 2
[kkbill@ubuntu aufs]$ cat image-layer3/image-layer3.txt
I am image layer 3
[kkbill@ubuntu aufs]$ cat image-layer4/image-layer4.txt
I am image layer 4
2、把container-layer和4个名为image-layer的文件夹用AUFS的方式挂载到空的mnt目录下。执行如下命令:
# mount -t aufs -o dirs=./container-layer:./image-layer4:./image-layer3:./image-layer2:./image-layer1 none ./mnt
mount命令用于加载文件系统到指定的加载点。在这里,没有指定待挂载的5个文件夹的权限,默认的行为是, dirs 指定的左边起第一个目录是 read-write 权限, 后续的都是 read-only 权限。
成功挂载后,如下:
[root@ubuntu aufs]# tree mnt
mnt
├── container-layer.txt
├── image-layer1.txt
├── image-layer2.txt
├── image-layer3.txt
└── image-layer4.txt
并查看新挂载的文件系统中每个目录的权限,如下:
[root@ubuntu aufs]# cat /sys/fs/aufs/si_466c572751ea99b5/*
/go/src/github.com/kkBill/mydocker/aufs/container-layer=rw # --> 读写
/go/src/github.com/kkBill/mydocker/aufs/image-layer4=ro # --> 只读
/go/src/github.com/kkBill/mydocker/aufs/image-layer3=ro
/go/src/github.com/kkBill/mydocker/aufs/image-layer2=ro
/go/src/github.com/kkBill/mydocker/aufs/image-layer1=ro
64
65
66
67
68
/go/src/github.com/kkBill/mydocker/aufs/container-layer/.aufs.xino
可以看到,只有container-layer文件夹是read-write的,其余都是read-only权限。
3、接下来我们在mnt/image-layer1.txt文件中写入一行文字。
[root@ubuntu aufs]# echo -e "\nwrite to mnt's image-layer1.txt" >> ./mnt/image-layer1.txt
我们去查看mnt/image-layer1.txt文件,发现内容确实发生了变化,但是在image-layer1/image-layer1.txt中的内容却没有发生变化。
[root@ubuntu aufs]# cat ./mnt/image-layer1.txt
I am image layer 1
write to mnt's image-layer1.txt
[root@ubuntu aufs]# cat image-layer1/image-layer1.txt
I am image layer 1
而在container-layer文件夹下,却多出了一个image-layer1.txt文件,其内容同mnt/image-layer1.txt 一样。
[root@ubuntu aufs]# ls container-layer/
container-layer.txt image-layer1.txt
也就是说,当尝试向 mnt/image-layer1.txt 文件进行写操作的时候,系统首先在 mnt 目录下查找名为 image-layer1.txt 文件,将其拷贝到 read-write 层的 container-layer目录中,接着对container-layer 目录中的 image-layer1.txt文件进行写操作。
参考:
- 《自己动手写Docker》