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
    +关注

    关注

    87

    文章

    11222

    浏览量

    208884
  • 云平台
    +关注

    关注

    1

    文章

    1280

    浏览量

    38868

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

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

收藏 人收藏

    评论

    相关推荐

    Linux文件系统的挂载过程

    Linux文件系统(rootfs)是Linux系统中所有其他文件系统和目录的起点,它是内核启动时挂载的第一个
    的头像 发表于 10-05 16:50 262次阅读

    如何构建Linux文件系统

    构建Linux文件系统是一个涉及多个步骤和概念的过程,它对于Linux系统的启动和运行至关重要。
    的头像 发表于 10-05 16:47 228次阅读

    小型文件系统如何选择?FatFs和LittleFs优缺点比较

    01  概述 文件系统在嵌入式系统中的作用不可或缺,它提供了对非易失性存储设备(如闪存、SD卡等)上的数据进行有效组织和管理的能力。通过文件系统,嵌入式
    的头像 发表于 09-29 16:14 939次阅读
    小型<b class='flag-5'>文件系统</b>如何选择?FatFs和LittleFs优缺点比较

    ubuntu删除的文件怎么恢复

    : Ubuntu文件系统概述 Ubuntu是一个基于Linux的操作系统,其文件系统与Windows系统
    的头像 发表于 08-30 15:10 1139次阅读

    服务器数据恢复—xfs文件系统服务器数据恢复案例

    某公司一台服务器,连接了一台存储。该服务器安装linux操作系统文件系统为xfs。 在运行过程中该服务器出现故障,管理员使用xfs_repair工具试图对xfs文件系统进行修复但失
    的头像 发表于 08-19 10:49 248次阅读

    如何更改Linux文件系统终端显示颜色

    自己制作的简单 Linux 文件系统,你会发现终端显示为黑白色,很不好看
    的头像 发表于 08-12 17:29 437次阅读
    如何更改<b class='flag-5'>Linux</b><b class='flag-5'>文件系统</b>终端显示颜色

    如何修改buildroot和debian文件系统

    本文档主要介绍在没有编译环境的情况下,如何修改buildroot和debian文件系统方法,如在buildroot文件系统中添加文件、修改目录等文件操作,在debian
    的头像 发表于 07-22 17:46 414次阅读
    如何修改buildroot和debian<b class='flag-5'>文件系统</b>

    Linux高级文件系统管理详解

    阶的文件系统就得要学习,本章我们会介绍磁盘阵列 (RAID),及逻辑卷轴文件系统 (LVM),这些工具都可以帮助你管理与维护使用者可用的磁盘容量.
    的头像 发表于 07-16 16:31 315次阅读

    linux--sysfs文件系统

    sysfs文件系统 sysfs,全称为System Filesystem,是一个由Linux内核实现的虚拟文件系统。它扮演着一个桥梁的角色,将内核中的设备和驱动程序信息以文件的形式呈现
    的头像 发表于 07-08 11:37 715次阅读
    <b class='flag-5'>linux</b>--sysfs<b class='flag-5'>文件系统</b>

    【嵌入式SD NAND】基于FATFS/Littlefs文件系统的日志框架实现

    文章目录【嵌入式】基于FATFS/Littlefs文件系统的日志框架实现1.概述2.设计概要3.设计实现3.1初始化`init`3.2日志写入`write`3.3日志读取`read`3.4注销
    的头像 发表于 03-14 18:12 1122次阅读
    【嵌入式SD NAND】基于FATFS/Littlefs<b class='flag-5'>文件系统</b>的日志框架实现

    Linux系统如何扩展文件系统

    当数据盘没有创建分区,只在设备上创建了文件系统。或者格式化了硬盘,就直接mount上系统使用。
    的头像 发表于 02-21 09:53 798次阅读

    鸿蒙轻内核源码分析:虚拟文件系统 VFS

    VFS(Virtual File System)是文件系统的虚拟层,它不是一个实际的文件系统,而是一个异构文件系统之上的软件粘合层,为用户提供统一的类 Unix 文件操作接口。由于不同
    的头像 发表于 02-18 14:50 755次阅读

    如何使用squashfs只读文件系统制作Linux系统文件

    在 Colibri iMX6 的 eMMC 上我们将使用以下分区规划。BootFS 为 FAT32 格式,该分区上包含 Linux 内核文件,device tree 等启动文件,如果是 iMX8,则还包含一些其他固件
    发表于 01-09 11:43 1755次阅读
    如何使用squashfs只读<b class='flag-5'>文件系统</b>制作<b class='flag-5'>Linux</b><b class='flag-5'>系统</b><b class='flag-5'>文件</b>

    如何配置只读属性的文件系统(Colibri iMX7为例)

    由于存储介质不同,Nand Flash 上通常采用如 jffs2、UBI 等格式文件系统。Toradex 的 Linux 系统使用 UBI 文件系统
    的头像 发表于 12-07 09:31 1001次阅读
    如何配置只读属性的<b class='flag-5'>文件系统</b>(Colibri iMX7为例)

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

    由于工作人员的误操作,将Ext4文件系统误装入到存储中Ocfs2文件系统数据卷上,导致原Ocfs2文件系统被格式化为Ext4文件系统。 由于Ext4
    的头像 发表于 12-04 10:49 417次阅读
    服务器数据恢复—ocfs2<b class='flag-5'>文件系统</b>被误格式化为Ext4<b class='flag-5'>文件系统</b>的数据恢复案例