温馨提示×

怎样理解linux overlay原理

小樊
32
2026-09-24 20:07:36
栏目: 智能运维

理解 Linux 的 Overlay(OverlayFS) 原理,可以从“分层文件系统”和“联合挂载”这两个核心概念入手。它最常见的用途是 Docker 镜像与容器、Live CD、只读根文件系统的可写层等。

下面分层次说明。


一、Overlay 是什么?

OverlayFS 是 Linux 的一种 联合文件系统(Union File System):

它把多个目录(称为“层”)合并成一个统一的视图,对用户看起来像是一个普通目录,但底层其实来自不同来源。

关键词:

  • 多层目录
  • 统一挂载点
  • 写时复制(Copy-on-Write)

二、核心组成(4 个目录)

Overlay 挂载通常需要 4 类目录:

lowerdir  (只读层,可以多层)
upperdir  (可写层,单层)
workdir   (内部工作目录)
merged    (用户看到的统一视图)

挂载示例:

mount -t overlay overlay \
  -o lowerdir=/lower1:/lower2,upperdir=/upper,workdir=/work \
  /merged

三、各层的作用与规则

1. lowerdir(下层,只读)

  • 可以有多层(用 : 分隔)
  • 永远不被修改
  • 上层(upper)会“遮挡”下层同名文件

2. upperdir(上层,可写)

  • 只有一个
  • 所有写操作都在这里发生
  • 容器“修改文件”时,实际改的是 upper

3. workdir(工作目录)

  • 给用户态不可见
  • 用于:
    • 文件复制(COW)
    • 重命名原子操作
  • 必须和 upper 同文件系统

4. merged(挂载点)

  • 用户真正访问的目录
  • 是 lower + upper 的“合并视图”

四、文件访问规则(重点)

✅ 读文件

  • 从 最上层(upper)开始找
  • 找不到再往 lower 找
  • 同名文件:上层优先(shadow)
upper/a.txt  -> 看到的是 upper 的 a.txt
lower/a.txt  -> 被遮挡

✅ 写文件

情况 1:文件只在 lower

  • 第一次写:
    • 把文件 复制到 upper
    • 再修改
  • 这叫 Copy-on-Write(COW)
lower/foo → 复制 → upper/foo → 修改

情况 2:文件已在 upper

  • 直接修改 upper 中的文件

✅ 删除文件

删除并不是真的删 lower:

  • 在 upper 创建一个 whiteout 文件
  • 标记“这个文件被删了”

例如:

upper/foo (whiteout)

用户就看不到 lower/foo 了。


五、为什么 Docker 用 Overlay?

Docker 镜像结构:

镜像层(lower,只读)
容器层(upper,可写)

好处:

  • 镜像层可共享
  • 容器修改不影响镜像
  • 启动快、省空间
image layer1
image layer2
container writable layer

六、一个通俗比喻

把 Overlay 想象成:

透明文件夹 + 便签纸

  • lower = 书本(不能改)
  • upper = 便签纸(写在这上面)
  • merged = 你看到的书

你写的字不在书上,而在便签上。


七、常见注意点

  1. upper 必须可写
  2. workdir 不能和 merged 相同
  3. lower 可多层,upper 只能一层
  4. 删除是“屏蔽”,不是真删
  5. 大量小文件 COW 会有性能开销

八、一句话总结

Overlay 通过“多层目录 + 写时复制 + 上层覆盖下层”,提供一个统一但可写的文件系统视图。

如果你愿意,我也可以:

  • 用 实际命令演示 overlay 挂载
  • 讲 Docker overlay2 内部结构
  • 对比 Overlay vs AUFS / btrfs

0 踩