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

    文章

    11631

    浏览量

    218024
  • 云平台
    +关注

    关注

    1

    文章

    1533

    浏览量

    41676

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

    Linux三大主流文件系统解析

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

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

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

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

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

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

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

    EM-1000储能网关如何批量部署应用

    EM-1000实现了以Overlayfs为基础的文件叠层系统,分离了系统文件和用户文件,其好处是
    的头像 发表于 05-16 11:37 470次阅读
    EM-1000储能网关如何批量部署应用

    Linux文件系统打包及镜像制作,触觉智能RK3562开发板演示

    本文介绍Linux开发板文件系统打包及镜像制作的方法,演示Linux文件系统打包及镜像制作,适用于想将配置好的系统环境打包成镜像批量烧录。触
    的头像 发表于 04-28 16:45 777次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>文件系统</b>打包及镜像制作,触觉智能RK3562开发板演示

    支持48位寻址!华为开源文件系统EROFS跨入大模型训练

    的要求。   最近,开源文件系统EROFS在即将到来的Linux 6.15内核周期中进行扩展,以处理更大规模的存储系统。此次改进旨在使EROFS更适配AI训练场景及其他大规模数据归档需求。   在
    发表于 03-27 01:22 973次阅读

    如何正确选择嵌入式文件系统

    Linux嵌入式系统中,文件系统和缓存机制常导致数据存储稳定性问题。本文通过案例分析原因,对比不同文件系统特性,为开发者提供优化建议,助力提升数据稳定性和
    的头像 发表于 03-17 11:35 871次阅读
    如何正确选择嵌入式<b class='flag-5'>文件系统</b>?

    在stm32cubeprogrammer上烧录时,取消勾选根文件系统,烧录后发现sd卡上根文件系统的分区没有了,为什么?

    在修改了linux内核后,我想只把bootfs烧录到sd卡上,而不擦除根文件系统的分区。 我在stm32cubeprogrammer上烧录时,取消勾选根文件系统,烧录后发现sd卡上根文件系统
    发表于 03-07 06:38

    NFS网络文件系统深度解析

    NFS:Network File System 网络文件系统,基于内核的文件系统。Sun 公司开发,通过使用 NFS,用户和程序可以像访问本地文件一样访问远端系统上的
    的头像 发表于 03-01 14:15 1180次阅读

    防止根文件系统破坏,OverlayRootfs 让你的设备更安全

    OverlayRootfs介绍OverlayRootfs是指利用OverlayFS技术创建的根文件系统(rootfilesystem)。OverlayFS是一种联合文件系统(Union
    的头像 发表于 01-08 16:33 2469次阅读
    防止根<b class='flag-5'>文件系统</b>破坏,OverlayRootfs 让你的设备更安全

    关于更新openharmony文件系统时遇到的问题

    用的固件,文件系统,内核是之前的,之前版本用起来没问题。但是 用下面三个的时候 固件可以正常烧录,也按照文档里面加载了环境变量,但是烧录内核和文件系统(都是U盘更新的)的时候出现了这样的问题
    发表于 12-30 11:55