OverlayFS在嵌入式系统中的应用

环境介绍
硬件:T113平台
软件:Tina5.0 SDK(使用的buildroot系统)

抛出问题

OverlayFS到底是个什么东西?是有一个软件叫OverlayFS?还是OverlayFs一种框架?如果是一个框架,它又应用在哪?怎么应用?不用不行吗?又或者它到底是个什么?

基本概念

OverlayFS 是一个面向Linux的文件系统服务,而不是一个独立的软件或应用程序。Overlayfs是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等等),并不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行“合并”,然后向用户呈现。

使用场景

关于OverlayFS的详细介绍后面再说。先了解一下到底为什么要使用OverlayFS。有需求才会有方案,因为这篇文章是关于OverlayFS在嵌入式系统中的应用,所以例举一下,在什么样的需求下,会使用OverlayFS:

  • 1、在板子上对大量文件做了大量修改,此时想快速回到最原始的状态;
  • 2、…

OverlayFS的详细介绍

框架

OverlayFS主要有两层目录,分别是下层目录(Lower)和上层目录(Upper)。下层目录只读,上层目录可读可写。

目录合并

若上层(Upper)与下层(Lower)出现了相同的文件,则下层的文件会被上层的文件覆盖。
image.png

修改文件

若此时要修改下图的c文件。由于下层(Lower)是不可写的,因此采用了CoW技术,在对c文件进行修改时,会复制了一份数据到上层(Upper),即实际修改的是上层(Upper)里的c文件。
image.png

删除文件

若删除了下图的c文件,实际是在上层(Upper)创建了一个同名的c标识的文件,这个文件叫whiteout文件。当扫描到此文件时,会忽略此文件名。因此不会真正的删除下层(Lower)的c文件。
image.png

添加文件

添加文件实际就是在上层(Upper)添加的。
image.png

小结

以上图片来源和关于OverlayFS更详细的介绍可以参考这篇文章。

OverlayFS在嵌入式系统中的应用

内核配置

内核开启OverlayFS( File systems -> Overlay filesystem support )。
image.png

OverlayFS简单应用

例如现在要对根目录下的usr目录应用上OverlayFS。

  • 先在根目录下创建一个overlay文件夹;
  • 在overlay文件夹下创建一个merge、upper、work文件夹;
  • 分别在merge、upper、work文件夹下创建一个usr文件夹;

此时的目录结构应该如下:

/...binusroverlaymergeusrupperusrworkusr...

挂载命令:

mount -t overlay overlay -o lowerdir=/usr,upperdir=/overlay/upper/usr,workdir=/overlay/work/usr /overlay/merge/usr
  • mount -t overlay:使用 mount 命令来挂载一个文件系统,-t overlay 指定文件系统类型为 overlay;
  • overlay:这是 overlay 文件系统本身的名称(或称为“伪设备”)。
  • lowerdir=/usr:指定/usr目录为下层目录(Lower),只读,包含原始的文件和数据;
  • upperdir=/overlay/upper/usr:指定/overlay/upper/usr目录为上层目录(Upper),所有对叠加文件系统的写操作都会发生在这个目录中。这些更改是私有的,并且不会影响到下层目录;
  • workdir=/overlay/work/usr:指定/overlay/work/usr目录为工作目录,overlay 文件系统需要它来管理元数据和临时文件;
  • /overlay/merge/usr:这是叠加文件系统的挂载点。一旦挂载成功,该目录就会显示下层目录和上层目录的合并内容,并且任何对 /overlay/merge/usr 的写操作都会发生在上层目录中;

查看挂载点会发现,下层目录和上层目录的合并内容出现了:
image.png

OverlayFS应用新思路

虽然上面已经体验了OverlayFS的挂载。但使用时还得进到overlay/merge/usr目录,这不太方便。能不能直接将/usr挂载到/usr呢?【该方法是从一个同事学来的】

mount -t overlay overlay -o lowerdir=/usr,upperdir=/overlay/upper/usr,workdir=/overlay/work/usr /usr

挂载成功后,在/usr目录下创建new文件夹,查看/overlay/upper/usr,确实多了一个new文件夹:
image.png
基于这种思路编写一个启动脚本,上电后自动挂载所需的目录。即上电后,会自动将/usr挂载到/usr、将/lib挂载到/lib等。可以将该脚本放到/etc/init.d/下。

echo "setting OverlayFS..."# 检索要挂载的目录
for dir in $(ls / | grep -vE 'proc|sys|dev|udisk|tmp|lost|sddisk|var|home|overlay|root|mnt'); doif [ -d /$dir ];thenworkdir=/overlay/work/$dir# upper层路径updir=/overlay/upper/$dirif [ ! -d ${updir} ];thenmkdir -p ${updir}echo "mkdir updir ${updir} now"fiif [ ! -d ${workdir} ];thenmkdir -p ${workdir}echo "mkdir work ${workdir} now"fi# 自己挂载自己mount -t overlay overlay -o lowerdir=/${dir},upperdir=${updir},workdir=${workdir} /${dir}fidone
echo "OverlayFS has been mounted successfully!"

这是执行脚本后的挂载情况:
image.png
这样挂载后,被挂载的目录都在下层(Lower)。操作就像平时一样操作,但实际并不会修改下层文件。如果想要恢复到原始的样子,把所有/overlay/upper/xxx/下的文件清除即可。
下面是一个恢复出厂设置的脚本,主要工作就是上面所讲的,删除所有/overlay/upper目录下所有文件夹里的内容:

#!/bin/bashecho "restore factory setting ... "# 定义目录变量
TARGET_DIR="/overlay/upper"# 进入目标目录
cd ${TARGET_DIR} || { echo "无法进入目录 $TARGET_DIR"; exit 1; }# 删除/overlay/upper目录下所有文件夹的所有内容,但不删除文件夹本身
find ${TARGET_DIR} -mindepth 1 -type d -print0 | while IFS= read -r -d '' dir; do echo "remove ${dir}"rm -rf ${dir}/*  
donecd /
echo "restore factory setting successfully!"

总结

1、对于为什么要在嵌入式系统中应用OverlayFS,还找不出太多原因。
2、对于如何正确地在嵌入式系统中使用OverlayFS,还有待继续验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第3章】SpringBoot实战篇之登录接口(含JWT和拦截器)

文章目录 前言一、JWT1. 什么是JWT2. 使用场景3. 结构3.1 Header3.2 Payload3.3 Signature 4. 使用 二、案例1.引入库2.JwtUtils3. UserController14. ArticleController 三、拦截器1. 定义拦截器2. 注册拦截器 四、测试1. 登录2. 无token3. 有token4. 全局配置 总结 前言 前面…

485通讯网关

在工业自动化与智能化的浪潮中,数据的传输与交互显得尤为重要。作为这一领域的核心设备,485通讯网关凭借其卓越的性能和广泛的应用场景,成为了连接不同设备、不同协议之间数据转换和传输的桥梁。在众多485通讯网关中,HiWoo Box以其…

unity知识点 专项三 Update函数和如何保证物理移动的准确性

一 概念 1.1 unity update 一秒调用多少次 Unity的Update函数在每一帧调用一次,如果您的游戏运行在60帧每秒(这是标准的帧率目标),那么Update函数将在每一秒被调用60次。 这是Unity的默认行为,但实际调用频率可以根…

智驾未来与低代码开发:重塑技术领域的双重革命,引领全新智能时代

在信息化浪潮席卷全球的今天,两大技术趋势——智能驾驶与低代码开发正逐渐崭露头角,它们以其独特的魅力引领着未来科技发展的方向。这两大技术不仅为传统行业注入了新的活力,更催生了众多前所未有的商业模式,使人们的生活变得更加…

计算机组成原理概论 (复习专用)

文章目录 前言一、计算机组成原理概论1.冯诺伊曼体系结构1.基本设计思想2.五大部件1.存储器 2.运算器3.控制器4.5.输入/输出设备 2.计算机语言3.计算机的性能指标1.机器字长2.存储容量3.运算速度4.可靠性、可维护性、可用性5.功耗、能耗 后续看时间,可能会补充例题.…

postman教程-10-使用cookie

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了Postman Authorization授权的几种方法,本小节我们讲解一下Postman 使用cookie的方法。 Postman 的 cookie 管理器使您能够查看和编辑与不同域关联的 cookie。您可以为域手动创建 c…

软件测试、测试模型、测试用例

软件开发的五个模型 瀑布模型(Waterfall Model) 瀑布模型是所有其他模型的基础框架,瀑布模型的每个阶段都只执行一次,因此是线性顺序进行的开发模式优点:强调开发的阶段性; 强调早期计划及需求调查&#…

*args 与 **kwargs

*args 与 **kwargs *args**kwargs *args 在 Python 中,*args 是一个特殊的语法,用于表示函数定义或调用时的可变参数列表(variable argument list)。这里的星号(*)表示 “任意数量”,而 args 是…

链表任意位置插入删除

链表的插入删除主要是要考虑如果为空表&#xff0c;删除第一个等特殊情况&#xff0c;考虑全面。 具体实现如下 #include<stdlib.h> #include<stdio.h> struct Node {int data;struct Node* next; }; struct Node* head; void print() {struct Node* temp head;p…

【Python实战】使用postman测试flask api接口

cookie_demo.py # -*- coding: utf-8 -*- """ Time : 2024/5/28 17:14 Author : 娜年花开 File : cookie_demo.py Desc : 需求&#xff1a;用户需要先登陆&#xff0c;登陆之后&#xff0c;通过Cookie来判断是不是能够访问登录后的接口userinfo &quo…

TMS FNC WX Pack TMS软件分发的一组应用程序

TMS FNC WX Pack TMS软件分发的一组应用程序 TMS FNC WX Pack是由TMS软件分发的一组应用程序。这些活动是100%的跨平台和跨Frimorc&#xff0c;并在不同的应用程序中得到支持&#xff0c;如Web应用程序、Windows、Linux等。阿拉伯语视觉组件库。安装这些计算机的过程非常简单高…

【2024最新华为OD-C/D卷试题汇总】密码解密 (100分) - 支持在线评测+三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 在线评测链接 密码解密(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解锁~…

【Unix】运行时so库动态加载

运行时可以自己自定义so库的动态加载框架&#xff0c;主动去加载某些库&#xff0c;并调用其中的某些方法 首先写一些方法&#xff0c;并生成so库 // hello.cpp#include <iostream>/*使用 nm 命令查看 so 库的内容 */// 1. 使用extern // dlsym(handle, "hello&qu…

Elasticsearch REST API 初探:索引与搜索文档的奥秘

在当今数据驱动的时代&#xff0c;高效的数据检索和存储成为了众多企业和项目的关键需求。Elasticsearch 作为一款基于 Lucene 的开源搜索和分析引擎&#xff0c;凭借其分布式、可扩展和高性能的特性&#xff0c;成为了处理大规模数据的首选工具。本文将带你初步探索 Elasticse…

第四讲 单片机STC89C52+RA8889代码移植范例(包含API接口)

本次介绍单片机STC89C52RA8889代码移植范例&#xff0c;该范例已将RA8889的API移植好了&#xff0c;下方提供下载地址。 硬件平台&#xff1a;89C52RA8889 采用SPI通信方式 (已测试通过&#xff09; 上一讲已经阐述RA8889移植到51单片机的基本方法&#xff0c;本讲增加了API…

C语言从头学15——数据类型(一)

C语言中的数据都有类型区别&#xff0c;必须先声明数据的类型后才能操作数据。基本数据类型有三种&#xff1a;字符型&#xff08;char&#xff09;、整型数&#xff08;int&#xff09;和浮点型数&#xff08;float&#xff09;。其它复杂的类型都是以它们为基础构建的&#x…

【第一节】数据结构和算法绪论

目录 一、数据结构的起源与发展 二、什么是数据结构 三、数据的逻辑结构和存储结构 四、数据类型和数据结构 五、算法 六、算法与数据结构的关系 七、算法时间复杂度和空间复杂度 一、数据结构的起源与发展 数据结构的起源可以追溯至1968年。当时&#xff0c;美国的唐欧…

Spring Security 注册过滤器注意事项

前两天和小伙伴聊了 Spring SecurityJWT 实现无状态登录&#xff0c;然后有小伙伴反馈了一个问题&#xff0c;感觉这是一个我们平时写代码容易忽略的问题&#xff0c;写一篇文章和小伙伴们聊一聊。 一 问题复原 先来说问题吧&#xff0c;在 Spring SecurityJWT 登录中&#x…

C++入门5——C/C++动态内存管理(new与delete)

目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在…

【C语言】位段(结构体实现位段)

目录 一、位段的定义 二、位段的声明 三、位段的内存分配 四、位段在内存中的存储方式 五、位段的优点 六、位段的跨平台问题 七、位段的应用 八、位段使用的注意事项 一、位段的定义 信息的存取一般以字节为单位。实际上&#xff0c;有时存储一个信息不必用一个或多个字…