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

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

三个子系统:

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

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

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

下面是这三个子系统的关系图,画图太费时,借用一下牛画好滴~~
UBI文件系统和镜像的制作及分区挂载说明_第1张图片
好了,接下来就可以讲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 defines
                         how many percent better zlib should compress to make
                         mkfs.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 for
                         debugging)
-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的内容,希望对大家有所帮助!

你可能感兴趣的:(linux,linux,UBIFS,nand)