如何在ubi之上运行squashfs
在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 文件系统内所有文件的ow

最低0.47元/天 解锁文章
1万+





