AM335x的Linux下MTD制作ubifs镜像

如何使用mtd工具制作ubifs镜像,这个的制作参数是有区别的,要根据具体的NandFlash的不同的而不同。

首先分析一下NandFlash,以三星的nand 256MB的 K9F2G08U0M为例子

1111.png

页写大小 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



作者:nmy@weathink.com
版权:本文版权归作者和维芯科共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任


Tags: Array