探索OverlayFS
LI Rui

在准备写本文的时候,最初的选题是aufs,但是后来发现目前的Linux 5.10内核已经不再支持aufs。Docker在早期版本曾使用aufs来管理镜像和layer,现在也因为overlay的实现更为简单高效转而使用overlay2(来源:Use the OverlayFS storage driver)。因此本文转而介绍OverlayFS。

Overlay Filesystem是一个面向Linux的文件系统,OverlayFS可以在多个文件系统上工作,将其结合起来。存在于不同文件系统的文件夹可以分为upper层和lower层,对于其内部的文件和目录,OverlayFS的处理如下:

  • 目录:OverlayFS会将每个Upper和Lower层的目录内容合并起来
  • 文件:首先合并起来,如果同名文件同时存在于Upper层和Lower层,则会隐藏Lower层的文件

下面让我们在Manjaro Linux(内核版本5.10.70-1-MANJARO)实践一下OverlayFS,以便有更深的体会。首先我们创建如下结构的目录(#号后为文件的内容,单行):

1
2
3
4
5
6
7
8
9
10
11
12
.
├── container
│   ├── 1.txt #From container 1
│   └── container.txt #From container
├── image1
│   └── 1.txt #From image 1
├── image2
│   └── 2.txt #From image 2
├── image3
│   └── 3.txt #From image 3
├── mnt
└── workdir

我们可以用mount命令创建一个overlay挂载点:

1
sudo mount -t overlay overlay -olowerdir=image1:image2:image3,upperdir=container,workdir=workdir mnt

其中lowerdir是我们创建的三个image文件夹,upperdir是container文件夹,workdir会被用作在原子操作中内容覆盖到目标文件之前做准备,特别注意的是workdir需要和upperdir的文件系统相同。

成功执行之后我们可以看看mnt文件夹的内容:

Upperdir中的1.txt成功覆盖掉了lowerdir中的同名文件。这时候假如我们编辑几个文件会发生什么呢?

我们向2.txt写入了“1”,向container.txt写入了“2”。这时候我们发现upperdir会多出一个名为2.txt的文件,内容正是修改后的2.txt,而image2的源文件内容没有改变。这是不是非常像Docker处理镜像和容器?镜像的层是只读的,在其上做的修改会保存到容器层上,并且Upperdir没有必要保存未修改的其他文件!

我们执行sudo docker info,就能查看Docker是否使用了overlay2文件系统:

1
2
3
4
5
...
Server Version: 20.10.9
Storage Driver: overlay2
Backing Filesystem: extfs
...

这次对OverlayFS的探索就先到这里,最近开了“原理探索计划”这个坑,会研究平时使用的软件背后的原理,感谢大家支持。

  • 本文标题:探索OverlayFS
  • 本文作者:LI Rui
  • 创建时间:2021-11-11 22:31:45
  • 本文链接:https://www.lirui.tech/post/2021/2bee1d012c01.html
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!