【文件系统】如何在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层将处理低级细节,例如位翻转处理和磨损均衡。

实现原理

在这里插入图片描述

  1. 基于任意MTD设备,attach之后创建2个UBI卷(volume0和volume1)
  2. 将squashfs镜像存入volume0,将ubifs镜像存入volume 1
  3. 基于volume0 创建 ubi block device,使用该block device 挂载 squashfs
  4. 使用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

制作ubifs需要用到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_squashfsmyubifs.

$ 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)

参考

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值