• 【文件系统】如何在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
    
    • 1
    • 2

    执行如下命令:根据fs目录创建squashfs,输出的squashfs镜像文件为 squashfs.img

    mksquashfs fs/ squashfs.img -b 256k -nopad -noappend -root-owned -comp xz -processors 1
    
    • 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
    
    • 1
    • 2

    执行如下命令:根据fs目录创建ubifs,输出的ubifs镜像文件为 ubifs.img

    mkfs.ubifs -m 4KiB -e 248KiB -c 128  --space-fixup   --compr=lzo  --squash-uids -r fs -o ubifs.img
    
    • 1

    制作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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    上述配置文件包含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
    
    • 1

    烧写ubi镜像

    上一步骤生成的ubi.image可以直接写入flash,这里使用ubiformat工具进行烧写。

    • 烧写ubi镜像
    ubiformat /dev/mtd3 -y -f ubi.image
    
    • 1
    • attach
    ubiattach -p /dev/mtd3
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    挂载

    对于ubifs可以直接挂载,使用/dev/ubi2_1挂载即可:

    mount -t ubifs /dev/ubi2_1 /test
    
    • 1

    查看文件系统中的文件如下:

    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
    
    • 1
    • 2
    • 3

    对于squashfs还需要进一步操作:

    • 创建只读块设备
      ubiblock 工具用于创建或者销毁ubi块设备,使用方法如下:
    Usage: ubiblock [-c,-r] <UBI volume node file name>
    Example: 
    	ubiblock -c /dev/ubi0_0
    	ubiblock -r /dev/ubi0_0
    
    • 1
    • 2
    • 3
    • 4

    基于ubi2_0创建ubi块设备的命令如下:

    ubiblock -c /dev/ubi2_0
    
    • 1

    执行完成后,会在/dev生成ubi块设备文件

    # ls /dev/ubiblock2* -l
    brw-------    1 root     root      252,   1 Jun 22 14:38 /dev/ubiblock2_0
    
    • 1
    • 2

    使用上述块设备就可以挂载squashfs

    mount -t squashfs /dev/ubiblock2_0 /test1
    
    • 1

    查看文件系统中的文件如下:

    # 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
    
    • 1
    • 2
    • 3

    查看挂载信息:

    $ 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)
    
    • 1
    • 2
    • 3

    参考

  • 相关阅读:
    理解LLMOps: Large Language Model Operations
    MapReduce计算流程
    m基于matlab的DQPSK调制解调技术的仿真
    前端培训丁鹿学堂:es7_es11常用新特性(三)
    Windows11安装Docker做测试环境(第二版)
    变分推断公式推导
    我的十年编程路 2015年篇
    Shell三剑客之sed命令
    【前端】学习前端vue框架MVVM模式
    iVX低代码平台系列详解 --界面功能(一)
  • 原文地址:https://blog.csdn.net/qq_24835087/article/details/125407404