文章目录
前言
Linux中常用的联合文件系统有OverlayFS和Aufs(Another Union File System), OverlayFS是Linux内核自带的联合文件系统, 而Aufs则是第三方提供的联合文件系统, 本博客以OverlayFS为主
文件系统前置知识
- BootFS(boot file system)
- Bootloader:引导并加kernel
- Kernel:当kernel被加载到内容后,进行unmount bootfs
- RootFS (root file system)
- /dev,/proc,/bin,/etc等标准目录和文件
- 对于不同的Linux发行版,bootfs基本一致,但是rootfs会有些差异
- Linux内核启动后会先将rootfs设置为只读(read-only)模式,然后经过一系列的检查等操作,最终在将其切换成可读写(read-write)模式
- UnionFS(union file system)
- unionfs支持将多个文件系统叠加合并成单一的虚拟文件系统,使得操作系统能同时访问这些文件系统的内容
- unionfs采用了分层文件系统的思想,通常包括一个读写层和一个或多个只读层。在读写层上的改动不会影响只读层,实现了对文件系统的叠加操作
- 写时复制(copy on write),只有当文件系统中的内容需要发生修改时,才会将基础的只读层的文件或目录等内容复制到读写层的文件系统进行修改,可以提供快速的文件系统传输和节省存储空间
Docker对UnionFS的运用
- Docker镜像由基础镜像层(Base Layer)、中间镜像层(Intermediate Layers)、顶层镜像层(Top Layer)组成:基础镜像是Docker镜像的最底层,通常由裸机的Linux发行版构建而成,包含rootfs和基本的文件和目录结构。在基础镜像层之上,可能会有多个中间镜像层,每个中间镜像层对应Dockerfile中的一条指令(比如RUN、COPY、ADD等)。每个中间镜像层都包含了指令执行后产生的文件变化,以及该层次的元数据信息。顶层镜像层是最后一层,是容器运行时所基于的镜像层,记录了容器的文件系统的修改或增量,容器能够在此进行读写操作
- Docker镜像由于是基于UnionFS的分层文件系统来构造的。每层镜像都包含了文件系统的一部分,不同镜像会共享相同的底层基础镜像,底层基础镜像实际上只占用一份磁盘空间,在磁盘上仅存储一份文件。这种设计使得镜像的管理和传输更加高效
- 根据UnionFS的特性,Docker镜像的各个层是可以共享的,例如当多个容器运行相同的镜像时,这些容器都可以共享相同的只读镜像层,从而节省了存储空间并加速了容器的启动速度
- 容器初始化时将rootfs以只读方式加载并检查,之后利用union mount的方式将可读写的文件系统挂载到只读的rootfs之上
- 容器能够复用宿主机的内核资源,包括内核的系统调用、网络栈、进程空间和文件系统,可以将宿主机的指定路径的文件或目录挂载到容器内部指定位置,这就是挂载卷的原理
检查系统是否支持OverlayFS
cat /proc/filesystems | grep overlay
准备两个目录
一个用作基础文件系统的目录(通常为只读)
另一个用作可写的文件系统层
加载OverlayFS模块
sudo modprobe overlay
创建OverlayFS
sudo mount -t overlay overlay -o lowerdir=基础目录,upperdir=可写层目录,workdir=工作目录 目标目录
基础目录:底层只读(read-only)模式的目录
读写层目录:上层读写(read-write)模式的目录,存储OverlayFS文件系统中只读基础层的增量变动
工作目录:用于存储OverlayFS的内部工作文件,存储一些临时信息和数据
目标目录:OverlayFS文件系统的挂载目录,最终合并后的文件系统的目录
使用OverlayFS
可以像使用任何其他文件系统一样使用OverlayFS,对基础目录和可写层目录中的文件和目录进行读写操作
卸载OverlayFS
sudo umount 目标目录