欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > windows >内容正文

windows

UBI文件系统和镜像的制作及分区挂载说明

发布时间:2025/3/15 windows 38 豆豆
生活随笔 收集整理的这篇文章主要介绍了 UBI文件系统和镜像的制作及分区挂载说明 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

定义:无排序区块图像文件系统(Unsorted Block Image File System, UBIFS),主要适用于nand flash设备。

三个子系统:

  • UBIFS文件系统
    可以理解为用户层,工作于UBI之上。
    比如我们设备中挂载可见的分区。

    /dev/ubi3_0 22616 3068 19548 14% /data
  • UBI
    是MTD设备的高层次表示,一般用户层也可以在这里做开发定制,比如升级,通过ioctl控制MTD设备的读写。

  • MTD子系统
    提供nand flash底层访问接口。

  • 下面是这三个子系统的关系图,画图太费时,借用一下牛画好滴~~

    好了,接下来就可以讲UBIFS文件系统的制作和镜像的制作,以及分区的挂载了,顺序就是先制作*.ubifs,然后制作*.img,最后mount分区。

    一、UBIFS文件系统制作
    我们先手动通过命令来制作UBIFS

    # mkdir test # ./mkfs.ubifs -r test -m 4096 -e 253952 -c 400 -o my.ubifs

    这两条命令后,就会产生my.ubifs了,mkfs.ubifs工具mtd-utils中会提供,这个大家就想办法自己去弄吧。
    参数说明如下:

    Options: -r, -d, --root=DIR build file system from directory DIR//指定根文件系统目录树的路径 -m, --min-io-size=SIZE minimum I/O unit size //Nand Flash的最小读写单元,一般为page size。 -e, --leb-size=SIZE logical erase block size//逻辑擦除块的大小 -c, --max-leb-cnt=COUNT maximum logical erase block count//逻辑擦除块的个数,与分区大小有关 -o, --output=FILE output to FILE//输出的根文件系统镜像文件 -j, --jrn-size=SIZE journal size -R, --reserved=SIZE how much space should be reserved for the super-user -x, --compr=TYPE compression type - "lzo", "favor_lzo", "zlib" or"none" (default: "lzo") -X, --favor-percent may only be used with favor LZO compression and defineshow many percent better zlib should compress to makemkfs.ubifs use zlib instead of LZO (default 20%) -f, --fanout=NUM fanout NUM (default: 8) -F, --space-fixup file-system free space has to be fixed up on first mount(requires kernel version 3.0 or greater) -k, --keyhash=TYPE key hash type - "r5" or "test" (default: "r5") -p, --orph-lebs=COUNT count of erase blocks for orphans (default: 1) -D, --devtable=FILE use device table FILE -U, --squash-uids squash owners making all files owned by root -l, --log-lebs=COUNT count of erase blocks for the log (used only fordebugging) -v, --verbose verbose operation -V, --version display version information -g, --debug=LEVEL display debug information (0 - none, 1 - statistics,2 - files, 3 - more details) -h, --help display this help text

    这里重点讲一下这个-c 400是怎么得来的,首先我的物理分区大小是100MB
    公式:(10010241024)/ 4096 / 64 = 400
    理论上要给bad block坏块预留点空间,大家制作的时候尽量预留一点出来,-c 指定该分区最大逻辑擦除块数量,该值随着根文件系统分区的大小和该分区的坏块数调整。

    二、UBI镜像的制作
    有了my.ubifs后,就可以使用如下命令制作img镜像了,命令如下:

    # ./ubinize -o my_app.img -m 4096 -p 256KiB ubinize.cfg

    其中ubinize.cfg内容如下:

    [ubifs] mode=ubi image=./my.ubifs vol_id=0 vol_type=dynamic vol_name=rootfs vol_flags=autoresize

    如上,ubinize是mtd-util中提供的,
    “配置文件说明:
    mode=ubi
    image=./my.ubifs 指定mkfs.ubifs制作生成的根文件系统镜像文件路径;
    vol_id=0 指定根文件系统树的卷标为0,u-boot的bootargs参数需要根据它来设置;
    vol_size=xxx指定该UBI逻辑卷的大小,该值计算公式一般为 逻辑擦除块大小逻辑擦除块个数,
    该值一般不用写,默认值是image大小。
    vol_type=dynamic
    vol_name=rootfs 指定UBI卷的名称,u-boot的bootargs参数需要根据它来设置;
    vol_flags=autoresize UBI Subsystem在系统启动时自动调整逻辑擦除块的个数”

    三、ubifs分区的挂载
    有了镜像,在gtp分区表中添加新增的分区配置,我这里是添加了100MB的空间,然后烧录到设备中,那开机的时候需要去挂载新增的分区。
    需要两个步骤完成:
    1、ubiattach
    shell脚本如下,10是dev/mtd10的序号,2是整个ubifs中的第二个序号

    ubiattach -m 10 -d 2 /dev/ubi_ctrl

    2、mount
    将/dev/ubi2_0挂载/data目录,这个2就是上面的第二个参数序号2

    mount -t ubifs -o "rw,nosuid,nodev,noatime" /dev/ubi2_0 /data

    最终的开机效果:

    /dev/ubi2_0 79284 24 79260 0% /data

    四、分区的读写
    最后我还想讲一下如何在用户层对这个/dev/ubi2_0进行读写操作,比如OTA
    Nand flash设备和eMMC的有些不同,需要先erase后write,不然数据是不会成功的。

    这里提供一下最终的几个系统调用,这些是kernel提供给上层的操作接口。

    ioctl(dev_fd, MEMGETINFO, &meminfo); 查询 ioctl(dev_fd, MEMGETBADBLOCK, &offset); 判断是否有坏块 ioctl(dev_fd, MEMERASE, &erase);erase擦除 写入的话,直接write到指定的fd就可以了

    好了,以上就是整理的nand相关的ubifs的内容,希望对大家有所帮助!

    总结

    以上是生活随笔为你收集整理的UBI文件系统和镜像的制作及分区挂载说明的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。