linux的联合文件系统 OverlayFs
概念
Linux 的 OverlayFs 是一种联合文件系统(union filesystem),允许你将多个文件系统堆叠组合在一起。它通常用于容器和轻量级虚拟技术,比如 Docker,来实现可写的容器文件系统,且不会更改底层只读层。它非常适合基于镜像创建可写的文件系统而不复制整个系统。
OverlayFs 的关键概念
OverlayFs 通过合并多个目录(层)来实现文件系统的叠加。它通常包括两个主要部分:
- Lower Layer(下层):这个只读层,通常包含系统的基础文件,比如一个操作系统的镜像。
- Upper Layer(上层):这个是可写层,用户对文件系统的修改会记录在这一层,但它只会保存更改部分,不会复制整个下层的内容。
- Mergerd Layer(合并层):这是用户看到的最终文件系统,结合了上层和下层。下层提供了基础文件,所有的写操作发生在上层,但用户感知到是一个整体的文件系统。
OverlayFs 的典型工作流程
读取操作:
- 如果文件存在于上层,OverlayFS 会直接从上层读取。
- 如果文件不存在于上层,会从下层读取。
写入操作:
- 当用户修改一个存在于下层的文件时,OverlayFS 会首先将这个文件复制到上层(称为 "写时复制"),然后对上层的副本进行修改。下层文件仍然保持不变。
删除操作:
- 当用户删除一个存在于下层的文件时,OverlayFS 并不会真正删除下层的文件。相反,它会在上层记录一个 "白名单"(whiteout),来表示这个文件在合并层中已被删除。
OverlayFS 的挂载
挂载 OverlayFS 需要指定上层、下层以及合并层。这里是如何通过命令行挂载 OverlayFS 的步骤。
- 创建目录结构
- lower 是只读的下层。
- upper 是可写的上层。
- workdir 是一个必须的工作目录,用于存储元数据。
- merged 是合并层,用户会从这个层看到最终的文件系统。
例如:
mkdir -p /mnt/lower /mnt/upper /mnt/workdir /mnt/merged
2.挂载 OverlayFs
mount -t overlay overlay -o lowerdir=/mnt/lower,upperdir=/mnt/upper,workdir=/mnt/workdir /mnt/merged
- lowerdir=/mnt/lower:下层目录。
- upperdir=/mnt/upper:上层目录,必须是可写的。
- workdir=/mnt/workdir:工作目录,必须和上层目录位于同一个文件系统中。
- /mnt/merged:挂载点,用户最终会通过这个目录访问合并的文件系统。
3.查看挂载结果
- ls /mnt/merged
举例:
查看 OverlayFS 挂载
root@TinaLinux:/usr/inonegui# mount | grep overlay
overlayfs:/mnt/UDISK/overlay on / type overlay (rw,noatime,lowerdir=/,upperdir=/mnt/UDISK/overlay/upper,workdir=/mnt/UDISK/overlay/workdir)
简单来说,我修改根目录 / 里的任何文件,表面是看似是下层,但是因为根目录被挂载到 overlayfs 系统,有写时复制机制,所以,其实修改的是上层,记录在上层中(upper),系统数据读的也是上层,但是其实 根目录下的文件没有被修改。如果把上层数据都删除了,数据就会都从下层读取,这时就是系统的原始数据,等于数据格式化,系统复原了。