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
UBI格式的文件系统镜像制作过程如下。
配置Linux内核,使其支持UBI文件系统
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(1960256KiB=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。
(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
命令:cat /proc/partitions
命令:mtd_debug info /dev/mtd6
命令:cd /sys/class/mtd; cd mtd*; ls
命令:cat subpagesize
可以看到子页为4096B,4K。
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制作根文件系统的操作步骤》