【UBI文件系统制作】-(3)制作UBI文件系统镜像


UBI文件系统制作系列文章:

【UBI文件系统制作】-(1)UBI文件系统简介
https://blog.csdn.net/weixin_40407893/article/details/101214434
【UBI文件系统制作】-(2)Busybox制作根文件系统
https://blog.csdn.net/weixin_40407893/article/details/101214693


    

3.2 制作UBI文件系统镜像

    UBI格式的文件系统镜像制作过程如下。

     配置Linux内核,使其支持UBI文件系统

  1. Device Drivers —>Memory Technology Device (MTD) support —>UBI - Unsorted block images —>Enable UBI;
  2. File systems —>Miscellaneous filesystems —>UBIFS file system support。

     Ubuntu系统安装mkfs.ubifs和ubinize工具

    以Ubuntu 16.04 LTS为例,在系统下使用命令 sudo apt-get install mtd-utils 安装工具,安装后就可以使用mkfs.ubifs和ubinize工具制作UBI文件系统镜像文件了。

     制作ubifs格式的根文件系统镜像

    使用mkfs.ubifs命令将某个文件夹制作为UBIFS镜像。

mkfs.ubifs的用法:

Usage: mkfs.ubifs [OPTIONS] target
Make a UBIFS file system image from an existing directory tree
Examples:
Build file system from directory /opt/img, writting the result in the ubifs.img file
mkfs.ubifs -m 512 -e 128KiB -c 100 -r /opt/img ubifs.img
The same, but writting directly to an UBI volume
mkfs.ubifs -r /opt/img /dev/ubi0_0
Creating an empty UBIFS filesystem on an UBI volume
mkfs.ubifs /dev/ubi0_0
Options:
-r, -d, --root=DIR build file system from directory DIR
-m, --min-io-size=SIZE minimum I/O unit 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 moun
(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

    例:

    命令:
    mkfs.ubifs -r ./rootfs -m 4096 -e 253952 -c 1960 -o rootfs.arm.ubifs
    说明:
    以上命令的含义为将当前目录下/rootfs文件夹制作为UBI文件系统镜像,输出的镜像名为rootfs.arm.ubifs。

     -m最小输入输出大小为4KiB(4096bytes),一般为页大小;
     -e逻辑可擦除块大小为248KiB=(每块的页数-2)*页大小=(64-2)4KiB=248KiB。每块的大小为256K,每块分为64页,每页4K。通过查看该Flash的子页(sub-page size)大小为4K,说明该Flash不支持子页,UBI 把EC header放在偏移量为4096的物理位置,接着把VID header放在下一页,所以逻辑块的大小就是256K-8K=248K,转化成十进制就是253952。
     -c最多逻辑可擦除块数目为1960(1960
256KiB=490MiB),这个可根据ubi volume来设置,实际上是设置此卷的最大容量。
     -o 表示output file。

    使用ubinize命令将使用mkfs.ubifs命令制作的UBI文件系统镜像转换成可直接在Flash上烧写的格式(带有UBI文件系统镜像卷标)。

ubinize的用法:

Usage: ubinize [-o filename] [-p ] [-m ] [-s ] [-O ] [-e
][-x ] [-Q ] [-v] [-h] [-V] [–output=]
[–peb-size=] [–min-io-size=] [–sub-page-size=]
[–vid-hdr-offset=] [–erase-counter=] [–ubi-ver=]
[–image-seq=] [–verbose] [–help] [–version] ini-file
Example: ubinize -o ubi.img -p 16KiB -m 512 -s 256 cfg.ini - create UBI image
‘ubi.img’ as described by configuration file ‘cfg.ini’
-o, --output= output file name
-p, --peb-size= size of the physical eraseblock of the Flash
this UBI image is created for in bytes,
kilobytes (KiB), or megabytes (MiB)
(mandatory parameter)物理可擦出块大小
-m, --min-io-size= minimum input/output unit size of the Flash
in bytes
-s, --sub-page-size= minimum input/output unit used for UBI
headers, e.g. sub-page size in case of NAND
Flash (equivalent to the minimum input/output
unit size by default)子页大小
-O, --vid-hdr-offset= offset if the VID header from start of the
physical eraseblock (default is the next
minimum I/O unit or sub-page after the EC
header)VID头部偏移量,默认是512
-e, --erase-counter= the erase counter value to put to EC headers (default is 0)
-x, --ubi-ver= UBI version number to put to EC headers (default is 1)
-Q, --image-seq= 32-bit UBI image sequence number to use
(by default a random number is picked)
-v, --verbose be verbose
-h, --help print help message
-V, --version print program version

    例:

    命令:
    ubinize -o atmel-xplained-demo-image-sama5d4-xplained.ubi -m 4096 -p 256KiB -s 4096 ubinize.cfg

    说明:
    以上命令的含义为使用ubinize命令将使用mkfs.ubifs命令制作的UBI文件系统镜像(rootfs.arm.ubifs)转换成可直接在Flash上烧写的格式(atmel-xplained-demo-image-sama5d4-xplained.ubi)。
     -m最小输入输出大小为4KiB(4096bytes),一般为页大小;
     -p物理可擦除块大小为256KiB。即每块的大小为256KiB;
     -s 表示sub-page-size,该Flash不支持子页,这里为页大小4 KiB。
     -o 表示output file。

    ubinize.cfg为参数配置文件:

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

    说明:
     vol_id 表示volume的编号,一个ubi设备中可以有多个volume。(这种情况下,/dev下会出现 ubi0 和 ubi0_0);
     vol_size 表示ubi0_0的大小,即volume0的大小,此处没有加该参数,会默认使用最小size。
     vol_type 表示volume0的类型,分为dynamic和static两种,其中dynamic类型的设备表示可以读写,static类型的设备表示只读;
     vol_name 表示volume0的名称,在挂载ubi分区是会使用到,如在bootargs中的root=ubi0:rootfs。

    下图是配置文件的官方说明。
【UBI文件系统制作】-(3)制作UBI文件系统镜像_第1张图片

4 注意事项

(1)在制作UBI镜像时,需要首先确定以下几个参数:

     MTD partition size; //对应的Flash分区大小;
     Flash physical eraseblock size; // Flash物理擦除块大小;
     minimum Flash input/output unit size; //最小的Flash输入输出单元大小;
     for NAND Flashes - sub-page size; //对于NAND Flash来说,子页大小;
     logical eraseblock size.//逻辑擦除块大小;

(2)参数可以由几种方式得到:

    1)如果使用的是2.6.30以后的内核,这些信息可以通过工具从内核获得,如:
    mtdinfo –a ,查看全部分区信息;
    mtdinfo /dev/mtd0 –u ,查看mtd0的信息。
    具体的命令使用帮助命令:mtdinfo –h。

    2)之前的内核可以通过以下方法:
    ● MTD partition size:从内核的分区表或cat /proc/mtd获得;
    ● Flash physical eraseblock size:从Flash芯片手册中可以得到Flash物理擦除块大小,或cat /proc/mtd;
    ● minimum Flash input/output unit size:nor Flash通常是1个字节;NAND falsh是一个页面;
    ● sub-page size:通过Flash手册获得;
    ● logical eraseblock size:对于有子页的NAND Flash来说,等于“物理擦除块大小-1页的大小”。

    (3)查看mtd设备分区的相关命令
     命令:cat /proc/mtd
    【UBI文件系统制作】-(3)制作UBI文件系统镜像_第2张图片
     命令:cat /proc/partitions
    【UBI文件系统制作】-(3)制作UBI文件系统镜像_第3张图片
     命令:mtd_debug info /dev/mtd6【UBI文件系统制作】-(3)制作UBI文件系统镜像_第4张图片
     命令:cd /sys/class/mtd; cd mtd*; ls
5
    命令:cat subpagesize
6
    可以看到子页为4096B,4K。

    

5 参考资料

    1) https://blog.csdn.net/looooooooop/article/details/8119881
《最小 Flash I/O单元 与 NAND Flash 子页》

    2) https://blog.csdn.net/dragon101788/article/details/17097103
《UBI文件系统简介 与 利用mkfs.ubifs和ubinize两个工具制作UBI镜像》

    3) https://blog.csdn.net/wjjontheway/article/details/8977871
《UBI文件系统和mkfs.ubifs以及ubinize工具的用法》

    4) https://www.cnblogs.com/pengdonglin137/p/3402620.html
《使用ubifs格式的根文件系统—过程记录》

    5) https://blog.csdn.net/guoyiyan1987/article/details/80243324
《如何使用busybox编译和生成最简linux根文件系统(rootfs)》

    6) https://blog.csdn.net/oqqHuTu12345678/article/details/72518167
《使用BusyBox制作根文件系统的操作步骤》

你可能感兴趣的:(嵌入式Linux驱动开发,文件系统,Linux,UBI)