首页 > 系统相关 >如何理解OpenWRT上的SquashFS 和 OverlayFS 机制,它们何区别?以OpenFi 5Pro为例讲解这两者之间的关系,以及Linux的squashfs固件类型

如何理解OpenWRT上的SquashFS 和 OverlayFS 机制,它们何区别?以OpenFi 5Pro为例讲解这两者之间的关系,以及Linux的squashfs固件类型

时间:2024-11-18 23:44:44浏览次数:3  
标签:文件 OpenFi overlay OverlayFS 分区 为例 文件系统 SquashFS 修改

如何理解OpenWRT上的SquashFS 和 OverlayFS 机制,它们何区别?以OpenFi 5Pro为例讲解这两者之间的关系,以及Linux的squashfs固件类型

很多同学不理解squashfs固件类型到底是什么概念,也分不清overlay是什么意思,那今天就正好加班写个文章详细说说这两者的关系,正好利用手头上的OpenFi 5Pro作为演示,它就运用了经典的SquashFS 文件系统,看看它们究竟存在什么关系。

1. SquashFS 和 OverlayFS 机制

  • SquashFS 分区:SquashFS 是一种只读的压缩文件系统,用于存储固件的核心系统文件(例如 /bin, /sbin, /lib, /etc 等)。由于 SquashFS 是只读的,文件无法被直接修改,因为SquashFS 中的数据是以压缩的形式存在的,只有系统启动时才会把他解压出来放到内存当中去让系统读取,这就是为什么它不能被修改,如果他能被修改,那么每次关机之前都要对他进行压缩,如果系统直接断电,岂不是直接崩溃?

  • OverlayFS 分区:为了支持文件的修改和持久化,OpenWRT 使用 OverlayFS,它是一个联合挂载文件系统,将一个只读的底层文件系统(SquashFS)与一个可读写的上层文件系统(通常是 JFFS2 或 F2FS)结合在一起。上层文件系统通常被称为 overlay 分区,当文件被修改的时候他就会立马被写入到overlay里去,区别就在于他是不用压缩的,也就是说你的文件是6kb,那么他就占用overlay的6kb空间,所以你在软件安装界面看到的剩余空间其实就是overlay的剩余空间。

2. 文件修改和保存原理

  • 当系统启动时,内核会首先挂载只读的 SquashFS 文件系统作为根文件系统(/rom)。

  • 然后,内核会创建并挂载一个可读写的 overlay 分区(一般挂载在 /overlay)。

  • OverlayFS 将这两个分区结合在一起,并将其挂载为最终的根文件系统 /,在该根文件系统上进行所有操作时,系统会呈现出读写状态。

  • 当热然它们都是被挂载在内存当中的,当文件发生改变时系统才会把他们写入flash

文件修改时的行为:
  • 读取操作:当系统尝试读取一个文件时,首先会在 overlay 分区(可写层)查找。如果文件不存在,则会从 SquashFS 分区(只读层)读取。
  • 写入操作:当系统尝试修改一个文件时,该文件会被复制到 overlay 分区。此后,对该文件的修改操作都只会作用在 overlay 分区,SquashFS 上的原始文件不会受到影响。
  • 新增文件:如果创建了一个新文件,它会直接被写入 overlay 分区。

3. 分区布局示例

以下是 OpenFi 5Pro上的分区布局(flash大小为64MB):

root@OpenFi:~# df -h                    
Filesystem                Size      Used Available Use% Mounted on
/dev/root                14.0M     14.0M         0 100% /rom
tmpfs                   248.7M    780.0K    247.9M   0% /tmp
/dev/mtdblock6           46.8M      1.9M     44.9M   4% /overlay
overlayfs:/overlay       46.8M      1.9M     44.9M   4% /
tmpfs                   512.0K         0    512.0K   0% /dev

观察Mounted on一列:

  • /rom: 只读的 SquashFS 文件系统,它的大小就是固件的大小。
  • /overlay: 可读写的分区,用于保存修改,也就是用户的数据。
  • /: 最终的根文件系统,由 OverlayFS 组合而成。
  • 为什么**/overlay** 和 **/**的大小一样?其实很容易理解,我们看看flash的分区情况:
root@OpenFi:~# cat /proc/mtd
dev:    size     erasesize  name
mtd0: 00030000  00010000   "bootloader"   # 192 KB 引导分区                                                                                                 
mtd1: 00010000  00010000   "config"       # 64 KB 参数配置分区
mtd2: 00010000  00010000   "factory"      # 64 KB 存一些出厂的MAC地址、无线校准参数等等
mtd3: 03f00000  00010000   "firmware"     # 63 MB 这里就是存系统文件的分区了
mtd4: 002b769e  00010000   "kernel"       # 2.72 MB firmware里的内核分区
mtd5: 03c48962  00010000   "rootfs"       # 60.77 MB firmware里的文件系统分区
mtd6: 02ec0000  00010000   "rootfs_data"  # 46.75 MB rootfs里的overlay分区(rootfs的大小减去固件的大小)
  • 也就是说其实/dev/mtdblock6对应的就是以上的rootfs_data,而overlayfs:/overlay就是挂载到/dev/mtdblock6上的overlayfs文件系统,他们本来就是一个东西啊。

4. 检查你的设备 overlay 使用情况

用以下命令检查 overlay 分区的挂载情况和使用情况:

df -h

比如上面的例子里得到以下结果:

5. overlay 分区删掉会发生什么?

答案是:“恢复出厂设置。。。”

此操作会清空所有的用户修改和新增文件,重启后系统会恢复到刷机时的默认状态。

6. 哪些行为会保存文件到 overlay

  • 当用户或者系统使用UCI的时候都会将配置文件保存到 overlay中,比如:
uci set system.@system[0].hostname='OpenFi'          
uci commit
  • 用户安装的ipk应用程序
  • 再或者用户或者程序创建的除了tmp临时目录以外的所有文件都会保存到overlay当中去。

如何给openwrt扩容?

  • 既然我们知道了overlay的作用是存储用户的数据,那么我们只需要将overlay的位置转移到内存更大的地方去,就能实现扩容。当然了,前提是你的flash还有未应用的空间,或者你有外置的存储设备可以被openwrt识别。
  • 具体的扩容方法其实有很多教程,具体可以自行搜索。比如用cfdisk工具进行修改等。

总结:

  • 不可修改的文件:保存在 SquashFS 中,无法被直接修改。
  • 被修改和新增的文件:保存在 overlay 分区中,这部分是可读写的,会在系统重启后保留修改。

为什么要选择这种机制?

squashfs一般用于小闪存的机器中,这种分区布局设计使得 OpenWRT 可以在很小的闪存中存储一个几十MB甚至更大的系统文件,同时得益于内存优越的读写速度,使得系统可以非常流畅的运行。这也是 OpenWRT 使用 SquashFS 文件系统的一个主要原因。

标签:文件,OpenFi,overlay,OverlayFS,分区,为例,文件系统,SquashFS,修改
From: https://blog.csdn.net/Brukamen/article/details/143868335

相关文章

  • 层次聚类——以凝聚型层次聚类为例讲解(易懂版)
            层次聚类是一种将数据集逐步划分为层次结构的方法,是一种无监督学习方法最终形成一颗树状图(dendrogram),可以直观地表示不同数据点之间的聚类关系。它是一种无监督学习方法。层次聚类的两种方法凝聚型(自底向上):这是最常见的方法,从每个数据点开始,将它们作为单独......
  • 【鸣潮,原神PC端启动器】仿二次元手游PC端游戏启动器,以鸣潮为例。
    二游GAMELanucher启动器1.前言许多二次元手游(原神,鸣潮,少女前线)的PC端启动器都是使用Qt做的,正好最近正在玩鸣潮,心血来潮,便仿鸣潮启动器,从头写一个。先下载一个官方版的PC启动器,找到图标,背景图等素材,然后对着界面写代码就行。效果如下2.划分模块游戏启动器大致可以......
  • 充电桩基础设施的时空大数据分析:以深圳市为例
    随着全球对可持续交通解决方案的需求不断增长,电动汽车(EV)作为减少交通领域碳排放的重要手段,受到了广泛的关注。然而,电动汽车的普及和发展面临着诸多挑战,其中充电基础设施的建设和管理尤为关键。为了更好地理解和解决这些问题,本篇文章利用ST-EVCDP和ST-EVCDP-v2数据集进行深入的......
  • Linux CPU 拓扑结构之调度域 调度组 - 以8核ARM big.Little架构处理器为例
    CPU拓扑结构简介SMTLevel超线程处理器的一个核心MCLevel多核CPU的一个核心DIELevel一个物理CPU的晶片(注意不是package,package是封装好了的,肉眼看到的CPU处理器)(覆盖系统所有的CPU(CPU0~CPUN))cpu最小级别的就是超线程处理器的一个smt核,次小的一级就是一个多核cpu......
  • Vue自定义指令详解——以若依框架中封装指令为例分析
    自定义指令在Vue.js中,自定义指令提供了一种非常灵活的方式来扩展Vue的功能。以下是对Vue中自定义指令的详细解释:一、自定义指令的基本概念自定义指令允许开发者直接对DOM元素进行低层次操作,而无需编写大量的模板或者JavaScript代码。它们可以响应Vue的响应式系统,从而在数据......
  • 私域流量时代下的新型商业模式:以开源链动 2 + 1 模式、AI 智能名片、S2B2C 商城小程序
    摘要:本文探讨了私域流量时代的特点及其对商业盈利模式的影响。通过分析从大众消费时代到私域流量时代的转型,阐述了商品到“人”的变化过程。同时,深入研究了开源链动2+1模式、AI智能名片和S2B2C商城小程序源码在私域流量发展中的作用和意义,揭示这些新型模式和技术如何助......
  • AI 扩展开发者思维方式:以 SQL 查询优化为例
    在现代软件开发中,AI技术的兴起让开发者的思维方式发生了显著变化。尤其是在SQL查询优化、代码重构以及算法设计等领域,AI提供的建议不仅扩展了开发者的思考路径,还帮助他们发现以往没有意识到的潜在解决方案。1.传统思维模式下的SQL查询过去,开发者在编写SQL查询时通常......
  • Centos7下用Python写一个磁盘空间自动预警脚本(以PCB制前工程InCAM/InCAMPro资料库及s
    思路分析:(1).查看InCAM/InCAMPro资料库路径;#进入InCAM/InCAMPro资料库配置文件(dblist.xml)路径,查看配置文件资料库配置路径#vim/incam/server/site_data/dblist.xml如下图获取资料库路径为"/incam/camdb":(2).获取资料库路径挂载点,在终端执行"df-h"指令;#......
  • 浅谈单片机的gcc优化级别__以双音频信号发生器为例
    IDE:  CLionHOST: Windows11MinGW:x86_64-14.2.0-release-posix-seh-ucrt-rt_v12-rev0GCC: arm-gnu-toolchain-13.3.rel1-mingw-w64-i686-arm-none-eabi一、简介        gcc有多种优化级别,一般不选择的情况下,IDE默认是按照-Og或这-O2优化的。        ......
  • 以RK3568为例,ARM核心板如何实现NTP精准时间同步?
    背景 网络时间协议NTP(Network TimeProtocol)是用于互联网中时间同步的标准互联网协议,可以把计算机的时间同步到某些时间标准。NTP对于我们产品来说有什么用呢,简单的讲,当你的设备时间不准确了,你可以接入到互联网,从网上同步一下时间,非常方便。对于我们嵌入式行业,大批量生产......