linux overlay文件系统
一个 overlay 文件系统包含两个文件系统,一个 upper 文件系统和一个 lower 文件系统,是一种新型的联合文件系统。overlay是“覆盖…上面”的意思,overlay文件系统则表示一个文件系统覆盖在另一个文件系统上面。
为了更好的展示 overlay 文件系统的原理,现新构建一个overlay文件系统。文件树结构如下:

1、在一个支持 overlay文件系统的 Linux (内核3.18以上)的操作系统上一个同级目录内(如/root下)创建四个文件目录 lower 、upper 、merged 、work其中 lower 和 upper 文件夹的内容如上图所示,merged 和work 为空,same文件名相同,内容不同。
2、在/root目录下执行如下挂载命令,可以看到空的merged文件夹里已经包含了 lower 及 upper 文件夹中的所有文件及目录。
$mount -t overlay overlay -olowerdir=./lower,upperdir=./upper,workdir=./work ./merged
3、使用df –h 命令可以看到新构建的 overlay 文件系统已挂载。
Filesystem Size Used Avail Use% Mounted on
overlay 20G 13G 7.8G 62% /root /merged
作用
Linux Overlay文件系统的作用是提供一种轻量级的文件系统层叠机制,可以将一个或多个只读文件系统层与一个可读写的文件系统层合并在一起,形成一个虚拟的合并文件系统。通过这种方式,可以在保持只读文件系统的完整性的同时,允许在可读写文件系统上进行修改和添加文件。
Overlay文件系统的主要应用场景是在容器化环境中,可以将基础镜像作为只读文件系统层,并通过Overlay文件系统在其上创建一个可读写的文件系统层。这样,可以轻松地在容器中进行文件的修改和添加,而不会影响到基础镜像的完整性。
此外,Overlay文件系统还可以用于在嵌入式系统中管理文件系统的版本。通过使用Overlay文件系统,可以在不修改原始文件系统的情况下,添加、删除或修改文件,同时还可以方便地回滚到之前的版本。
总之,Linux Overlay文件系统的作用是提供了一种灵活且高效的文件系统层叠机制,可以在保持只读文件系统的完整性的同时,允许在可读写文件系统上进行修改和添加文件。
挂载
下面就让我们来看看如何挂载一个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有两种处理方式:
返回EXDEV错误码:rename系统调用试图穿过文件系统边界移动一个文件或目录时返回这个错误。这个是默认行为。
当使能"redirect_dir"特性后,rename操作成功,在upper层产生一个副本目录。
有以下几种方式控制"redirect_dir"特性:
KernelConfig Options:
OVERLAY_FS_REDIRECT_DIR
OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW
使能后,redirect_dir特性默认打开。
sys文件系统:
参照KernelConfig设置:
/sys/module/overlay/parameters/redirect_dir
/sys/module/overlay/parameters/redirect_always_follow
/sys/module/overlay/parameters/redirect_max
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堆叠到一个目录下,提升软件的可维护性。
linux overlay文件系统的更多相关文章
- overlay 文件系统
overlay文件系统浅析 overlayfs文件系统类似于aufs,相比aufs,overlay实现更简洁,很早就合入了linux主线, 合入主线后overlayfs修改为overlay. dock ...
- [转帖]overlay文件系统解析
overlay文件系统解析 来源:http://dockone.io/article/1511 原作者: 陈爱珍 布道师@七牛云 一个 overlay 文件系统包含两个文件系统,一个 upper 文件 ...
- Linux及文件系统基本介绍
Linux及文件系统基本介绍 1 互联网行业现状 在服务器端市场: 超级计算机 2014年11月的数据显示前500系统中的485个系统都在运行着 Linux 的发布系统,而仅仅只有一台运行着 Wi ...
- [20150925]Linux之文件系统与SHELL
Linux之文件系统与SHELL 文件系统介绍 ext2/ext3/ext4 Ext2是GNU/Linux系统中标准的文件系统.这是Linux中使用最多的一种文件系统,它是专门为Linux设计的,拥有 ...
- 文件系统管理 之 Linux 创建文件系统及挂载文件系统流程详解
阅读此文,必须具备知识点:<Linux 查看磁盘分区.文件系统.使用情况的命令和相关工具介绍><实例解说 fdisk 使用方法><合理规划您的硬盘分区><Fe ...
- linux ext2 文件系统学习
Linux ext2文件系统理解 硬盘组成: 硬盘由多个圆形硬盘片组成.按照硬盘片能够容纳的数据量分为单盘和多盘.硬盘的数据读取主要靠机械手臂上的磁头,在机械手臂上有多个磁头.机械手臂不动硬盘旋转一 ...
- linux下文件系统类型的学习
1. 以超级用户权限登陆Linux,进入 /lib/modules/2.6.32--504.el6.x86_64/kernel/fs目录执行 ls 命令(不同Linux发行版本的Fs目录有些不同你可 ...
- Linux根文件系统的制作
转载:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076655.html 1. 根文件系统 文件系统是包括在一个磁盘(包括光盘.软盘.闪盘及 ...
- linux的文件系统及节点表
linux的文件系统及节点表 一 linux的文件系统1 我们都知道当我们安装linux时会首先给系统分区,然后我们会把分区格式化成EXT3格式的文件系统.那么在linux系统中还有没有其他的文件系 ...
- linux虚拟文件系统2
转自:http://rstevens.iteye.com/blog/849413 一.概述 Linux 文件系统是相当复杂的,本文只分析虚拟文件系统的实现,对具体的文件系统不涉及. 即使是虚拟文件系统 ...
随机推荐
- python面向对象:继承
python面向对象:继承super()的用 super()的用法 一: class A: def __init__(self): self.a = '这是一个属性' def add(self, x) ...
- RPC和 HTTP协议
RPC 和HTTP 的区别 服务发现 HTTP,知道服务域名,可以通过 DNS 解析 得到 服务的IP地址,从而进行访问 RPC 需要一个专门的中间服务去保存服务名和IP信息(注册中心,nacos.c ...
- Cesium 实现可视域分析
*前言:尝试了网上好多个版本的可视域分析,感觉都有一些问题,我这个也可能不是最完美的,但是我觉得对我来说够用了,实现效果如下* 此示例基于vue3上实现,cesium版本1.101.0 ,vite-p ...
- 【BatchProgram】工作用的小工具 - 自动访问常用页面
需求: 我需要打开很多页面,但是忘了收藏的话,每次都要重新去找一遍打开 页面很多,不是一两个了,为什么这么多?因为开发情况就是这样啊: 正式生产一个页面,UAT测试一个页面,本地调试一个页面 每日工作 ...
- 【Layui】03 按钮 Button
文档位置: https://www.layui.com/doc/element/button.html 01.[按钮主题] <div> <button type="butt ...
- conda环境下安装nvidia-nvcc
参考: https://www.cnblogs.com/littletreee/p/17234053.html conda安装Pytorch或TensorFlow的时候是默认不安装nvcc,但是有时候 ...
- 强化学习:AC算法中为什么不使用Q函数来表示优势函数
强化学习中的策略梯度法(PG)不直接使用Q函数作为值函数来进行计算已经在Sutton的PG公式证明中提出,主要作用就是减少方差,因此使用优势函数进行计算.作为PG算法类中最常见的AC类算法有着较多的使 ...
- 【转载】PCT体系与传统专利体系的比较——不同国际专利申请途径的区别
原文地址: 国家知识产权局 基础知识 PCT体系与传统专利体系的比较 (cnipa.gov.cn) ======================================= 专利合作条约(PAT ...
- 零基础学习人工智能—Python—Pytorch学习(三)
前言 这篇文章主要两个内容. 一,把上一篇关于requires_grad的内容补充一下. 二,介绍一下线性回归. 关闭张量计算 关闭张量计算.这个相对简单,阅读下面代码即可. print(" ...
- 你还在手动操作仓库?这款 CLI 工具让你效率飙升300%!
前言 作为一名开发者,我经常会在 GitHub 和 Gitee 上 fork 各种项目.时间一长,这些仓库就会堆积如山,变成了"垃圾仓库".每次打开代码托管平台,看到那些不再需要的 ...