动手实现AUFS文件系统

mark

在之前的文章中我们探究了Docker是如何使用AUFS文件系统的,现在我们开始动手实践一下AUFS,用简单的命令来创建一个AUFS文件系统,感受下如何使用AUFS和COW实现文件管理。

在目录下创建一个aufs的文件夹,然后在aufs目录下创建一个mnt的文件夹作挂载点。接着在aufs目录下创建一个名为container-layer的文件夹,里面有一个名为container-layer.txt的文件,文件内容为"I am container layer"。同样地,继续在aufs目录下创建4个名为image-layern的文件夹(n取值分别为l和4),里面有一个名为image-layer{n}.txt的文件,文件内容为"I am image layer${n}”。使用如下命令检查文件内容。

mark

要联合的文件目录都己经准备好了。接下来把container-layer和4个名为image-layer${n}的文件夹用AUFS的方式挂载到刚刚创建的mnt目录下。在mount aufs的命令中,没有指定待挂载的5个文件夹的权限,默认的行为是dirs指定的左边起第一个目录是read-write权限,后续的都是read-only权限。

还是 《Union File System在Docker中的应用》 文中曾经在系统aufs目录下查看文件读写权限的做法,这里依然使用如下命令来确认新mount的文件系统中每个目录的权限。

mark

接下来,执行一个有意思的操作,往mnt/image-layer1.txt的文件末尾添加一行文字 “write to mnt’s image-layer1.txt”。根据上面介绍的COW技术,大家猜想一下会产生什么样的行为。

mark

也就是说,当尝试向mnt/image-layer4.txt文件进行写操作的时候,系统首先在mnt目录下查找名为image-layer4.txt的文件,将其拷贝到read-write层的container-layer目录中,接着对container-layer目录中的image-layer4.txt文件进行写操作。至此,我们成功地完成了一个小小的Demo,实现了自己的AUFS文件系统。

《虚拟化的基石——Namespace》 《通过Namespace实现隔离》 介绍了Linux Namespace,一共有6种类别的Namespace,分别进行了简单介绍。然后,以Go语言为例实现了一个Demo,使大家能有一个直观的认识。而且对于这些Namespace的应用,会有更加复杂的例子 《Linux Cgroups的资源控制》 《Cgroups在Docker中的应用》 介绍了LinuxCgroups。通过LinuxCgroups的三种结构,可以随意定制对资源的限制及对资源做监控。最后使用Go语言实现了一个Cgroups限制资源的Demo,介绍了如何用Go语言去操控容器的Cgroups,进而实现限制容器资源的效果。 《Union File System在Docker中的应用》 介绍了Union File System,列举了其中的几个具体实现,并且讲解了Docker是如何使用分层文件系统来实现镜像不同分层的重复利用的。最后,以AUFS为例子介绍了如何构建,一个简单的分层文件系统。后面在开发自己的容器镜像的过程中就会使用这项技术。