ubi和squashfs关系区别,以及ubi卷上运行squashfs系统

本文介绍了UBI和Squashfs两种文件系统在Linux环境下的使用。UBI提供了一种在只读块设备上运行如Squashfs这样的文件系统的能力,而UBIFS则是在UBI卷上运行的读写文件系统。通过创建R/Oblockdevices,Squashfs能在UBI卷上运行,处理NAND设备的低级细节。文章还详细展示了如何制作和挂载Squashfs及UBIFS文件系统的步骤。

ubi和squashfs关系和区别介绍

rootfs运行squashfs (只读)
roootfs_data运行ubifs (读写)
由于ubifs是运行在UBI卷之上的文件系统,而squashfs是运行在block device之上的文件系统,二者本来无任何交集,但是UBI提供了能够在ubi卷之上创建只读块设备的特性(R/O block devices on top of UBI volumes),这使得squashfs也能够“运行”在ubi卷之上。

R/O block devices on top of UBI volumes
UBI 允许在 UBI 卷上创建只读块设备,该卷适用于只读的、面向块的文件系统,例如 squashfs。
UBI允许在 UBI 卷上创建块设备,但有以下限制:

只读操作。
串行化 I/O 操作,但请记住 NAND 驱动内核也已经串行化了所有 I/O。
尽管有这些限制,块设备对于在UBI卷上安装只读的常规文件系统仍然非常有用。以 squashfs 为例,它可以用作 NAND 设备之上的轻量级只读 rootfs。在这种情况下,UBI层将处理低级细节,例如位翻转处理和磨损均衡。
 

ubifs和squashfs框架图

基于任意MTD设备,attach之后创建2个UBI卷(volume0和volume1)
将squashfs镜像存入volume0,将ubifs镜像存入volume 1
基于volume0 创建 ubi block device,使用该block device 挂载 squashfs
使用vloume 1挂载ubifs
注意:如果不需要运行ubifs,那么只创建一个volume运行squashfs也是可以行的。


下面将以实例演示如何实现在ubi之上运行squashfs:
在进行如下操作之前,需要了解nand flash一些参数。如下是在我实验板上的nand flash的参数:

block size 256KB
page size 4KB
(UBI)LEB 248KB
(UBI)PEB 256KB
flash total size 4096 blocks
flash min I/O size 4KB

制作squashfs

mkdir myfs

ls myfs/
abc  hello

mksquashfs myfs/ squashfs.img -b 256k -nopad -noappend -root-owned -comp xz -processors 1

-b 指定 flash一个block的大小
-comp xz 指定压缩算法为 xz
-root-owned 文件系统内所有文件的owner都是root
-noappend 不追加到已存在的文件系统
-nopad 不要将文件系统填充到 4K 的倍数
-processors 1 使用 1个处理器构建文件系统
 

制作ubifs

ls myubidir/
myubi

mkfs.ubifs -m 4KiB -e 248KiB -c 128 --space-fixup --compr=lzo --squash-uids -r myubidir/ -o ubifs.img
 

制作ubi镜像

需要用到ubinize,ubinize工具还需要一个描述ubi卷的配置文件ubinize.cfg,其配置如下:

[my_squashfs]
mode=ubi
vol_id=0
vol_type=dynamic
vol_name=my_squashfs
image=squashfs.img

[my_ubifs]
mode=ubi
vol_id=1
vol_type=dynamic
vol_name=my_ubifs
vol_flags=autoresize
image=ubifs.img

上述配置文件包含2个卷:

动态卷0,为其分配ID 0 并命名为my_squashfs;卷的内容取自squashfs.img ;
动态卷1,为其分配 ID 1 并命名为my_ubifs; 卷的内容取自 ubifs.img;
my_squashfs 卷的类型必须是dynamic,否则后续无法挂载

ubinize -m 4KiB -p 256KiB ubinize.cfg -o ubi.image

烧写ubi镜像

ubiformat  /dev/mtd54 -y -f /tmp/ubi.img 

ubiattach -p /dev/mtd54

生成ubi卷:使用ubinfo -a查看:

ubi10
Volumes count:                           2
Logical eraseblock size:                 253952 bytes, 248.0 KiB
Total amount of logical eraseblocks:     1422 (361119744 bytes, 344.3 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes                 128
Count of bad physical eraseblocks:       0
Count of reserved physical eraseblocks:  80
Current maximum erase counter value:     4
Minimum input/output unit size:          4096 bytes
Character device major/minor:            502:0
Present volumes:                         0, 1

Volume ID:   0 (on ubi10)
Type:        dynamic
Alignment:   1
Size:        1 LEBs (253952 bytes, 248.0 KiB)
State:       OK
Name:        my_squashfs
Character device major/minor: 502:1
-----------------------------------
Volume ID:   1 (on ubi10)
Type:        dynamic
Alignment:   1
Size:        1337 LEBs (339533824 bytes, 323.8 MiB)
State:       OK
Name:        my_ubifs
Character device major/minor: 502:2

对应的ubi节点生成:ls /dev/ubi10*

ubi10    ubi10_0  ubi10_1

ubifs文件系统挂载

mkdir /tmp/myubifs_dir

mount -t ubifs /dev/ubi10_1 /tmp/myubifs_dir/

squashfs文件系统挂载

创建只读块设备
ubiblock 工具用于创建或者销毁ubi块设备,使用方法如下:

Usage: ubiblock [-c,-r] <UBI volume node file name> Example:

ubiblock -c /dev/ubi0_0

ubiblock -r /dev/ubi0_0

ubiblock -c /dev/ubi10_0 

mkdir mysquashfs_dir

mount -t squashfs /dev/ubiblock10_0 /tmp/mysquashfs_dir

文件系统挂载情况查看

df | grep my   
/dev/ubi10_1             26116        32     26084   1% /tmp/myubifs_dir
/dev/ubiblock10_0          256       256         0 100% /tmp/mysquashfs_dir

cd /tmp/mysquashfs_dir/
:/tmp/mysquashfs_dir# touch aa
touch: cannot touch `aa': Read-only file system

这里注意:虽然是挂载在tmp目录下,但是在/tmp/mysquashfs_dir下是无法创建文件的。

参考:

Memory Technology Device (MTD) Subsystem for Linux. //ubifs介绍

Squashfs 4.0 Filesystem — The Linux Kernel documentation //squashfs介绍

后续遗留关注:

./bin/ubinize -v -o ubi.img -m 4096 -p 256KiB -s 4096 ./bin/ubinize.cfg中

image=dir/pub.key参数

generate_verity_key

simg2img

fscrypt

dm_0节点产生等

dev/dm-2                  128       128         0 100% /test_dir

 umount /dev/ubiblock13_0 
umount: /dev/ubiblock13_0: not mounted.

而是需要umount /dev/dm-2(DM_TABLE_LOAD DM_DEV_CREATE DM_DEV_STATUS android fs_mgr_main这一套)

ubi较好的文章学习:【NAND文件系统】UBI介绍_linux_Ruler.-华为云开发者联盟


 


 

<think>我们正在讨论SquashFSJFFS2文件系统是否需要创建卷。首先需要明确“创建卷”的含义。在存储文件系统上下文中,“卷”通常指一个独立的、可挂载的存储单元,类似于分区或逻辑卷。 根据提供的引用: 引用[1]提到:cramfssquashfs是只读文件系统,JFFS2是可读写文件系统,且JFFS2适用于嵌入式产品。 引用[2][4]描述了制作JFFS2镜像的过程,使用的是`mkfs.jffs2`命令,并且指定了输出文件(如rootfs_jffs2.jffs2)。这里并没有提到需要额外的卷管理步骤。 引用[3]描述了制作SquashFS镜像的过程,使用`mksquashfs`命令,直接生成一个镜像文件(xxx.squashfs)。 同时,结合UBI文件系统的知识(在之前的回答中讨论过),UBI是用于管理NAND闪存的卷管理系统,它支持多个卷(volumes)。而SquashFSJFFS2本身是文件系统,它们可以直接部署在块设备(如MTD分区)上,也可以作为UBI卷的文件系统。 因此,我们需要分情况讨论: 1. **直接部署在MTD分区上**: - 对于JFFS2:JFFS2是设计用于裸闪存(MTD设备)的文件系统。它不需要额外的卷管理。我们直接将JFFS2镜像烧写到MTD分区上,挂载时指定文件系统类型为JFFS2即可。 - 对于SquashFSSquashFS通常用于只读的块设备(如光盘、ROM),它也可以用于MTD设备(通过将MTD设备视为块设备)。在MTD设备上使用SquashFS时,通常需要先将其转换为块设备(例如使用mtdblock驱动),然后挂载SquashFS。同样,不需要额外的卷管理。 2. **作为UBI卷的文件系统**: - 在UBI层之上,我们可以创建多个卷(volumes),每个卷可以包含一个文件系统UBI卷可以格式化为不同的文件系统,包括UBIFS(这是专为UBI设计的)SquashFS(只读)以及JFFS2(理论上可以,但较少见,因为UBI层已经提供了坏块管理磨损均衡,而JFFS2本身也提供这些功能,所以通常JFFS2直接用于MTD,而不经过UBI)。 - 引用[1]提到,yaffs2只用于NAND Flash,而UBI也是用于NAND Flash。因此,在NAND Flash上,我们可能会使用UBI来管理多个卷。如果要在UBI卷上使用SquashFS,那么我们需要先创建UBI卷,然后将SquashFS镜像放在该卷中。同样,对于JFFS2,通常不放在UBI卷上,因为JFFS2本身就可以直接管理闪存。 结论: - **SquashFS**:作为只读文件系统,它可以被直接部署在块设备(包括MTD转换而来的块设备)上,不需要创建卷。但是,如果它被部署在UBI卷上(例如在NAND Flash上使用UBI来管理),那么需要先创建UBI卷(通过ubinize工具配置文件),然后将SquashFS镜像放入该卷中。注意:SquashFS本身不支持写入,因此它适合作为只读卷。 - **JFFS2**:通常直接部署在MTD设备上,不需要卷管理。虽然理论上可以将其放在UBI卷上(即先创建一个UBI卷,然后将JFFS2镜像放入),但这样会形成两层闪存转换层(UBIJFFS2各自管理坏块磨损均衡),效率低下,因此不推荐。 所以,回答用户的问题: - 如果直接使用MTD设备,则不需要创建卷。 - 如果使用UBI层(例如在NAND Flash上),那么对于SquashFS,需要先创建UBI卷;对于JFFS2,通常不通过UBI,而是直接使用。 另外,注意引用[3]中制作SquashFS镜像引用[2][4]中制作JFFS2镜像的过程都没有涉及卷的创建,说明在制作文件系统镜像时,我们并不需要卷,卷是在部署时(烧写到存储设备时)考虑的。 因此,最终回答: SquashFSJFFS2文件系统在直接部署到MTD设备时不需要创建卷。如果要将SquashFS部署在UBI卷上,则需要先创建UBI卷(此时需要卷配置)。JFFS2通常不部署在UBI卷上,所以不需要。 下面我们详细说明。</think>### SquashFS 与 JFFS2 文件系统是否需要创建卷? #### 1. **核心结论** - **SquashFS**:不需要创建独立卷 直接作为**只读压缩文件系统镜像**部署(如 `.squashfs` 文件) - **JFFS2**:不需要创建独立卷 直接作为**可读写文件系统镜像**部署(如 `.jffs2` 文件) 这两种文件系统都直接与底层存储介质交互,无需额外的卷管理层。 --- #### 2. **工作原理对比** | **特性** | **SquashFS** | **JFFS2** | |----------------|----------------------------------|------------------------------------| | **部署方式** | 直接烧录镜像文件[^3] | 直接烧录镜像文件[^2][^4] | | **卷管理需求** | ❌ 无 | ❌ 无 | | **典型命令** | `mksquashfs root_dir image.squashfs` | `mkfs.jffs2 -d root_dir -o image.jffs2` | | **存储介质** | NOR/NAND Flash, ROM, 光盘 | 专为 NAND/NOR Flash 设计[^1] | | **压缩支持** | 支持 gzip/xz/lzo 压缩[^3] | 透明压缩(运行时解压) | --- #### 3. **与需要卷管理的文件系统对比 需要卷管理的文件系统(如 **UBIFS**): ```mermaid graph LR A[原始数据] --> B[UBI卷管理] B --> C[UBIFS文件系统] ``` - **必须**通过 `ubinize.cfg` 定义卷结构[^1] - 典型场景:NAND Flash 的坏块管理磨损均衡 SquashFS/JFFS2 **跳过卷管理层**: ```mermaid graph LR A[原始数据] --> B[SquashFS/JFFS2镜像] B --> C[直接烧录到Flash] ``` --- #### 4. **典型应用场景** **SquashFS 部署流程**(只读系统): ```bash # 创建镜像(无需卷配置) mksquashfs rootfs/ rootfs.squashfs -comp xz -b 256K # 直接烧录到Flash分区 flashcp rootfs.squashfs /dev/mtd3 ``` **JFFS2 部署流程**(可读写系统): ```bash # 创建镜像(注意-p参数指定分区大小[^4]) mkfs.jffs2 -d rootfs/ -o rootfs.jffs2 -e 0x10000 -s 4096 --pad=0x800000 # 直接烧录到Flash flash_erase /dev/mtd2 0 0 nandwrite -p /dev/mtd2 rootfs.jffs2 ``` --- #### 5. **关键差异解析** - **SquashFS 限制**: 只读特性使其无法处理坏块,需配合只读存储介质使用[^1] - **JFFS2 优势**: 内置坏块管理磨损均衡,可直接管理 Flash 物理层[^2] - **UBI 依赖场景**: 仅当在 NAND Flash 上部署 **UBIFS**(非 JFFS2/SquashFS)时才需卷管理 > 例如:在 NAND 上使用 SquashFS 时,通常通过 **MTD 块设备模拟层**(如 `/dev/mtdblock0`)直接挂载,无需 UBI 卷[^1]。 --- ### 常见问题解答 **Q1: 为什么 SquashFS 镜像可以直接烧录?** SquashFS 是自包含的压缩镜像,文件系统元数据已集成在镜像中,烧录后可直接解析[^3]。 **Q2: JFFS2 如何管理 Flash 坏块?** JFFS2 在运行时通过 **擦除块标记** **日志结构** 动态避开坏块,无需预配置卷[^2][^4]。 **Q3: 何时需要 UBI 卷管理?** 仅当使用 **UBIFS 文件系统**(非 SquashFS/JFFS2)时,需要 UBI 处理 NAND 的坏块磨损均衡[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a2591748032-随心所记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值