大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux overlayfs文件系统概述问题。
OverlayFS,顾名思义,是一个堆叠的文件系统,可以将多个目录的内容叠加在另一个目录上。OverlayFS与磁盘空间结构没有直接关系,似乎来自多个目录的文件按照规则合并到同一个目录。且对多个源目录使用具体文件系统类型没有要求,即使每个源目录的文件系统类型不同,使用也不会受到影响。
1.安装覆盖层
让我们看一下如何挂载OverlayFS文件系统:
mount-t overlay-o lower dir=/low,upperdir=/upper,workdir=/work overlay /merged
上面的命令可以将“lowerdir”和“upper”目录堆叠到/merged目录中,“workdir”工作目录应该是与“upperdir”目录相同文件系统的空目录。
您也可以省略upperdir和workdir参数,但是/merged是只读的:
mount-t重叠-o lowerdir=/upper:/lower重叠/合并
还可以支持多个较低优先级的目录堆栈:
mount-t overlay-o lowerdir=/lower 13360/lower 23360/lower 3,upperdir=/upper,workdir=/workoverlay /merged
lowerdir的多级目录用“:”分隔,其中层次关系为/lower R1/lower R2/lower 3。
使用上述挂载合并OverlayFS后,需要遵循以下规则:当lowerdir和upperdir两个目录中存在同名文件时,Lower Dir的文件将被隐藏,用户只能看到upperdir的文件。
同一目录中同名的低目录低优先级文件将被隐藏。如果有一个同名的目录,lowerdir和upperdir目录的内容将被合并。
当用户在mergedir中修改来自upperdir的数据时,数据将直接写入upperdir中的原始目录,删除文件也是如此。
当用户在mergedir中修改lowerdir中的数据时,lowerdir中的内容根本不会改变。由于lowerdir是只读的,当用户想要修改lowerdir中的数据时,overlayfs将首先将lowerdir中的文件副本复制到upperdir(这也称为OverlayFS的复制功能)。随后的修改或删除将在upperdir下的副本中进行,lowerdir中的原始文件将被隐藏。
如果一个目录仅仅来自lowerdir或者lowerdir和upperdir的组合,默认情况下不能进行重命名系统调用。但可以用mv改名。为了支持重命名,需要配置_覆盖_文件系统_重定向_目录。
一般来说,lowerdir是只读文件系统,upperdir是可写文件系统,这就形成了一种有趣的机制。似乎我们可以修改lowerdir下的文件或目录,lowerdir看起来是一个可读可写的文件系统。
第二,删除文件和目录
为了在不修改下层文件系统的情况下支持rm和rmdir,有必要记录上层文件系统中的文件或目录已被删除。重叠引入了空白文件的概念。如果需要删除下层的文件或目录,需要在上层创建一个空白文件。
可以看到,删除合并目录中的文件或目录后,上层创建了aa、bb和dir三个空白文件。空白文件不是普通文件,而是主/辅设备号为0的字符设备。只有上层存在的文件cc可以直接删除。
第三,创建文件和目录
创建操作类似于删除操作,在上层进行修改。直接在中创建文件
upper层新增文件即可,如果upper层存在对应的whiteout文件,先删除whiteout文件再创建文件。创建目录与创建文件类似,区别在于upper层存在whiteout文件时,删掉whiteout文件创建目录,如果就此结束,lower层对应目录(因为有whiteout文件)的文件就被显示到merged目录了,所以还需要将目录的“trusted.overlay.opaque”属性设为“y”(所以这也就需要upper层所在的文件系统支持xattr扩展属性),OverlayFS在读取上下层存在同名目录的目录项时,如果upper层的目录被设置了opaque属性,它将忽略这个目录下层的所有同名目录中的目录项,以保证新建的目录是一个空的目录。四、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模式下我们adbremount后似乎就可以往/system/目录下push内容了,查看remount前后的mount信息,可以看到/system/目录被重新挂载成可读写的OverlayFS文件系统了:
remount前:
remount后:
重启:
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
编辑:jq
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。
在使用如上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文件。
可以看到删除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属性,它将忽略这个目录下层的所有同名目录中的目录项,以保证新建的目录是一个空的目录。
四、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模式下我们adbremount后似乎就可以往/system/目录下push内容了,查看remount前后的mount信息,可以看到/system/目录被重新挂载成可读写的OverlayFS文件系统了:
remount前:
remount后:
重启:
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
编辑:jq
.dfma { position: relative; width: 1000px; margin: 0 auto; } .dfma a::after { position: absolute; left: 0; bottom: 0; width: 30px; line-height: 1.4; text-align: center; background-color: rgba(0, 0, 0, .5); color: #fff; font-size: 12px; content:"广告"; } .dfma img { display: block; }