在UBI之上运行squashfs文件是openwrt系统中常见的方式:
由于ubifs是运行在UBI卷之上的文件系统,而squashfs是运行在block device之上的文件系统,二者本来无任何交集,但是UBI提供了能够在ubi卷之上创建只读块设备的特性(R/O block devices on top of UBI volumes),这使得squashfs也能够“运行”在ubi卷之上。
UBI 允许在 UBI 卷上创建只读块设备,该卷适用于只读的、面向块的文件系统,例如 squashfs。
UBI允许在 UBI 卷上创建块设备,但有以下限制:
尽管有这些限制,块设备对于在UBI卷上安装只读的常规文件系统仍然非常有用。以 squashfs 为例,它可以用作 NAND 设备之上的轻量级只读 rootfs。在这种情况下,UBI层将处理低级细节,例如位翻转处理和磨损均衡。
注意:如果不需要运行ubifs,那么只创建一个volume运行squashfs也是可以行的。
下面将以实例演示如何实现在ubi之上运行squashfs:
在进行如下操作之前,需要了解nand flash一些参数。这是我正在使用的nand flash的参数:
制作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
制作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镜像需要用到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个卷:
my_squashfs
;卷的内容取自squashfs.img
;my_ubifs
; 卷的内容取自 ubifs.img
;my_squashfs 卷的类型必须是dynamic,否则后续无法挂载
最后,执行如下命令生成ubi镜像ubi.image
ubinize -m 4KiB -p 256KiB ubinize.cfg -o ubi.image
上一步骤生成的ubi.image
可以直接写入flash,这里使用ubiformat
工具进行烧写。
ubiformat /dev/mtd3 -y -f ubi.image
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)