动手实现 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 为例子介绍了如何构建,一个简单的分层文件系统。后面在开发自己的容器镜像的过程中就会使用这项技术。