Overlay文件系统是一种联合文件系统,它允许将多个目录层叠在一起,形成一个统一的视图。这种技术最初在Linux内核3.18版本中被引入,现在已经成为容器技术(如Docker)中常用的存储解决方案。以下是Overlay文件系统的工作原理:
- 组成目录:
- lowerdir:只读层,包含基础文件系统的内容,用户不能修改这个层的数据。
- upperdir:可读写层,用户可以修改这个层的数据。
- merged:最终呈现给用户的目录,包含了lower和upper层的所有文件和目录。
- workdir:工作目录,用于存储临时文件和中间数据,在合并操作完成前,对这部分数据所做的修改都不会影响到最终的合并视图。
- 挂载过程:
使用mount
命令将lowerdir和upperdir目录挂载到workdir目录上,并创建merged目录作为最终的挂载点。这个过程涉及到系统调用sys_mount()
,它会执行虚拟文件系统的通用挂载过程,如申请和初始化超级块对象,并调用具体文件系统的fill_super()
接口来填充超级块对象。
- 文件系统操作:
- 文件的读取:如果容器层中不存在文件,OverlayFS会从lowerdir中读取;如果容器层中存在文件,则直接从容器层读取。如果容器层和镜像层都存在文件,OverlayFS会读取容器层中的文件,并隐藏镜像层中的同名文件。
- 文件的修改:当用户在upperdir中修改文件时,数据会直接写入upperdir中的原目录。如果用户在lowerdir中修改数据,由于lowerdir是只读的,OverlayFS会首先将lowerdir中的文件副本拷贝到upperdir中,然后在upperdir中进行修改。
- 文件的删除:为了支持删除操作,OverlayFS引入了whiteout文件的概念。如果需要在lower层删除文件或目录,需要在upper层创建一个对应的whiteout文件。
- 合并策略:
OverlayFS使用“最后写入者胜出”(last writer wins)的策略来合并文件系统。这意味着,如果有多个覆盖文件系统包含相同的文件,那么位于顶层的覆盖文件系统中的文件将被保留,而较低层覆盖文件系统中的文件将被覆盖。
Overlay文件系统的设计使其在处理大量小文件时性能更优,因为它支持页缓存共享,减少了内存占用。此外,OverlayFS的优点包括轻量级、高性能、易于与Docker等容器技术集成。然而,它也需要Linux内核3.18及以上版本,并且对共享存储的支持有限。