AM335x的Linux下MTD制作ubifs镜像
如何使用mtd工具制作ubifs镜像,这个的制作参数是有区别的,要根据具体的NandFlash的不同的而不同。
首先分析一下NandFlash,以三星的nand 256MB的 K9F2G08U0M为例子
页写大小 2KB
块擦除大小 64页=128KB
一个设备2048块 =2112Mbits
Physical Erase Block (PEB) 物理块
Logical Erase Block (LEB) 逻辑块,实际可用的
UBIFS镜像制作第一步:
mkfs.ubifs/mkfs.ubifs -r filesystem/ -F -o ubifs.img -m 2048 -e 126976 -c 1580
-m 2KiB (or 2048) 页大小
-e 124KiB (or 126976) 擦除块大小
Erase Block Size: UBI需要至少两个的IO页单元,在每个逻辑块PEB中,用来做overhead ,1个用来保存擦除个数信息,1个用来保存Volume ID信息。因为PEB是128KB大小,所以留下来可用的逻辑块是(64Block-2Block)*2KB=124KB.
-c 1580
最大的LEB个数,请看下面的计算。
-r filesystem
制定需要打包的文件系统
-F
指示在第一mount的过程中,填充空闲空间 (http://www.linux-mtd.infradead.org/faq/ubifs.html#L_free_space_fixup)
-o ubifs.img
输出文件名
mtd-utils# ubi-utils/ubinize -o ubi.img -m 2048 -p 128KiB -s 512 -O 2048 ubinize.cfg
• 创建 ubinize.cfg文件并写下面的内容到这个文件中
mtd-utils# vi ubinize.cfg
[ubifs] <== Section header 首部
mode=ubi <== Volume mode (other option is static)卷格式
image=ubifs.img <== Source image 源镜像
vol_id=0 <== Volume ID in UBI image 卷ID
vol_size=192MiB <== Volume size 卷大小
vol_type=dynamic <== Allow for dynamic resize 动态重新分配
vol_name=rootfs <== Volume name 卷名字
vol_flags=autoresize <== Autoresize volume at first mount 第一次自动重定义大小
Where:
-o ubi.img
输出文件
-m 2KiB (or 2048)
页大小
-p 128KiB
物理逻辑块大小
-O 2048 如果VID首部在物理逻辑块首部时候的偏移。
在这个命令输出之后,产生的'ubi.img'就是我们需要的镜像了
具体UBI计算:
可以使用的大小计算
UBI保留了一些block用来管理坏块PEB。
2 PEBs 用来存储UBI卷表 UBI volume table
1 PEB 保留用来 wear-leveling purposes;
1 PEB 保留用来 atomic LEB change operation;
a % of PEBs 保留来处理坏块. 默认 for NAND is 1%
UBI 存储擦除计数 (EC) and 卷ID volume ID (VID) 这两个页在每个块 PEB的首部.
Symbol | Meaning | Value for XO test case |
SP | PEB Size 物理块大小 | 128KiB |
SL | LEB Size 逻辑块大小 | 128KiB - 2 * 2KiB = 124 KiB |
P | MTD设备总的块个数 | 200MiB / 128KiB = 1600 |
B | 保留用来处理坏块的block个数 | 1% of P = 16 |
O | 用来存储 EC and VID headers 字节数 i.e. O = SP - SL | 4KiB |
UBI Overhead用掉了多少 = (B + 4) * SP + O * (P - B - 4)
= (16 + 4) * 128Kib + 4 KiB * (1600 - 16 - 4)
= 8880 KiB
= 69.375 PEBs (round to 69)
(B + 4) * SP 是处理坏块+保留给UBI系统用的4个block,然后乘上PEB的大小
O * (P - B - 4) 每个block占据4KiB的大小造成的空间浪费
所以只剩下1600-69=1531 PEBs or 195968KiB 可以用来存储数据
为什么在mkfs.ubifs的时候使用"-c 1580",因为这里c指的是最大文件系统块的个数,这里我们是按照LEB大小时124KiB计算的,不是按照PEB的大小128KiB计算的。 195968KiB / 124 Kib = 1580.39 (round to 1580).
卷大小Volume size = 195968KiB (~192MiB)
维芯科 AM335x核心板:https://www.weathink.cn/products/hexinban/2.html