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.-华为云开发者联盟