[转]Linux overlayfs文件系统介绍
2021-10-17 01:51:14 Author: blog.csdn.net(查看原文) 阅读量:48 收藏

OverlayFS,顾名思义是一种堆叠文件系统,可以将多个目录的内容叠加到另一个目录上。OverlayFS并不直接涉及磁盘空间结构,看起来像是将多个目录的文件按照规则合并到同一个目录。且对多个源目录具体使用文件系统类型没有要求,即使各个源目录的文件系统类型不同也不影响使用。

一、挂载OverlayFS

下面就让我们来看看如何挂载一个OverlayFS文件系统:

mount-t overlay -o lowerdir=/lower,upperdir=/upper,workdir=/work overlay /merged

上面的命令可以将"lowerdir"和"upper"目录堆叠到/merged目录,"workdir"工作目录要求是和"upperdir"目录同一类型文件系统的空目录。

也可以省略upperdir和workdir参数,但/merged为只读属性了:

mount-t overlay -o lowerdir=/upper:/lower overlay /merged

也可支持多lowerdir目录堆叠:

mount-t overlay -o lowerdir=/lower1:/lower2:/lower3,upperdir=/upper,workdir=/workoverlay /merged

lowerdir的多层目录使用":"分隔开,其中层级关系为/lower1> /lower2 > /lower3。

996a902db4288de97dcdebcde8880047.png

在使用如上mount进行OverlayFS合并之后,遵循如下规则:

•        lowerdir和upperdir两个目录存在同名文件时,lowerdir的文件将会被隐藏,用户只能看到upperdir的文件。

•        lowerdir低优先级的同目录同名文件将会被隐藏。

•        如果存在同名目录,那么lowerdir和upperdir目录中的内容将会合并。

•        当用户修改mergedir中来自upperdir的数据时,数据将直接写入upperdir中原来目录中,删除文件也同理。

•        当用户修改mergedir中来自lowerdir的数据时,lowerdir中内容均不会发生任何改变。因为lowerdir是只读的,用户想修改来自lowerdir数据时,overlayfs会首先拷贝一份lowerdir中文件副本到upperdir中(这也被称作OverlayFS的copy-up特性)。后续修改或删除将会在upperdir下的副本中进行,lowerdir中原文件将会被隐藏。

•        如果某一个目录单纯来自lowerdir或者lowerdir和upperdir合并,默认无法进行rename系统调用。但是可以通过mv重命名。如果要支持rename,需要CONFIG_OVERLAY_FS_REDIRECT_DIR。

一般lowerdir为只读文件系统,upperdir为可写文件系统,这形成了一个有趣的机制,似乎我们可以修改lowerdir下的文件或目录,lowerdir看上去变成了一个可读写的文件系统。

二、删除文件和目录

为了支持rm和rmdir而又不修改lower文件系统,需要在upper文件系统中记录文件或目录已经被删除。OverlayFS引入了whiteout文件的概念。如果需要删除lower层的文件或目录,需要在upper层创建一个whiteout文件。

a716d9589d49548adff98a3b75abbdb1.png

可以看到删除merged目录下的文件或目录后,在upper层新建了aa、bb、dir三个whiteout文件,whiteout文件不是普通文件,而是主/次设备号都是0的字符设备。只存在于upper的文件cc直接删除就可以了。

三、创建文件和目录

创建操作与删除操作类似,都是在upper层进行修改。创建文件直接在upper层新增文件即可,如果upper层存在对应的whiteout文件,先删除whiteout文件再创建文件。创建目录与创建文件类似,区别在于upper层存在whiteout文件时,删掉whiteout文件创建目录,如果就此结束,lower层对应目录(因为有whiteout文件)的文件就被显示到merged目录了,所以还需要将目录的"trusted.overlay.opaque"属性设为"y"(所以这也就需要upper层所在的文件系统支持xattr扩展属性),OverlayFS在读取上下层存在同名目录的目录项时,如果upper层的目录被设置了opaque属性,它将忽略这个目录下层的所有同名目录中的目录项,以保证新建的目录是一个空的目录。

8a6ebf4deadf4d56146fc914c1d94336.png

四、rename目录

当我们想重命名一个在lower层的目录,OverlayFS有两种处理方式:

1.      返回EXDEV错误码:rename系统调用试图穿过文件系统边界移动一个文件或目录时返回这个错误。这个是默认行为。

2.     当使能"redirect_dir"特性后,rename操作成功,在upper层产生一个副本目录。

         有以下几种方式控制"redirect_dir"特性:

1.      KernelConfig Options:

•        OVERLAY_FS_REDIRECT_DIR

•        OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW

         使能后,redirect_dir特性默认打开。

2.     sys文件系统:

         参照KernelConfig设置:

         /sys/module/overlay/parameters/redirect_dir

         /sys/module/overlay/parameters/redirect_always_follow

         /sys/module/overlay/parameters/redirect_max

3.     MountOptions:

         redirect_dir=on/off/follow/nofollow

五、Android中的应用

OverlayFS文件系统可以类似达到把只读文件系统改为可写文件系统的效果,这一特性在Android开发的场景下得到应用,userdebug模式下我们adb remount后似乎就可以往/system/目录下push内容了,查看remount前后的mount信息,可以看到/system/目录被重新挂载成可读写的OverlayFS文件系统了:

remount前:

e5477997517774eaaf5152cdeb27e8d9.png

remount后:

4edb46da45340de8a72c49ac0a3f86cb.png

重启:

6ab812bbafddd75e91470e8ea333dd21.png

system、vendor、product等目录是以ext4文件系统方式挂载的,remount后以OverlayFS挂载,之后重启也会以OverlayFS方式挂载,以使之前的修改生效。

system和vendor等的upperdir都在/cache可写文件系统中,往/system目录push东西实际上都存放在/cache/overlay/system/upper目录中了。实际的system分区并没有被修改,修改的文件全部存放在cache分区了。

OverlayFS也被应用在把多个不同分区的目录堆叠到一个目录下面,可以更好做到软件系统的组件解耦,不同特性的组件内容分别放到不同分区,最后通过OverlayFS堆叠到一个目录下,提升软件的可维护性。

六、小结

OverlayFS以其独特的优势正得到越来越广泛的应用,Androiduserdebug/eng模式中使用其实现对系统分区的修改。OpenWRT系统也利用OverlayFS减少擦写闪存的次数,延长闪存的使用寿命。OverlayFS更多的应用在云平台的容器镜像,基础的容器镜像通常不应被改变,新功能叠加可以通过OverlayFS实现且可以再次分发。

参考文献

1.      https://www.kernel.org/doc/html/latest/filesystems/overlayfs.html

2.     https://blog.csdn.net/luckyapple1028/article/details/78075358

f627bc0b71258b8205b85825ff4f3b92.gif

长按关注

内核工匠微信

Linux 内核黑科技 | 技术文章 | 精选教程


文章来源: https://blog.csdn.net/21cnbao/article/details/120806586
如有侵权请联系:admin#unsafe.sh