当前位置:首页 > 嵌入式 > Linux阅码场
[导读]OverlayFS,顾名思义是一种堆叠文件系统,可以将多个目录的内容叠加到另一个目录上。OverlayFS并不直接涉及磁盘空间结构,看起来像是将多个目录的文件按照规则合并到同一个目录。且对多个源目录具体使用文件系统类型没有要求,即使各个源目录的文件系统类型不同也不影响使用。一、挂...

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模式下我们adb remount后似乎就可以往/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实现且可以再次分发。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在资源受限的嵌入式场景中,根文件系统(RootFS)的体积与功耗直接影响产品成本与用户体验。基于Yocto构建的轻量级根文件系统,通过精准裁剪与动态功耗管理,可将系统体积压缩至30MB以内,同时降低30%以上的待机功耗。...

关键字: Yocto 根文件 RootFS

在嵌入式硬件调试中,时钟抖动和电源轨噪声是影响系统稳定性的两大关键因素。示波器作为核心调试工具,通过其高级触发、频谱分析和眼图测试功能,可精准定位问题根源。本文以泰克MDO4000C系列示波器为例,解析时钟抖动与电源噪声...

关键字: 示波器 嵌入式硬件 时钟抖动

嵌入式系统开发中,硬件与软件高度耦合,复杂度高,一次性集成所有模块调试极易陷入“问题定位难、复现率低”的困境。分步调试法通过“最小功能验证→模块逐步扩展→多模块协同”的渐进式策略,可显著提升调试效率。本文以STM32微控...

关键字: 嵌入式系统 分步调试法

在嵌入式系统向智能化、高性能化演进的浪潮中,RISC-V开源指令集架构凭借其模块化设计和可扩展性,成为硬件加速领域的重要推动力。结合FPGA的可重构特性,基于RISC-V的硬件乘法器实现方案正逐步打破传统架构的性能瓶颈,...

关键字: RISC-V FPGA

在物联网设备、可穿戴设备等嵌入式场景中,电池寿命是制约产品竞争力的核心指标。低功耗设计需贯穿硬件选型、系统架构到软件策略的全流程,其中休眠模式切换与电源管理芯片(PMIC)的精细配置是关键环节。本文从实际工程角度,解析如...

关键字: 低功耗设计 PMIC配置 嵌入式系统

在嵌入式系统开发中,传统软件断点依赖指令替换,易受优化代码或ROM存储限制,而JTAG调试器通过硬件断点与内存监控功能,可突破这些瓶颈,实现精准调试。本文结合ARM Cortex-M与RISC-V架构实践,解析JTAG在...

关键字: JTAG调试器 硬件断点设置 嵌入式软件

在物联网设备固件升级过程中,未授权修改或恶意代码注入可能导致设备失控、数据泄露等严重后果。通过RSA-2048签名验证结合硬件安全模块(HSM)的防篡改设计,可在STM32H7系列MCU上实现99.997%的攻击拦截率。...

关键字: 固件升级 签名验证 物联网

在嵌入式系统开发中,性能优化与功耗控制是相互制约的核心挑战。通过对STM32F4系列MCU的实测分析,发现通过针对性代码优化可使计算密集型任务执行时间缩短62%,而结合精准功耗测量可进一步降低系统能耗35%。本文结合具体...

关键字: 嵌入式系统 代码优化

在嵌入式系统开发中,信号完整性直接影响系统稳定性。示波器作为硬件调试的核心工具,其200MHz带宽以上型号可捕捉纳秒级时序异常,成为破解SPI通信故障、电源纹波超标等难题的关键。本文结合Rigol DS1054Z与Tek...

关键字: 示波器 信号分析

在物联网设备数量突破500亿台的今天,嵌入式固件的安全性已成为保障数据隐私的核心挑战。AES(高级加密标准)凭借其抗量子计算攻击的128/192/256位密钥体系,成为嵌入式安全领域的首选算法。本文将解析AES在资源受限...

关键字: AES算法 嵌入式固件
关闭