当前位置:网站首页>【文件系统】如何在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)
参考
边栏推荐
- Chip, an empire built on sand!
- Crossing sect · paipan + Siyuan notes = private notebook
- SystemVerilog学习-06-类的封装
- 2022第八届中国国际“互联网+”大学生创新创业大赛产业命题赛道开启报名!
- OpenGL ES: (4) EGL API详解 (转)
- srpingboot security demo
- Orcle创建用户+角色
- OpenGL ES: (1) OpenGL ES的由来 (转)
- 芯片,建立在沙粒上的帝国!
- Boot + jsp University Community Management System (with source Download Link)
猜你喜欢

excel初级应用案例——杜邦分析仪

He struggled day and night to protect his data

How to transmit and share 4GB large files remotely in real time?

TIDB数据库特性总结

FPGA - 7系列 FPGA内部结构之Clocking -01- 时钟架构概述

Crossing pie · pie pan + Mountain duck = local data management

MySQL converts milliseconds to time string

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

LED lighting used in health lighting

excel动态图表
随机推荐
Ssm+mysql second-hand trading website (thesis + source code access link)
OpenGL es: (2) relationship between OpenGL es, EGL and glsl
In win10 and win11, the scroll direction of Elan touch panel is reversed, and "double finger click to open the right-click menu" and "double finger scroll" are started“
Geoffrey Hinton:我的五十年深度学习生涯与研究心法
千万不要把笔记视频乱放!
Thoughts on a "01 knapsack problem" expansion problem
OpenGL es: (1) origin of OpenGL es (transfer)
Orcle创建用户+角色
2022.6.30-----leetcode. one thousand one hundred and seventy-five
linux 关闭redis 进程 systemd+
葫芦儿 APP 使用帮助
What is the at instruction set often used in the development of IOT devices?
从底层结构开始学习FPGA----RAM IP的定制与测试
TiDB单机模拟部署生产环境集群(闭坑实践,亲测有效)
LeetCode 最大矩形,最大正方形系列 84. 85. 221. 1277. 1725. (单调栈,动态规划)
Oracle sequence + trigger
表格中el-tooltip 实现换行展示
Bat operation FTP upload and download command
健康照明中应用的LED照明灯
FPGA - 7系列 FPGA内部结构之Clocking -01- 时钟架构概述