温馨提示×

Linux overlay怎么实现

小樊
40
2026-08-20 12:19:39
栏目: 智能运维

Linux 的 Overlay(OverlayFS) 是一种 联合文件系统(union filesystem),可以把多个目录(层)“叠加”在一起,形成一个统一的视图。它常用于 Docker、容器、Live CD、系统升级 等场景。

下面从 原理 → 内核实现 → 使用方式 → 示例 → 重点细节 逐步说明。


一、OverlayFS 的核心思想

OverlayFS 把多个目录组合成一个“看起来像单一文件系统”的目录:

  • lowerdir(只读层):一个或多个底层目录
  • upperdir(可写层):一个可写目录
  • workdir(工作目录):内部使用,必须和 upperdir 同文件系统
  • merged(挂载点):最终呈现给用户的目录
merged
 ├── 来自 upperdir(可写)
 └── 来自 lowerdir(只读)

二、OverlayFS 在内核中的实现原理

1️⃣ VFS 层实现

OverlayFS 是 内核文件系统,实现为:

fs/overlayfs/

它并不真正存储数据,而是 基于 VFS(虚拟文件系统)做路径重定向


2️⃣ 文件访问流程(核心)

读文件

  1. 先看 upperdir
  2. 没有 → 再到 lowerdir
  3. 返回找到的文件

写文件

  • 如果文件在 lowerdir
    • copy_up:先复制到 upperdir
    • 再在 upperdir 中修改
  • 如果文件在 upperdir
    • 直接写

删除文件

  • upperdir 中创建 whiteout 文件
  • 表示“这个文件在 lowerdir 被删除了”

3️⃣ copy_up(关键机制)

当对 lowerdir 中的文件进行修改时:

lowerdir/a.txt
↓
upperdir/a.txt(复制一份)
↓
修改 upperdir/a.txt

特点:

  • 文件级别复制(不是整个目录)
  • 只复制一次
  • 上层覆盖下层

4️⃣ whiteout(删除实现)

OverlayFS 使用 char 0/0 设备文件表示删除:

mknod a.txt c 0 0

当 merged 目录看到 whiteout:

  • 认为该路径不存在
  • 即使 lowerdir 中还有

三、OverlayFS 的挂载方式

1️⃣ 基本挂载命令

mount -t overlay overlay \
  -o lowerdir=/lower,upperdir=/upper,workdir=/work \
  /merged

要求:

  • upperdirworkdir 同文件系统
  • workdir 必须为空
  • lowerdir 可以多个

2️⃣ 多 lowerdir(优先级从左到右)

mount -t overlay overlay \
  -o lowerdir=/low1:/low2:/low3,upperdir=/upper,workdir=/work \
  /merged

查找顺序:

low1 → low2 → low3

四、实际使用例子(一步步)

1️⃣ 准备目录

mkdir -p /tmp/overlay/{lower,upper,work,merged}

2️⃣ 在 lower 中放文件

echo "lower" > /tmp/overlay/lower/file.txt

3️⃣ 挂载 overlay

mount -t overlay overlay \
  -o lowerdir=/tmp/overlay/lower,upperdir=/tmp/overlay/upper,workdir=/tmp/overlay/work \
  /tmp/overlay/merged

4️⃣ 查看效果

cat /tmp/overlay/merged/file.txt
# lower

5️⃣ 修改文件

echo "upper" > /tmp/overlay/merged/file.txt
  • 实际写入的是 /tmp/overlay/upper/file.txt
  • lower 中的文件不变

五、Docker 中的 OverlayFS

Docker 使用 OverlayFS(或 overlay2):

/var/lib/docker/overlay2

结构:

  • 每一层是一个目录
  • 容器启动时:
    • lowerdir = 镜像层
    • upperdir = 容器可写层
    • merged = 容器根目录

六、OverlayFS 的关键特性总结

✅ 优点:

  • 轻量、快速
  • 文件级 copy-up
  • 非常适合容器
  • 没有写时复制整个文件系统

⚠️ 限制:

  • upper / work 必须同文件系统
  • 不适合复杂权限模型
  • rename 有一定限制
  • 不适合 NFS 等远程文件系统

七、与类似技术对比

技术 区别
OverlayFS 内核态,轻量,文件级
AUFS 老、复杂、未合入主线
Btrfs 文件系统级快照
Device Mapper 块级,较重

八、如果你想深挖源码

关键代码路径:

fs/overlayfs/
 ├── super.c        # 挂载
 ├── inode.c        # inode 操作
 ├── dentry.c       # 目录查找
 ├── copy_up.c      # copy_up 实现
 ├── readdir.c      # 目录合并

如果你愿意,我可以:

  • 画一张 OverlayFS 读写流程图
  • 结合 Docker 镜像层详细讲
  • overlay vs overlay2
  • 分析 copy_up 的源码实现

你更想深入哪一块?

0