ARTICLE — POSTS

UnionFS OverlayFS

是什么

UnionFS 即聚合文件系统,是一种虚拟文件系统,用于将多个文件系统聚合为一个挂载点

主要实现有 AUFS 和 OverlayFS 两种,其中前者已被主流抛弃,目前 OverlayFS 才是绝对主流(已并入 Linux 主线内核,是 Docker 镜像的默认文件系统)

OverlayFS

分为上下两层(upper, lower) 其中 upper 为可写层,lower 为只读层

# 准备实验环境
$ mkdir {upper,lower,merged,work}
$ echo 1 > ./lower/a
$ tree .
.
├── lower
│   └── a
├── merged
├── upper
└── work
$ sudo mount -t overlay overlay -o lowerdir=./lower,upperdir=./upper,workdir=./work ./merged
$ tree .
.
├── lower
│   └── a
├── merged
│   └── a
├── upper
└── work
    ├── index  [error opening dir]
    └── work  [error opening dir]

$ cat lower/a
1
$ cat merged/a
1

可以看到 merged 后的目录与 lower 目录完全一致,如果这个时候我们修改 merged/a 的值呢?

$ echo 2 > merged/a
$ cat lower/a
1

可以看到修改 merged/a 后底层目录并没有被改动,进一步我们看一下目前的目录结构

$ tree .
.
├── lower
│   └── a
├── merged
│   └── a
├── upper
│   └── a
└── work
    ├── index  [error opening dir]
    └── work  [error opening dir]
$ cat upper/a
2

上层目录多出了一个文件,其内容与 merged 被修改的文件一致,这正是 OverlayFS 的一个重要特性 CoW(Copy-on-Write),即写时复制

OverlayFS 仅在有文件改动时(写入/删除)将底层的文件复制到上层,这样既可以复用未改动的资源,又能减少资源浪费

如果我们删除 merged/a 会发生什么?

$ rm merged/a
$ tree .
.
├── lower
│   └── a
├── merged
├── upper
│   └── a
└── work
    ├── index  [error opening dir]
    └── work  [error opening dir]
$ file upper/a
upper/a: character special (0/0)
$ file lower/a
lower/a: ASCII text
$ cat lower/a
1

可以看到删除 merged/a 后,upper 目录仍然保留了一个名为 a 的文件(注意:此时 a 不再是一个普通的文本文件,而是一个字符特殊文件),lower 目录则完全没有受影响

upper/a 被称为 whiteout 文件,用于标识某个文件在上层被删除。当 OverlayFS 扫描到这个文件时,就会将底层同名文件遮蔽掉

如何判断文件是否相同

OverlayFS 判定上下层文件是否相同的机制非常直接:仅根据文件名判断,与文件内容无关。上层的优先级始终高于底层

如果下层有一个名为 a 的文件,只要上层也有一个名为 a 的文件,OverlayFS 就认为底层的 a 已经被修改,从而让上层遮蔽下层

总结

OverlayFS 是 Linux 下主流的联合文件系统实现,通过上下两层(upper / lower)的叠加,实现了轻量级的文件隔离与共享:

  • 写时复制(CoW):只有文件被实际修改时,才从 lower 层复制到 upper 层,未改动的文件直接复用,避免了不必要的资源开销。
  • whiteout 机制:删除操作不会真正移除 lower 层的文件,而是在 upper 层创建一个特殊的 whiteout 文件来遮蔽底层同名文件。
  • 文件名判定:上下层文件的异同判定仅取决于文件名,与内容无关;上层优先级始终高于底层。

正是这些特性,使得 OverlayFS 成为容器镜像分层存储的基石——Docker 的每一层镜像本质上就是一个 OverlayFS 的 lower 层,容器运行时的可写层则是 upper 层,从而实现了镜像层的复用与高效分发。