首页 > 代码库 > AUFS和GlusterFS试水 1.0

AUFS和GlusterFS试水 1.0

AUFS (AnotherUnionFS) 是一种 Union FS, 简单来说就是支持将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)的文件系统, 更进一步的理解, AUFS支持为每一个成员目录(类似Git Branch)设定readonly、readwrite 和 whiteout-able 权限, 同时 AUFS 里有一个类似分层的概念, 对 readonly 权限的 branch 可以逻辑上进行修改(增量地, 不影响 readonly 部分的)。通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个disk挂到同一个目录下, 另一个更常用的就是将一个 readonly 的 branch 和一个 writeable 的 branch 联合在一起,Live CD正是基于此方法可以允许在 OS image 不变的基础上允许用户在其上进行一些写操作。Docker 在 AUFS 上构建的 container image 也正是如此,接下来我们从启动 container 中的 linux 为例来介绍 docker 对AUFS特性的运用。

典型的启动Linux运行需要两个FS: bootfs + rootfs:

技术分享

bootfs (boot file system) 主要包含 bootloader 和 kernel, bootloader主要是引导加载kernel, 当boot成功后 kernel 被加载到内存中后 bootfs就被umount了. rootfs (root file system) 包含的就是典型 Linux 系统中的 /dev, /proc,/bin, /etc 等标准目录和文件。

对于不同的linux发行版, bootfs基本是一致的, 但rootfs会有差别, 因此不同的发行版可以公用bootfs 如下图:

技术分享

典型的Linux在启动后,首先将 rootfs 设置为 readonly, 进行一系列检查, 然后将其切换为 "readwrite" 供用户使用。在Docker中,初始化时也是将 rootfs 以readonly方式加载并检查,然而接下来利用 union mount 的方式将一个 readwrite 文件系统挂载在 readonly 的rootfs之上,并且允许再次将下层的 FS(file system) 设定为readonly 并且向上叠加, 这样一组readonly和一个writeable的结构构成一个container的运行时态, 每一个FS被称作一个FS层。如下图:

技术分享

得益于AUFS的特性, 每一个对readonly层文件/目录的修改都只会存在于上层的writeable层中。这样由于不存在竞争, 多个container可以共享readonly的FS层。 所以Docker将readonly的FS层称作 "image" - 对于container而言整个rootfs都是read-write的,但事实上所有的修改都写入最上层的writeable层中, image不保存用户状态,只用于模板、新建和复制使用。

技术分享

上层的image依赖下层的image,因此Docker中把下层的image称作父image,没有父image的image称作base image。因此想要从一个image启动一个container,Docker会先加载这个image和依赖的父images以及base image,用户的进程运行在writeable的layer中。所有parent image中的数据信息以及 ID、网络和lxc管理的资源限制等具体container的配置,构成一个Docker概念上的container。如下图:

技术分享

(以上摘自http://www.infoq.com/cn/articles/docker-core-technology-preview)

GlusterFS是将多个文件卷抽象到一个文件挂载点中,由一个文件夹(挂载点)来访问其他文件卷的文件。

技术分享

技术分享

1.首先是在客户端,用户通过glusterfs的mount point 来读写数据。

2.用户的这个操作被递交给本地linux系统的VFS来处理。

3.VFS将数据递交给FUSE内核文件系统,在启动glusterfs客户端以前,需要向系统注册一个实际的文件系统FUSE,如上图所示,该文件系统与ext3在同一个层次上面,ext3是对实际的磁片进行处理,而fuse文件系统则是将数据通过/dev/fuse这个设备文件递交给了glusterfs client端。所以,我们可以将fuse文件系统理解为一个代理。

4.数据被fuse递交给Glusterfs client 后,client对数据进行一些指定的处理(所谓的指定,是按照client配置文件来进行的一系列处理)

5.在glusterfsclient的处理末端,通过网路将数据递交给Glusterfs Server,并且将数据写入到服务器所控制的存储设备上

(以上摘自http://linuxnote.blog.51cto.com/9876511/1825533)

 

AUFS是将若干的文件夹,按照顺序,构造成一个栈式结构,top层(位于最上层的文件夹)的文件为writeable,而以下所有层的文件均为read-only,因此挂载点可以访问所有文件夹的内容,但只能修改位于top层的文件,修改下层文件时,应该是首先将该文件copyup到top层,然后修改(带来的问题:文件冗余太大???)。AUFS是以文件为单位来复制的,所以即便修改很小的部分也可能会copy一个巨大的文件,代价较大。

 

AUFS和GlusterFS试水 1.0