当前位置: 首页 > news >正文

Linux-笔记 OverlayFS文件系统入门

目录

前言

主要概念

工作原理   

特点特性

1、上下合并

2、同名文件覆盖

3、同名目录合并

4、写时拷贝

实操入门

内核配置

 挂载文件系统

验证

1、同名文件覆盖

2、同名目录合并

3、写时拷贝

1)验证新增文件或目录

2)验证修改文件

3)验证删除文件

总结


前言

        OverlayFS 是一种联合文件系统,主要用于将多个文件系统的内容合并呈现给用户。在 Linux 系统中,它经常用于容器技术,比如 Docker 和 Kubernetes,以实现文件系统的层叠。OverlayFS 通过将一个文件系统层“覆盖”在另一个文件系统层之上,使得两个文件系统看起来像是一个统一的文件系统。

主要概念

  • Lowerdir:下层目录,包含了只读数据。
  • Upperdir:上层目录,包含了可写数据。
  • Workdir:工作目录,用于存储临时文件和中间数据。
  • Merged View:合并视图,用户看到的最终文件系统视图。

工作原理   

        OverlayFS 通过合并下层目录和上层目录来创建一个虚拟的合并视图。当用户对文件进行读操作时,文件系统会优先从上层目录查找文件,如果上层目录没有该文件,则从下层目录查找。对于写操作,OverlayFS 会在上层目录进行操作,并且不会修改下层目录。这种机制确保了下层目录的只读性。

特点特性

1、上下合并

        OverlayFS 的核心功能之一是将多个目录(通常是一个只读层和一个可写层)合并成一个单一的虚拟文件系统视图。这种合并方式允许用户同时访问和操作多个层中的文件,而不需要手动切换或复制文件内容。

        这里说的上下合并就是指最终会将lowerdir层的可读文件与upperdir层的可写文件合并到merged层,具体的合并规则稍后介绍。

2、同名文件覆盖

        当上下层目录中存在同名文件时,OverlayFS 会优先显示上层目录(upperdir)中的文件,隐藏下层目录(lowerdir)中的同名文件。这种机制允许用户在不修改基础层的情况下对文件进行更新或替换。

        这里说的同名覆盖是指,假设lowerdir层有一个文件叫hello.txt,upperdir层也有一个文件叫hello.txt,那最终在merged层看到的将会是upperdir层的hello.txt文件。

3、同名目录合并

        当下层目录(lowerdir)和上层目录(upperdir)都有一个同名的子目录时,OverlayFS 会将这两个目录的内容合并在一起显示给用户,用户在合并视图中看到的是两个目录的综合内容。

        如果合并的两个目录中存在同名文件,则优先显示上层目录(upperdir)中的文件,而隐藏下层目录(lowerdir)中的同名文件,这就是上面介绍的同名文件覆盖的机制。

4、写时拷贝

        当对合并视图中的文件进行写操作时,OverlayFS 会将下层目录中的只读文件复制到上层目录,并在上层目录中进行修改。这种写时拷贝机制确保了下层目录的只读性不受影响,同时提供了对文件的写访问能力。

        这里是指假设用户修改了merged层的文件file.txt,如果该文件只存在于lowerdir层,则文件会被复制到upperdir层,然后在upperdir层中进行修改,而lowerdir层中的文件则原封不动,所有的修改只发生在upperdir中的副本上。

 

实操入门

开发平台:T113

SDK:Tina 5.0 

内核配置

                

 挂载文件系统

1、检查系统是否支持OverlayFS

grep overlay /proc/filesystems

                

 2、创建必要目录

mkdir /lower /upper /work /merged
·/lower   指定lowerdir
·/upper   指定upperdir
·/work    指定work目录
·/merged  指定挂载点(合并点)

                

3、创建测试文件

        这里的思路是分别在上层与下层各创建两个文件,其中有一个文件名一样,但内容不一样,挂载后就可以验证同名文件覆盖了。

1)upper层

//upper层
cd /upper
echo "this upper first file" >> file_a.txt
echo "this upper second file" >> file_b.txt

       

2)lower层

//lower层
cd /lower
echo "this lower first file" >> file_b.txt
echo "this lower second file" >> file_c.txt

        

4、挂载文件系统,挂载后可通过命令df -h 查看是否挂在成功,可以看到overlay挂载在根目录下的merged目录。

mount -t overlay overlay -o lowerdir=/lower,upperdir=/upper,workdir=/work /merged
· -t 指定挂载的文件系统,这里指定overlay
· -o 指定挂载选项
· lowerdir=/lower 指定lower层为根目录下的lower目录
· upperdir=/upper 指定upper层为根目录下的upper目录
· workdir=/work   指定work为根目录下的work目录
· /merged         指定挂载到根目录下的merged目录,其实就是合并层

          ​​​​

        ​​​​​​        

验证

注:一切的操作都只在挂载点操作(本文章内的挂载点为/merged),这是为了防止出现不可预知的结果,本身挂载以后也不允许在lowerdir中去操作,因为它是只读的,至于upperdir,还需要考证。

1、同名文件覆盖

        挂载后查看 /merged目录情况,发现有三个文件file_a\b\c,查看内容,可知确实发生了同名文件覆盖,因为file_b.txt内容为 “this upper second file”,并非 “this lower first file”,也就说这个文件是upper层的file_b.txt文件,覆盖掉了lower层的。

                        

2、同名目录合并

        分别在upper层和lower层创建一个新目录test,然后将upper目录、lower目录先前创建的文件都拷贝到新建的test目录中去。

                

                

        然后进入 /merged目录查看,可发现里面有一个test目录,这是同名目录合并的结果,然后我们进入test目录查看,发现里面有三个文件,查看文件内容,根据文件内容,我们可以发现,同名目录合并过程中,如果目录内有同名文件,也会遵循同名文件覆盖的机制。

                ​​​​​​​        ​​​​​​​

3、写时拷贝
1)验证新增文件或目录

        在merged层新建文件hello.txt,内容为 “hello world”,然后去往upperdir与lowerdir查看是否有出现hello.txt,通过结果我们可知,在合并层新建文件只会在upperdir中出现,而不会影响lowerdir。

cd  /merged 
echo "hello world" > hello.txt

        ​​​​​​​        

        在merged层新建目录hello,然后去往upperdir与lowerdir查看是否有出现hello目录,通过结果我们可知,在合并层新建目录只会在upperdir中出现,而不会影响lowerdir。

        

2)验证修改文件

        这里还要分文件是只存在于upperdir还是只存在于lowerdir,还是同时存在两者呢,我们分别验证。

        2.1)首先我们先往只存在于upperdir中的file_a.txt中新增信息,然后去upperdir中查看是否新增了信息。通过结果可知修改只存在于upperdir中的文件时只会同步到upperdir中去。

cd /merged
echo "add str" >> file_a.txt

        

        2.2)然后我们修改只存在于lowerdir中文件,看看结果如何。lowerdir中有一个只存在于lowerdir中的文件file_c.txt,同样新增信息,通过截图我们可得知,当我们修改只存在于lowerdir中的文件时,会将其拷贝到upperdir中并修改(可看到upper目录中出现了只在lowerdir中出现的file_c.txt),而lowerdir中并不会做任何改变。

        ​​​​​​​        

        2.3)修改同时存于lowerdir与upperdir中的文件,看看结果如何,通过结果我们可知,也是只会同步到upperdir中,而不会改变lowerdir中的文件。

   

3)验证删除文件

        这里也要分文件存在于lowerdir还是upperdir中。

        3.1)要删除的文件只存在于upperdir,比如我们删除只存于upperdir中的file_a.txt,看看结果如何,可以看到只会删除掉upperdir中的文件,因为它本身只存在于那。

​​​​​​​

        3.2)删除只存于lowerdir中的文件,我们删除lowerdir中的文件file_c.txt,看看结果如何。通过结果可知,删除只存在于lowerdir中的文件只会删除挂载点(合并点)的文件,而不会删除lowerdir中的文件。但是我们又发现在upperdir中还有file_c.txt的影子,但是通过查询大小发现其实只是生成了一个大小为0的字符设备文件。

        ​​​​​​​            ​​​​​​​

总结

        通过以上的讨论以及验证方法,明白了所有操作仅影响上层目录,而不会修改下层目录,这种机制确保了下层目录的只读性和数据完整性。也明白了在OverlayFS中,Lower可以是只读的,而Upper则需要是可读写的文件系统,同时也可以利用这个机制来做一个恢复出厂的应用。这个等另一个文章  OverlayFS文件系统小应用 介绍。

相关文章:

Linux-笔记 OverlayFS文件系统入门

目录 前言 主要概念 工作原理 特点特性 1、上下合并 2、同名文件覆盖 3、同名目录合并 4、写时拷贝 实操入门 内核配置 挂载文件系统 验证 1、同名文件覆盖 2、同名目录合并 3、写时拷贝 1)验证新增文件或目录 2)验证修改文件 3&…...

Kubernetes面试整理-如何配置和使用Service, Ingress?

在 Kubernetes 中,Service 和 Ingress 是用于管理和暴露应用程序的网络访问的主要资源。以下是如何配置和使用 Service 和 Ingress 的详细指南: Service Service 是一种抽象,用于定义一组 Pod 的逻辑集合,并提供一种访问这些 Pod 的策略。Service 可以使应用程序内部或外部…...

深入浅出:NPM常用命令详解与实践

深入浅出地讲解npm常用命令及其实践,可以帮助开发者更好地理解和使用这个强大的Node.js 包管理工具。以下是一些常用的npm命令及其详细解释和实践案例: 1:初始化项目: 命令:npm init用途:生成一个package…...

IPv6 address status lifetime

IPv6 地址状态转换 Address lifetime (地址生存期) 每个配置的 IPv6 单播地址都有一个生存期设置,该设置确定该地址在必须刷新或替换之前可以使用多长时间。某些地址设置为“永久”并且不会过期。“首选”和“有效”生存期用于指定其使用期限和可用性。 自动配置的…...

OpenVINO部署

OpenVINO部署 什么是 OpenVINO?OpenVINO 的优势安装指南系统要求:安装步骤 环境设置部署示例代码优化和部署步骤详细部署示例 什么是 OpenVINO? OpenVINO(Open Visual Inference and Neural Network Optimization)是由…...

面试题:MySQL优化,项目中举例

目录 一、SQL优化分两部分,如何发现慢SQL和如何优化慢SQL 二、项目举例 一、SQL优化分两部分,如何发现慢SQL和如何优化慢SQL 发现慢SQL有两种方案:第一种是开启我们的慢日志, 第二种就是使用skywalling发现慢的接口,进…...

Spring Boot中的事件驱动编程

Spring Boot中的事件驱动编程 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Spring Boot应用中如何利用事件驱动编程模式,实现…...

代码随想录算法训练营第五十天| 1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

LeetCode 1143.最长公共子序列 题目链接:https://leetcode.cn/problems/longest-common-subsequence/description/ 文章链接:https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 * dp[i][j]…...

【Redis】数据持久化

https://www.bilibili.com/video/BV1cr4y1671t?p96 https://blog.csdn.net/weixin_54232666/article/details/128821360 单点redis问题: 数据丢失问题:实现Redis数据持久化并发能力问题:搭建主从集群,实现读写分离故障恢复问题&…...

基于Python+Flask+MySQL+HTML的B站数据可视化分析系统

FlaskMySQLVue 基于PythonFlaskMySQLHTML的B站数据可视化分析系统 项目采用前后端分离技术,项目包含完整的前端HTML,以及Flask构成完整的前后端分离系统 爬虫文件基于selenium,需要配合登录账号 简介 主页 登录页面,用户打开浏…...

桥接模式

对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题&…...

docker中mysql突然无法远程连接设置

docker登陆到docker.hub docker login -u 用户名 回车密码 将容器打包成自己的镜像 docker commit -a "用户名" -m "redis" 533d6f1402ca 用户名/myredis:v1.2 将镜像发布到平台上 docker push用户名/myredis:v1.2 删除本地镜像 docker rm image …...

Nuxt3 的生命周期和钩子函数(二)

title: Nuxt3 的生命周期和钩子函数(二) date: 2024/6/26 updated: 2024/6/26 author: cmdragon excerpt: 摘要:本文深入介绍了Nuxt.js框架中几个关键的生命周期钩子函数,包括app:redirected(SSR环境下重定向前触发…...

用英文介绍孟买:Mumbai India‘s Transforming MEGACITY

Mumbai: India’s Transforming MEGACITY Link: https://www.youtube.com/watch?vtWD_-Rzrn8o Summary First Paragraph: Mumbai, India’s financial and entertainment capital, is undergoing a major transformation. With its contiguous urban population nearing 25…...

镜像发布至dockerHub

1、login 没有账号的话去注册一个 https://hub.docker.com docker login 输入账号密码和账号2、修改镜像名格式 可以直接招我的修改 格式为你的 hub名/镜像名 3、推送...

vscode + CMake编译(opencv显示图片工程)

1.opencv 1.1Mat容器: 在OpenCV中,cv::Mat是一个重要的类,用于表示和操作矩阵或多维数组,通常用于图像处理和计算机视觉任务。 cv::Mat类具有以下特点和功能: 多维数据存储:cv::Mat可以存储多维数据&…...

JavaScript的学习之强制类型转换

目录 一、什么是强制类型转换 二、其他类型转化为String类型 方式一:调用被转化数据类型的toString()方法 方式二:调用String函数,并将我们要转换的数据添加进去为参数 三、其他类型转化为Number类型 方式一:使用Number()函数…...

天润融通:AI赋能客户体验,推动企业收入和业绩增长

“客户体验已经成为全球企业差异化的关键。人工智能与数据分析等创新技术正在加速推动企业在客户体验计划中取得成功,以保持领先地位”。Customer Insights & Analysis 研究经理Craig Simpson说道。 客户体验 (CX,Customer Experience) 是客户在与企…...

Android与服务器交互的方式中的对称加密和非对称加密(kotlin)

Android与服务器交互中的对称加密和非对称加密(kotlin) 引言 在 Android 与服务器交互时,我们常常需要进行数据传输,为了保证数据的安全性,我们可以使用加密算法来保护数据。在本文中,我们将介绍如何在 K…...

epoch和batch的区别

在机器学习和深度学习中,“epoch”(批次)和"batch"(批量)是两个重要的概念,它们分别表示训练过程中的不同阶段和数据处理方式。 Epoch(批次) 定义:Epoch&…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

golang循环变量捕获问题​​

在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下: 问题背景 看这个代码片段: fo…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

【JavaEE】-- HTTP

1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

EtherNet/IP转DeviceNet协议网关详解

一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...