当前位置: 首页 > 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&…...

云计算——弹性云计算器(ECS)

弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...