深入理解 OverlayFS:分层机制下的 Linux 文件系统重组
OverlayFS 给人的初印象往往是——复杂得像魔术,简单得像贴膜。
文件系统本该稳固,但 OverlayFS 反其道而行:不改底层数据,不动磁盘结构,仅用'叠加层'将多个目录合为一个挂载点。Docker 镜像分层、容器写时复制、系统无损更新……这些能力的背后都有 OverlayFS 的影子。本文将从原理、路径解析、写时复制、白名单文件及应用场景展开,帮你真正理解其内部逻辑。
一、核心问题:多层目录合并
我们能否把多个目录叠成一个?
lower1/ bin/ lib/
lower2/ etc/
upper/ home/
目标是一个统一的 merged/ 视图。OverlayFS 的作用正是:让若干目录在逻辑上叠加成一个可以正常读写的文件系统。
关键特性包括:
- 层间优先级(上层覆盖下层)
- 上层可写,下层只读
- 删除非物理移除,而是 Whiteout 标记
- 修改下层文件会复制到上层
- 不改变下层来源内容
这是性能与维护性的妥协,也是 Docker 能跑起来的基础。
二、三层结构基础
OverlayFS 依赖三个核心目录:
1. lowerdir(只读层) 可包含多个目录,优先级从左到右递减。
lowerdir=lower1:lower2:lower3
2. upperdir(可写层) 所有写入操作发生在此。修改下层文件即复制一份至此;删除则生成 Whiteout 标记。
3. workdir(工作层) 存放运行状态记录,必须与 upperdir 在同一文件系统。
挂载示例:
mount -t overlay overlay \
-o lowerdir=/lower1:/lower2,upperdir=/upper,workdir=/work \
/merged
完成后 /merged 即为合成视图。
三、路径解析逻辑
访问 /merged/etc/passwd 时,查找顺序如下:
- 检查
upperdir是否存在同名文件。 - 若无,沿
lowerdirs从左到右查找。 - 若
upperdir中有 Whiteout 文件,视为已删除。 - 找到后直接返回。
内核中通过 overlay_lookup() 实现。例如 lower1 配置最新,lower2 较旧,upper 被编辑过,最终呈现的一定来自 upper。
若用户删除文件,upper 中会产生 .wh.passwd 标记,即使 lowerdir 仍存在,merged 也不再显示。
四、写时复制(Copy-on-Write)
编辑 lowerdir 文件时,OverlayFS 不会直接修改只读层,而是:
- 复制文件到
upperdir。 - 修改
upperdir中的副本。 merged始终指向upperdir版本。
# 原始命令
vim /merged/etc/hosts
lowerdir/etc/hosts upperdir/etc/hosts


