0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux overlayfs文件系统概述

Linux阅码场 来源:Linux阅码场 作者:Linux阅码场 2021-10-20 10:21 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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文件。

ecc091b4-3101-11ec-82a8-dac502259ad0.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属性,它将忽略这个目录下层的所有同名目录中的目录项,以保证新建的目录是一个空的目录。

ed06132e-3101-11ec-82a8-dac502259ad0.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模式下我们adbremount后似乎就可以往/system/目录下push内容了,查看remount前后的mount信息,可以看到/system/目录被重新挂载成可读写的OverlayFS文件系统了:

remount前:

ed733f6c-3101-11ec-82a8-dac502259ad0.png

remount后:

ede5d8ec-3101-11ec-82a8-dac502259ad0.png

重启:

ee59c9a0-3101-11ec-82a8-dac502259ad0.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

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11854

    浏览量

    219821
  • 云平台
    +关注

    关注

    1

    文章

    1570

    浏览量

    42412

原文标题:Linux overlayfs文件系统介绍

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞萨RA系列FSP库开发实战指南之FatFs文件系统介绍

    即使读者可能不了解文件系统,读者也一定对“文件”这个概念十分熟悉。数据在PC上是以文件的形式储存在磁盘中的,这些数据的形式一般为ASCII 码或二进制形式。
    的头像 发表于 03-18 13:47 4722次阅读
    瑞萨RA系列FSP库开发实战指南之FatFs<b class='flag-5'>文件系统</b>介绍

    明晚8点|睿擎文件系统实战:从开发到发布全流程解析

    文件操作到镜像发布,一次直播掌握完整开发流程!在嵌入式系统开发中,文件系统是数据存储、配置管理和资源访问的核心基础。然而在实际开发中,文件操作效率低下、镜像打包流程复杂、
    的头像 发表于 11-11 11:53 871次阅读
    明晚8点|睿擎<b class='flag-5'>文件系统</b>实战:从开发到发布全流程解析

    【直播预告】下周三晚8点|睿擎文件系统实战:从开发到发布全流程解析

    文件操作到镜像发布,一次直播掌握完整开发流程!在嵌入式系统开发中,文件系统是数据存储、配置管理和资源访问的核心基础。然而在实际开发中,文件操作效率低下、镜像打包流程复杂、
    的头像 发表于 11-06 18:05 2110次阅读
    【直播预告】下周三晚8点|睿擎<b class='flag-5'>文件系统</b>实战:从开发到发布全流程解析

    睿擎派文件系统指南:从开发到发布全流程实践 | 技术解析

    在嵌入式系统开发中,文件系统扮演着至关重要的角色,它负责数据的持久化存储、配置文件管理和资源访问等核心功能。睿擎平台提供了一套完整的文件系统解决方案,从开发阶段的API调用到调试阶段的
    的头像 发表于 11-05 18:13 8404次阅读
    睿擎派<b class='flag-5'>文件系统</b>指南:从开发到发布全流程实践 | 技术解析

    文件系统,使用iar编译报错,gcc可以正常编译,为什么?

    文件系统,使用iar编译报错,gcc可以正常编译,为什么?
    发表于 09-23 06:54

    文件系统文件怎么循环覆盖的写入数据?

    请教一个文件系统数据写入的问题。 比如我新建一个文件,test.txt,写入数据超过512KB后,就从头开始写,后面的数据不删除,从头开始覆盖。 比如原来写了1000条数据,然后从头开始循环覆盖
    发表于 09-22 08:20

    如何在 nuc980 上切换到持久文件系统

    我遵循了“NUC980 Linux 4.4 BSP 用户手册EN.pdf”文档,但当我尝试取消选择“初始 RAM 文件系统和 RAM 磁盘 (initramfs/initrd) 支持
    发表于 08-29 07:58

    技术贴|【RK3588】ELF 2开发板如何添加exFAT和NTFS文件系统格式

    基于RK3588设计的ELF2开发板在搭载Desktop22.04系统时,对TF卡的文件系统支持存在以下限制:不支持exFAT格式;支持NTFS格式,但需手动挂载;针对上述兼容性问题,本文将介绍
    的头像 发表于 08-27 17:21 3928次阅读
    技术贴|【RK3588】ELF 2开发板如何添加exFAT和NTFS<b class='flag-5'>文件系统</b>格式

    Linux三大主流文件系统解析

    还在为选择哪个文件系统而纠结?作为一名摸爬滚打多年的运维老鸟,我将用最接地气的方式,带你彻底搞懂 Linux 三大主流文件系统的奥秘。
    的头像 发表于 08-05 17:37 1880次阅读

    Linux系统目录结构全面剖析

    Linux文件系统采用层次化的目录结构,这种设计遵循了Unix哲学中的"一切皆文件"原则。理解Linux目录层次架构对于系统管理员、运维工程
    的头像 发表于 07-21 17:33 1091次阅读

    飞凌嵌入式ElfBoard ELF 1板卡-文件系统之应用开机自启

    在busybox构建文件系统章节我们已经大概了解,文件系统启动后执行的第一个用户进程是init进程,init进程会解析etc/inittab文件,执行inittab中的各个子进程,打开文件系统
    发表于 06-26 13:40

    飞凌嵌入式ElfBoard ELF 1板卡-文件系统常用命令之磁盘管理与维护常用命令

    一、df:查看系统已用空间df命令,用于显示linux系统中各文件系统的硬盘使用情况。包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容
    发表于 06-24 11:26

    飞凌嵌入式ElfBoard ELF 1板卡-文件系统简介

    9.1 文件系统概念文件系统通常提供目录或文件夹用于记录文件,在很多系统中目录本身也是文件,在这
    发表于 06-19 17:22

    服务器数据恢复—重装系统导致XFS文件系统分区丢失的数据恢复案例

    服务器数据恢复环境&故障: 一台服务器上通过磁盘柜+RAID卡组建的riad5磁盘阵列,服务器上层安装Linux操作系统,搭建XFS文件系统。服务器上层分配一个LUN,并划分了两个分区
    的头像 发表于 06-12 11:20 970次阅读
    服务器数据恢复—重装<b class='flag-5'>系统</b>导致XFS<b class='flag-5'>文件系统</b>分区丢失的数据恢复案例

    服务器数据恢复—ocfs2文件系统被格式化为Ext4文件系统的数据恢复案例

    服务器存储数据恢复环境&故障: 人为误操作将Ext4文件系统误装入一台服务器存储上的Ocfs2文件系统数据卷上,导致原Ocfs2文件系统被格式化为Ext4文件系统
    的头像 发表于 06-10 12:03 968次阅读
    服务器数据恢复—ocfs2<b class='flag-5'>文件系统</b>被格式化为Ext4<b class='flag-5'>文件系统</b>的数据恢复案例