Union File System
Union File System, 简称UnionFS,是一种为Linux,FreeBSD,和NetBSD操作系统设计的把其他文件系统联合挂载到一个挂载点的文件系统服务。
它通过使用branch把不同文件系统的文件和目录覆盖,形成一个一致的文件系统。这些branch是只读或者只写的。当对文件进行写操作时候,才会真正的复制
文件进行写操作。实际上本身没有对原来的文件进行修改,可以看做是共享了原来的文件。在写的时候进行修改用到了一种资源管理技术成为写时复制。
写时复制(copy-on write,CoW),也叫作隐式共享,如果一个资源是重复的,那我们没有必要去在拷贝一份。只需要将唯一的一份共享给不同的对象。当某一个对象
需要去修改这个资源时,再去重新复制一份对新复制的进行修改。通过资源共享,可以减少未修改资源复制带来的消耗。在mapbit的垃圾回收算法中也会用到。
AUFS
AUFS ,英文全称是 Advanced Multi-Layered Unification Filesystem ,曾经也叫Acronym Multi-Layered Unification Filesystem 、 Another Multi-Layered Unification Filesystem 。
AUFS 完全重写了早期的 UnionFS 1 .x ,其主要目的是为了可靠性和性能 , 井且引入了 一 些新的功能,比如可写分支的负载均衡 。 AUFS的一些实现已经被纳入UnionFS 2.x 版本。
Docker是如何使用AUFS的
AUFS是docker的第一种存储驱动。AUFS具有快速启动容器、高速利用存储和内存的优点。
image layer 和 AUFS (docker版本不同可能会有区别,我的是在/var/lib/docker下的其他文件夹中)
每一个Docker image都是由一系列read-only layer组成的。image layer的内容都存储在Docker hosts filesystem的/var/lib/docker/aufs/diff目录下.
而/var/lib/docker/aufs/layers目录,则存储着image layer如何堆找这些layer的metadata 。
在装有Docker的机器上执行如下命令
root@leon:/var/lib/docker/overlay2#
什么都没有
拉取镜像后,可以看到在docker pull中的结果显示Ubuntu : l5.04镜像一共有4个layer,在
执行命令的结果中也有4个对应的存储文件目录。
container layer 和AUFS(docker版本不同可能会有区别,我的是在/var/lib/docker下的其他文件夹中)
docker使用写时复制,就是说每一点小小的修改都会被复制。但是docker是有很多layer的,修改的只是layer(对以前的layer进行屏蔽,并没有删除)。
这样就避免了复制大文件。对于一个容器而言每个image layer最多只需要复制一次。后续的改动都会在第一次拷贝的 container layer上进行 。
如果要删除file时,AUFS会在container的read-write层生成一个.wh.file文件来隐藏所有 read-only层的file文件。
可以看到新产生的文件夹。里面有各种各样样的配置文件。
写一个AUFS
-
创建文件目录,在aufs目录下创建mnt(挂载点),container-layer,以及4个image-layer【x】(x是1-4)。
-
将其他文件挂载到刚才创建的mnt上。在mount aufs命令中,没有指定待挂在的5个文件夹的权限,默认的行为是dirs指定的左边第一个目录是
read-write权限,后续都是read-only权限。
查询文件的权限
可以看到第一个是rw 其他都是ro。
- 修改文件
-
查看mnt 下的image-layer1.txt和 文件夹image-layer1下的该文件。
两者是一样的。 -
我们对mnt下的某一个文件进行修改(image-layer1.txt)
-
对比修改后两个文件的状态
两者是不一样的。
由此可以看出,对mnt 里的的文件修改并不影响对原文件的修改,那么修改后的文件到底去哪里了呢?
第一个container-layer文件的权限是rw。我们去里面看看.
果然在里面。这就清楚多了。当要修改文件的时候,将文件复制一份
放到container下面即可,之后我们就不是共享原来的文件了,而是拥有了自己的文件。
以上就是AUSF的部分内容。