当前位置:网站首页>【文件系统】如何在ubi之上运行squashfs
【文件系统】如何在ubi之上运行squashfs
2022-07-01 05:49:00 【Ruler.】
在UBI之上运行squashfs文件是openwrt系统中常见的方式:
- 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层将处理低级细节,例如位翻转处理和磨损均衡。
实现原理

- 基于任意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
制作squashfs需要用到mksquashfs工具,使用说明参见mksquashfs
创建fs目录内容如下:
$ ls
apps this_is_squashfs.txt
执行如下命令:根据fs目录创建squashfs,输出的squashfs镜像文件为 squashfs.img
mksquashfs fs/ 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
制作squashfs需要用到mkfs.ubifs工具,使用方法参见创建UBIFS镜像
创建fs目录内容如下:
$ ls
apps this_is_ubifs.txt
执行如下命令:根据fs目录创建ubifs,输出的ubifs镜像文件为 ubifs.img
mkfs.ubifs -m 4KiB -e 248KiB -c 128 --space-fixup --compr=lzo --squash-uids -r fs -o ubifs.img
制作ubi镜像
制作ubi镜像需要用到ubinize工具,参考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,否则后续无法挂载
最后,执行如下命令生成ubi镜像ubi.image
ubinize -m 4KiB -p 256KiB ubinize.cfg -o ubi.image
烧写ubi镜像
上一步骤生成的ubi.image可以直接写入flash,这里使用ubiformat工具进行烧写。
- 烧写ubi镜像
ubiformat /dev/mtd3 -y -f ubi.image
- attach
ubiattach -p /dev/mtd3
attach之后会生成新的ubi设备以及ubi卷。
我这里就生成了ubi2,并且根据ubinize.cfg配置文件自动生成了两个卷:my_squashfs和 myubifs.
$ ubinfo -a /dev/ubi2
Volume ID: 0 (on ubi2)
Type: dynamic
Alignment: 1
Size: 1 LEBs (253952 bytes, 248.0 KiB)
State: OK
Name: my_squashfs
Character device major/minor: 506:1
-----------------------------------
Volume ID: 1 (on ubi2)
Type: dynamic
Alignment: 1
Size: 111 LEBs (28188672 bytes, 26.8 MiB)
State: OK
Name: my_ubifs
Character device major/minor: 506:2
挂载
对于ubifs可以直接挂载,使用/dev/ubi2_1挂载即可:
mount -t ubifs /dev/ubi2_1 /test
查看文件系统中的文件如下:
ls /test -l
drwxrwxr-x 2 root root 224 Jun 22 14:00 app
-rw-rw-r-- 1 root root 16 Jun 22 14:00 this_is_ubifs.txt
对于squashfs还需要进一步操作:
- 创建只读块设备
ubiblock工具用于创建或者销毁ubi块设备,使用方法如下:
Usage: ubiblock [-c,-r] <UBI volume node file name>
Example:
ubiblock -c /dev/ubi0_0
ubiblock -r /dev/ubi0_0
基于ubi2_0创建ubi块设备的命令如下:
ubiblock -c /dev/ubi2_0
执行完成后,会在/dev生成ubi块设备文件
# ls /dev/ubiblock2* -l
brw------- 1 root root 252, 1 Jun 22 14:38 /dev/ubiblock2_0
使用上述块设备就可以挂载squashfs了
mount -t squashfs /dev/ubiblock2_0 /test1
查看文件系统中的文件如下:
# ls test1/ -l
drwxrwxr-x 2 root root 30 Jun 22 10:51 apps
-rw-rw-r-- 1 root root 47 Jun 22 13:59 this_is_squashfs.txt
查看挂载信息:
$ mount
/dev/ubi2_1 on /test type ubifs (rw,relatime,assert=read-only,ubi=2,vol=1)
/dev/ubiblock2_0 on /test1 type squashfs (ro,relatime)
参考
边栏推荐
- MySQL converts milliseconds to time string
- Oracle sequence + trigger
- How to transmit and share 4GB large files remotely in real time?
- Educational administration management system (free source code)
- 为什么用葫芦儿派盘取代U盘?
- Build 2022 上开发者最应关注的七大方向主要技术更新
- Continuous breakthrough and steady progress -- Review and Prospect of cross platform development technology of mobile terminal
- 健康照明中应用的LED照明灯
- Don't put your notes and videos everywhere!
- 【医学分割】u2net
猜你喜欢

Continue to learn MySQL

云盘里资料被和谐了,怎么办?

MySQL converts milliseconds to time string

C语言初阶——实现扫雷游戏

boot+jsp的高校社團管理系統(附源碼下載鏈接)

He struggled day and night to protect his data

Dear pie users, I want to confess to you!

健康照明中应用的LED照明灯

uniapp树形层级选择器

Advanced cross platform application development (II): uni app practice
随机推荐
Timer based on LabVIEW
π盘,让您电脑变成个人的私有云
无限水平大理石游戏
College community management system based on boot+jsp (with source code download link)
Fragment upload and breakpoint resume
Data governance: data governance management (Part V)
葫芦儿 APP 使用帮助
excel动态图表
穿越派·派盘 + 思源笔记 = 私人笔记本
Ssm+mysql second-hand trading website (thesis + source code access link)
导数的左右极限和左右导数的辨析
[medical segmentation] u2net
【知识点总结】卡方分布,t分布,F分布
HCM 初学 ( 一 ) - 简介
基于LabVIEW的计时器
码蹄集 - MT3149 · AND - 数据不是很强,暴力剪枝就能骗AC
win10、win11中Elan触摸板滚动方向反转、启动“双指点击打开右键菜单“、“双指滚动“
为了保护自己的数据,他奋斗了一天一夜
Debug details under pycharm
Bat operation FTP upload and download command