OverlayFS

OverlayFS简介

OverlayFS是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等),并不直接参与磁盘空间结构的划分,仅仅将原来系统文件中的文件或者目录进行"合并一起",最后向用户展示"合并"的文件是在同一级的目录, 这就是联合挂载技术, 相对于AUFS (<1.12 早期使用的存储技术), OverlayFS速度更快,实现更简单。

Linux内核为Docker提供的OverlayFS驱动有两种:Overlay和Overlay2。而Overlay2是相对于Overlay的一种改进,在Inode利用率方面比Overlay更有效。

但是Overlay有环境需求:
(1)Docker版本17.06.02+;
(2)宿主机文件系统需要是EXT4或XFS格式;

OverlayFS实现方式

OverlayFS通过三个目录:lower目录、upper目录、以及work目录实现。
lower:
一般对应的是只读数据。

upper:
可以进行读写操作的目录。

work:
目录为工作基础目录,挂载后会自动创建一个work子目录(实际测试手动卸载后该目录并不会被删除)
该目录主要是存储一些临时存放的结果或中间数据的工作目录。

值得注意的是,在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为merged目录。

OverlayFS结构分为三个层

LowerDir、Upperdir、MergedDir
LowerDir (只读)
只读的image layer,其实就是rootfs。
在使用Dockfile构建镜像的时候, Image Layer可以分很多层,所以对应的lowerdir会很多(源镜像)。
Lower 包括两个层:
(1)系统的init
1)容器在启动以后, 默认情况下lower层是不能够修改内容的, 但是用户有需求需要修改主机名与域名地址, 那么就需要添加init层中的文件(hostname, resolv.conf,hosts,mtab等文件), 用于解决此类问题;
2)修改的内容只对当前的容器生效, 而在docker commit提交为镜像时候,并不会将init层提交。
3)init文件存放的目录为/var/lib/docker/overlay2/<init_id>/diff
(2)容器的镜像层
不可修改的数据。

Upperdir (读写)
upperdir则是在lowerdir之上的一层, 为读写层。容器在启动的时候会创建, 所有对容器的修改, 都是在这层。比如容器启动写入的日志文件,或者是应用程序写入的临时文件。

MergedDir (展示)
merged目录是容器的挂载点,在用户视角能够看到的所有文件,都是从这层展示的。

参考演示

	(1)创建工作目录
mkdir -pv /linux-test-overlayfs/lower{0..2} /linux-test-overlayfs/{uppper,work,merged}
 	
 	(2)挂载文件系统
mount -t overlay overlay -o lowerdir=/linux-test-overlayfs/lower0:/linux-test-overlayfs/lower1:/linux-test-overlayfs/lower2,upperdir=/linux-test-overlayfs/uppper,workdir=/linux-test-overlayfs/work  /linux-test-overlayfs/merged/

	(3)查看挂载信息
mount | grep merged
	
	(4)尝试在lower层写入准备初始数据
ll /linux-test-overlayfs/ -R	
cp /etc/hosts /linux-test-overlayfs/lower0/
cp /etc/issue /linux-test-overlayfs/lower1/
cp /etc/resolv.conf /linux-test-overlayfs/lower2/
ll /linux-test-overlayfs/ -R

	(5)尝试在upper层写入准备初始数据
cp /etc/hostname /linux-test-overlayfs/uppper/
ll /linux-test-overlayfs/ -R

	(6)尝试在merged目录写入数据,观察数据实际写入的应该是upper层
cp /etc/fstab /linux-test-overlayfs/merged/ 
ll /linux-test-overlayfs/ -R

	(7)重新挂载,但不挂载upperdir层
umount /linux-test-overlayfs/merged
mount -t overlay overlay -o lowerdir=/linux-test-overlayfs/lower0:/linux-test-overlayfs/lower1:/linux-test-overlayfs/lower2,workdir=/linux-test-overlayfs/work  /linux-test-overlayfs/merged/

	(8)再次尝试写入数据失败,因为没有写层。
cp /etc/os-release /linux-test-overlayfs/merged/

posted @ 2024-02-07 16:49  只为心情愉悦  阅读(579)  评论(0编辑  收藏  举报