什么是 overlay 文件系统?

OverlayFS 是一种联合文件系统,它允许将一个或多个文件系统(称为“层”)叠加在一起,以创建一个单一的、统一的文件系统视图。它特别适用于只读文件系统与可写层的组合,这使得在容器化环境、Live CD、和临时文件系统中非常有用。

OverlayFS 的主要概念

1.下层(Lower Layer):这是一个只读文件系统,例如一个 squashfs 文件系统,它通常包含静态的操作系统和应用程序文件。
2.上层(Upper Layer):这是一个可写的文件系统,例如一个 tmpfs 或者一个普通的文件系统分区,用于存储文件系统的变化。
3.合并目录(Merge Directory):这是最终的挂载点,用户和应用程序在这里看到的是一个统一的文件系统视图。它将上层和下层的内容合并。
4.工作目录(Work Directory):这是一个用于 OverlayFS 操作的临时存储区域,需要在上层的同一个文件系统中。

OverlayFS 工作原理

1.读操作:当读取一个文件时,OverlayFS 会首先在上层查找该文件。如果在上层找到该文件,它将返回该文件内容。如果在上层找不到该文件,它将继续在下层查找。

2.写操作:当写入一个文件时,如果该文件存在于下层,OverlayFS 会将该文件从下层复制到上层(称为写时复制,Copy-on-Write 或 CoW),然后对上层的文件进行写操作。如果文件只存在于上层,直接对其进行写操作

具体示例:

假设我们有一个只读的 squashfs 文件系统作为下层和一个可写的 tmpfs 作为上层。

1.创建目录结构:

1
2
3
4
mkdir /mnt/lower
mkdir /mnt/upper
mkdir /mnt/work
mkdir /mnt/merged

2.挂载下层和上层:

假设 rootfs.squashfs 是下层

1
mount -o loop /path/to/rootfs.squashfs /mnt/lower

挂载一个可写的 tmpfs 作为上层

1
mount -t tmpfs tmpfs /mnt/upper

3.使用 OverlayFS 进行合并:

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

4.检查合并结果:

1
ls /mnt/merged

典型应用场景

1.容器技术:Docker 等容器技术使用 OverlayFS 来管理容器层,允许高效的镜像创建和写时复制。
2.Live CD/USB 系统:Live 系统通常使用 OverlayFS 来在只读介质上运行操作系统,并提供可写的层以允许用户修改系统配置和安装软件。
3.开发环境:开发人员可以使用 OverlayFS 在不修改底层操作系统的情况下测试软件变化。

通过 OverlayFS,我们可以轻松地将多个文件系统合并为一个统一的文件系统视图,从而实现灵活且高效的文件系统管理。