Linux 的 Overlay(OverlayFS) 是一种 联合文件系统(union filesystem),可以把多个目录(层)“叠加”在一起,形成一个统一的视图。它常用于 Docker、容器、Live CD、系统升级 等场景。
下面从 原理 → 内核实现 → 使用方式 → 示例 → 重点细节 逐步说明。
OverlayFS 把多个目录组合成一个“看起来像单一文件系统”的目录:
merged
├── 来自 upperdir(可写)
└── 来自 lowerdir(只读)
OverlayFS 是 内核文件系统,实现为:
fs/overlayfs/
它并不真正存储数据,而是 基于 VFS(虚拟文件系统)做路径重定向。
upperdirlowerdirlowerdir
upperdirupperdir 中修改upperdir
upperdir 中创建 whiteout 文件当对 lowerdir 中的文件进行修改时:
lowerdir/a.txt
↓
upperdir/a.txt(复制一份)
↓
修改 upperdir/a.txt
特点:
OverlayFS 使用 char 0/0 设备文件表示删除:
mknod a.txt c 0 0
当 merged 目录看到 whiteout:
mount -t overlay overlay \
-o lowerdir=/lower,upperdir=/upper,workdir=/work \
/merged
要求:
upperdir 和 workdir 同文件系统workdir 必须为空lowerdir 可以多个mount -t overlay overlay \
-o lowerdir=/low1:/low2:/low3,upperdir=/upper,workdir=/work \
/merged
查找顺序:
low1 → low2 → low3
mkdir -p /tmp/overlay/{lower,upper,work,merged}
echo "lower" > /tmp/overlay/lower/file.txt
mount -t overlay overlay \
-o lowerdir=/tmp/overlay/lower,upperdir=/tmp/overlay/upper,workdir=/tmp/overlay/work \
/tmp/overlay/merged
cat /tmp/overlay/merged/file.txt
# lower
echo "upper" > /tmp/overlay/merged/file.txt
/tmp/overlay/upper/file.txtDocker 使用 OverlayFS(或 overlay2):
/var/lib/docker/overlay2
结构:
✅ 优点:
⚠️ 限制:
| 技术 | 区别 |
|---|---|
| OverlayFS | 内核态,轻量,文件级 |
| AUFS | 老、复杂、未合入主线 |
| Btrfs | 文件系统级快照 |
| Device Mapper | 块级,较重 |
关键代码路径:
fs/overlayfs/
├── super.c # 挂载
├── inode.c # inode 操作
├── dentry.c # 目录查找
├── copy_up.c # copy_up 实现
├── readdir.c # 目录合并
如果你愿意,我可以:
你更想深入哪一块?