Overlayfs
Overlayfs 是一种类似 aufs 的一种堆叠文件系统,于 2014 年正式合入 Linux-3.18 主线内核,目前其功能已经基本稳定(虽然还存在一些特性尚未实现)且被逐渐推广。
Overlayfs 是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如 ext4fs 和 xfs 等等),并不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行“合并”,然后向用户呈现。
- 上下层同名目录合并;
- 上下层同名文件覆盖;
- lowerdir 文件写时拷贝。
进程读写overlayfs文件规则
- 进行读文件时,overlayfs文件系统驱动将优先在上层目录upperdir中查找并从该目录中读取文件,找不到则在下层目录lowerdir中查找
- 当进程写入文件时,overlay会将其写入上层目录upperdir
# 通过docker inspect containerId查看容器信息,GraphDriver显示容器文件系统信息
# 1.LowerDir 表示镜像层
# 2.UpperDir表示容器可写层
# 3.MergerdDir合并LowerDir和UpperDir中的文件列表
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/4b364d64c6776b8c5684572e0d039ed9ced2e26678a6671e77eef03f7fe312db-init/diff:/var/lib/docker/overlay2/a453b7613bb70c11cfaba21c8ec2ce2b62cafd5b2ce864a983fc188cf1410f7e/diff:/var/lib/docker/overlay2/5a722654b3ef692287ed75092f41619a68f1ed6eff4c1197f5989b8ec0798946/diff:/var/lib/docker/overlay2/1ddbf08a0d41a22bd279217d97c1af32126eb1b9276f1fe12b0a662799cca000/diff:/var/lib/docker/overlay2/dcde7a130131c1c78759c9ddd488582e1f28fa85756f89811d412080de0bc82e/diff:/var/lib/docker/overlay2/fb398cea00431e00a306d54e5ff53de55e71910915e5748725436c30af491215/diff:/var/lib/docker/overlay2/4393bf50faa2d30d9c1666a6a5a308583ff898e31193b664b562b5e228453e80/diff:/var/lib/docker/overlay2/60fd8dd602df65b6093e44e9294aee1d93636e6a0a96193cd55febc3ec054596/diff",
"MergedDir": "/var/lib/docker/overlay2/4b364d64c6776b8c5684572e0d039ed9ced2e26678a6671e77eef03f7fe312db/merged",
"UpperDir": "/var/lib/docker/overlay2/4b364d64c6776b8c5684572e0d039ed9ced2e26678a6671e77eef03f7fe312db/diff",
"WorkDir": "/var/lib/docker/overlay2/4b364d64c6776b8c5684572e0d039ed9ced2e26678a6671e77eef03f7fe312db/work"
},
"Name": "overlay2"
}
overlayfs实战
加载overlay模块
[root@mysql5 ~]# lsmod | grep overlay
overlay 91659
#如未加载,采用以下命令加载
modeprobe overlay
模拟overlayfs文件系统
[root@mysql5 ~]# mkdir overlay
[root@mysql5 ~]# cd overlay
[root@mysql5 overlay]# mkdir upper lower merged work
[root@mysql5 overlay]# echo "I'm lower layer" > lower/lower_layer.txt
[root@mysql5 overlay]# echo "I'm upper layer" > upper/upper_layer.txt
[root@mysql5 overlay]# echo "I'm upper layer" > upper/both_layer.txt
[root@mysql5 overlay]# echo "I'm lower layer" > lower/both_layer.txt
[root@mysql5 overlay]# tree
.
├── lower
│ ├── both_layer.txt
│ └── lower_layer.txt
├── merged
├── upper
│ ├── both_layer.txt
│ └── upper_layer.txt
└── work
# 合并上层目录和下层目录
[root@mysql5 overlay]# mount -t overlay overlay -o lowerdir=./lower/,upperdir=./upper/,workdir=./work/ ./merged/
[root@mysql5 overlay]# tree
.
├── lower
│ ├── both_layer.txt
│ └── lower_layer.txt
├── merged
│ ├── both_layer.txt
│ ├── lower_layer.txt
│ └── upper_layer.txt
├── upper
│ ├── both_layer.txt
│ └── upper_layer.txt
└── work
└── work