当前位置:网站首页>【文件系统】如何在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)
参考
边栏推荐
- 【笔记】电商订单数据分析实战
- How to add a gourd pie plate
- HCM 初学 ( 二 ) - 信息类型
- Learn the customization and testing of fpga---ram IP from the bottom structure
- [QT] QT after addition, subtraction, multiplication and division, two decimal places are reserved
- 导数的左右极限和左右导数的辨析
- Idea start view project port
- Advanced drawing skills of Excel lecture 100 (1) - use Gantt chart to show the progress of the project
- OpenGL ES: (3) EGL、EGL绘图的基本步骤、EGLSurface、ANativeWindow
- Crossing pie · pie pan + Mountain duck = local data management
猜你喜欢

FPGA - 7系列 FPGA内部结构之Clocking -02- 时钟布线资源

C language beginner level - realize the minesweeping game

uniapp树形层级选择器

Huluer app help

Call us special providers of personal cloud services for College Students

从MLPerf谈起:如何引领AI加速器的下一波浪潮

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

It's not that you have a bad mind, but that you haven't found the right tool

Leetcode Max rectangle, Max square series 84 85. 221. 1277. 1725. (monotonic stack, dynamic programming)

Continue to learn MySQL
随机推荐
Oracle sequence + trigger
码蹄集 - MT3149 · AND - 数据不是很强,暴力剪枝就能骗AC
论文学习记录随笔 多标签之LIFT
OpenGL es: (2) relationship between OpenGL es, EGL and glsl
Oracle create user + Role
Enter an expression (expressed as a string) and find the value of this expression.
1034 Head of a Gang
OpenGL ES: (3) EGL、EGL绘图的基本步骤、EGLSurface、ANativeWindow
MySQL数据迁移遇到的一些错误
穿越派 你的数据云行
关于一道01背包问题的·拓展题的思考
Leetcode Max rectangle, Max square series 84 85. 221. 1277. 1725. (monotonic stack, dynamic programming)
el-table 动态表头渲染 固定第一列 高度问题
葫芦儿 APP 使用帮助
LeetCode 最大矩形,最大正方形系列 84. 85. 221. 1277. 1725. (单调栈,动态规划)
excel可视化
PLA不粘贴在床上:6个简单的解决方案
LED lighting used in health lighting
论文学习记录随笔 多标签之GLOCAL
OpenGL es: (3) EGL, basic steps of EGL drawing, eglsurface, anativewindow