Docker 存储引擎 overlay、overlay2 及 AUFS 简介

Overlay FS

Overlay FS 在 Linux 3.18 开始正式支持,它能够将上层目录(upperdir)和下层目录(lowerdir)进行合并,提供用户一个统一的合并目录(mergeddir)。其合并规则如下:

  1. 同名上下层目录合并;
  2. 同名的文件,上层覆盖下层;
  3. 对下层的文件修改采用写时复制(copy_up),下层文件无法直接修改,需要复制到上层进行修改,然后再依规则进行覆盖。

Overlay FS 在容器技术中应用广泛,尤其在Docker中。

Docker 容器以镜像层(Image layer)为下层目录,容器可写层为上层目录,合并到容器挂载点(根目录)。早期 Linux 内核中的 Overlay FS 不支持多下层目录,Linux 4.0 以后版本才陆续完善了多下层目录的功能。我们知道 Docker 经常是多镜像层的,这意味着具有多层的下层目录。对此,Docker 提供了两种方式接入 Overlay FS:

  1. Overlay Driver,下层目录依次进行硬链接,然后最上层的镜像目录跟容器可写层合并到挂载点;
  2. Overlay2 Driver,只支持 Linux 4.0以上版本,下层镜像目录(最多支持500个)直接根容器可写层合并到挂载点,不存在硬链接导致的 inode 消耗过多问题。

Overlay FS 相比于AUFS的优点:

  1. 支持页缓存(Page caching)共享,多个容器访问同一个文件,可以共享一个或多个页缓存;
  2. copy_up 操作快,因为 overlay 只有两层,而 AUFS 有很多层,文件穿越多层较为耗时;
  3. 代码融入到 Linux 内核中,广泛支持各 Linux 发行版。

AUFS

AUFS(Another/Alternative/Advance UnionFS),重写自 UnionFS 1.x,使用上完全兼容 UnionFS,未进入 Linux内核,仅在部分 Linux 发行版中(比如 Debian、Ubuntu)。

多个目录(或曰 branch)挂载到同一个挂载点时,默认上层目录可读可写(rw),下层目录只读(ro),可以对目录指定权限;对于重复的文件,修改时只会修改上层目录的文件。

删除文件时,如果是上层的文件会被直接删除;而对于下层文件,因为一般是只读,无法删除,所以 AUFS 通过在上层目录中增加一个 whiteout 文件,隐藏下层文件。

软链接和硬链接

在 Linux 文件系统中,文件通过 inode(节点索引编号)唯一区分。文件分为元数据(metadata)和数据域(data block),而 inode 唯一指向数据域。

硬链接(Hard link)就是在同一个文件系统中,文件名不同,但 inode 一样的文件副本;软链接(Soft link, or symbolic link)则是另一个文件,inode 不同,但 inode 指向的数据域中存放的是所链接文件的路径。

硬链接可以防止文件误删除,因为在 Linux 中一个文件的数据域被删除,当且仅当其 inode 的引用为 0,也就是必须删除该文件的所有硬链接,该文件才会被最终删除。

软链接则不同,当所链接文件被删除时,链接也会失效。

在 Linux 中进行链接的命令如下:

# 软链接
ln -s source target
# 硬链接
ln source target

参考

  1. 深入理解overlayfs(一):初识
  2. Docker存储驱动之AUFS简介
  3. Docker镜像原理 aufs overlay overlay2
  4. Docker Storage Driver:存储驱动
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章