OverlayFS
OverlayFS(叠加文件系统),就是我们刚才提到的AUFS的现代正统继承者。在现在的 Linux 和 Docker(overlay2驱动)生态里,AUFS 因为代码太复杂、性能不够极致,已经基本被淘汰了,取而代之的绝对霸主就是 OverlayFS。
如果说 AUFS 是那个能叠好几十层、玩法复杂的 PS 图层魔术师,那么 OverlayFS 就是一个极其干练、只留核心、速度极快的现代视觉大师。
1. 为什么有了 AUFS,还要搞 OverlayFS?
AUFS 虽然好用,但它有一个致命弱点:太重、太复杂了。它的核心代码量巨大,导致 Linux 官方(内核社区)一直嫌弃它,拒绝把它合进 Linux 内核的主线里。这意味着早年用 AUFS,你得自己单独给内核打补丁。
而 OverlayFS 痛定思痛,把架构极度简化,在 2014 年被正式合并进了 Linux 内核主线。它最大的特点就是:快,省,结构简单。
2. 核心架构:化繁为简的“四合一”
AUFS 可以叠任意多的层(Layer 1, Layer 2, Layer 3…),而 OverlayFS 觉得没必要搞那么花哨,它把世界简化成了四个核心目录:
- Lowerdir(底层/只读层):对应 Docker 镜像的那些基础层。它可以是好几个目录的叠加,但在 OverlayFS 眼里,它们统一都算“只能看不能动”的底层。
- Upperdir(顶层/可写层):对应容器的读写层。你在容器里干的所有增删改查,第一落脚点全在这里。
- Mergedir(挂载点/视图层):楚门的世界。用户和容器内的进程真正看到的、用到的就是这个目录。它是 Lowerdir 和 Upperdir 融合后的结果。
- Workdir(工作工作空间):内核自己默默使用的一个空目录,用来在原子操作(比如正准备做 Copy-on-Write 复制文件)时当临时中转站,用户一般感知不到。
3. OverlayFS 是怎么把速度变快的?
比起 AUFS,OverlayFS 在性能上有两个逆天的优化:
① 找文件不再“层层套娃”
- AUFS:如果你叠了 10 层镜像,找一个文件时,它得从第 10 层、第 9 层、第 8层……一层一层往下探,像套娃一样,非常低效。
- OverlayFS:只有Upper和Lower。内核一瞬间就能判断出文件是在可写层还是在只读层,省去了中间大量的遍历时间。
② 完美的内存复用(页缓存共享)
这是 OverlayFS 打败虚拟机和 AUFS 的终极杀招。
在 Linux 中,打开文件会占用内存的Page Cache(页缓存)。
- 如果用虚拟机,100 个虚拟机打开同一个文件,内存里会有 100 份缓存。
- 如果用 AUFS,因为实现机制问题,不同的容器打开同一个底层只读文件,内核有时也会卡在虚拟节点上,无法完美共享缓存。
- 而在 OverlayFS 中:因为它直接贴合 Linux 内核的 VFS(虚拟文件系统),100 个容器如果仅仅是读取底层的同一个文件(比如某个公共运行库),整个物理机内存里真的就只有一份页缓存。这不仅省下了海量的内存,更让文件读取速度直接拉满。
4. 在 OverlayFS 里,Whiteout 和 CoW 是怎么玩的?
它的底层逻辑和我们前面讲的一脉相承,只是动作更干净:
- 修改文件(CoW):当你试图修改
Lowerdir里的文件时,OverlayFS 直接触发copy_up操作,把文件瞬间复制到Upperdir,后续的读写直接在Upperdir爆发,Merged 视图无缝切换。 - 删除文件(Whiteout):当你在容器里删除了底层文件,OverlayFS 会在
Upperdir里创建一个主次设备号为 0:0 的特殊字符设备。当视图层(Mergedir)看到这个无字天碑时,就会自动忽略底层对应的同名文件。
总结
从Namespace(空间隔离)→\rightarrow→Hypervisor(硬件虚拟)→\rightarrow→UFS(硬件闪存)→\rightarrow→AUFS(初代分层)→\rightarrow→OverlayFS(现代分层),这一路看下来,你会发现:
容器技术的精髓,就是不断地剔除掉中间商(比如 Hypervisor、多余的 Guest OS、繁琐的系统层),用最轻量的内核障眼法(Namespace + OverlayFS),让进程跑在最接近物理硬件的速度上。
