arobot存储开发指南之ubifs使用
前言
概述
本文档主要介绍Linux ubi/ubifs子系统的使用方法。
修订记录
日期 | 作者 | 版本 | 修改说明 |
---|---|---|---|
2023.10.10 | 枫潇潇 | V1.0.0 | 初始版本 |
kernel配置ubi/ubifs
ubi子系统配置
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<*> Enable UBI - Unsorted block images --->
--- Enable UBI - Unsorted block images
(4096) UBI wear-leveling threshold
(20) Maximum expected bad eraseblock count per 1024 eraseblocks
[*] UBI Fastmap (Experimental feature)
< > MTD devices emulation driver (gluebi)
[*] Read-only block devices on top of UBI volumes
ubifs子系统配置
File systems --->
[*] Miscellaneous filesystems --->
<*> UBIFS file system support
[*] Advanced compression options
[*] LZO compression support
[*] ZLIB compression support
[ ] Access time support
[*] UBIFS XATTR support
[ ] UBIFS Encryption
主要配置项:
CONFIG_MTD_UBI=y
CONFIG_MTD_UBI_FASTMAP=y
CONFIG_MTD_UBI_BLOCK=y
CONFIG_UBIFS_FS=y
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
CONFIG_UBIFS_FS_XATTR=y
CONFIG_UBIFS_FS_SECURITY=y
配置项 | 描述 |
---|---|
CONFIG_MTD_UBI_WL_THRESHOLD | 磨损平衡阈值,即最大与最小擦除计数值的差值,默认值:4096。对于寿命比较短的MLC 器件,此值应该配置相对小一点,比如256。 |
CONFIG_MTD_UBI_BEB_LIMIT | 指定UBI在MTD设备上期望的最大坏物理擦除块数(每1024擦除块),默认值:20 |
CONFIG_MTD_UBI_GLUEBI | UBI 卷的基础上模拟 MTD 设备,选择此选项,当创建一个卷时,UBI 将同时模拟一个 MTD 设备。除非您使用传统的软件,否则请不要启用此选项。 |
CONFIG_MTD_UBI_BLOCK | 启用只读UBI块设备支持。 |
mtd-utils工具使用方法
mifs.ubifs——制作ubifs
$ mkfs.ubifs -h
用法:mkfs.ubifs [OPTIONS] 目标
从现有目录树制作 UBIFS 文件系统映像
例子:
从/opt/img目录构建文件系统,将结果写入ubifs.img文件
mkfs.ubifs -m 512 -e 128KiB -c 100 -r /opt/img ubifs.img
相同,但直接写入 UBI 卷
mkfs.ubifs -r /opt/img /dev/ubi0_0
在 UBI 卷上创建一个空的 UBIFS 文件系统
mkfs.ubifs /dev/ubi0_0
选项:
-r, -d, --root=DIR 从目录 DIR 构建文件系统
-m, --min-io-size=SIZE 最小 I/O 单元大小
-e, --leb-size=SIZE 逻辑擦除块大小
-c, --max-leb-cnt=COUNT 最大逻辑擦除块数
-o, --output=FILE 输出到 FILE
-j, --jrn-size=SIZE 日志大小
-R, --reserved=SIZE 应该为超级用户保留多少空间
-x, --compr=TYPE 压缩类型 - "lzo", "favor_lzo", "zlib" 或
“无”(默认值:“lzo”)
-X, --favor-percent 只能与偏爱 LZO 压缩一起使用并定义
zlib 应该压缩多少百分比才能使
mkfs.ubifs 使用 zlib 而不是 LZO(默认 20%)
-f, --fanout=NUM 扇出 NUM(默认值:8)
-F, --space-fixup 文件系统可用空间必须在第一次挂载时修复
(需要内核版本 3.0 或更高版本)
-k, --keyhash=TYPE 键哈希类型 - "r5" 或 "test" (默认: "r5")
-p, --orph-lebs=COUNT 个孤儿擦除块计数(默认值:1)
-D, --devtable=FILE 使用设备表文件
-U, --squash-uids 压缩所有者使所有文件归 root 所有
-l, --log-lebs=日志的擦除块计数(仅用于 调试)
-y, --yes 假设所有问题的答案都是“是”
-v, --verbose 详细操作
-V, --version 显示版本信息
-g, --debug=LEVEL 显示调试信息(0 - 无,1 - 统计,2 - 文件,3 - 更多细节)
-a, --set-inum-attr 在文件上创建 user.image-inode-number 扩展属性
添加到图像中。该属性将包含 inode
文件在生成的图像中的编号。
-h, --help 显示此帮助文本
请注意,SIZE 以字节为单位指定,但如果使用 KiB、MiB 或 GiB 后缀,也可以以千字节、兆字节和千兆字节为单位指定。
如果您指定“lzo”或“zlib”压缩器,mkfs.ubifs 将使用此压缩器处理所有数据。 “none”禁用任何数据压缩。 “favor_lzo”并不是真正的独立压缩器。它只是结合“lzo”和“zlib”压缩器的一种方法。即,mkfs.ubifs 尝试使用“lzo”和“zlib”压缩器来压缩数据,然后比较哪个压缩器更好。如果“zlib”比“lzo”压缩 20% 或更多,则 mkfs.ubifs 选择“lzo”,否则选择“zlib”。 “--favor-percent”可以指定任意阈值而不是默认的 20%。
-F 参数用于设置超级块中的“修复可用空间”标志,这会强制 UBIFS“修复”它将要使用的所有可用空间。这个选项对于解决双空闲空间编程的问题很有用:如果闪存 UBI 映像的 flasher 程序无法跳过仅包含 0xFF 字节的 NAND 页,结果是某些 NAND 页被写入两次 - 第一次当刷入图像时和第二次安装 UBIFS 并在那里写入有用的数据时。不过,一个适当的 UBI 感知闪存应该跳过这样的 NAND 页面。注意,这个标志可能会使第一次挂载很慢,因为“空闲空间修复”过程需要时间。从 3.0 版开始,Linux 内核支持此功能。
在页大小为2KByte,块大小为128KByte,128MByte大小的spinand设备上如何制作一个ubifs文件系统?
示例一:
mkfs.ubifs -x lzo -m 2048 -e 126976 -c 1000 -r ./rootfs -o rootfs-ubifs.img
示例二:
mkfs.ubifs -F -m 2KiB -e 124KiB -c 1000 -r ./rootfs -o rootfs-ubifs.img
参数解析:
-r:待制作的文件系统原目录。
-o:输出的image名字 。
-F:使能“white-space-fixup”,如果是通过u-boot烧写需要使能此功能。
-m:Nand Flash的最小读写单元,一般为page size。
-e:LEB size,说的是逻辑擦除块大小,大家知道nand flash页读页写块擦,一个设备多个块,一个块多个页,一般也都是一个块是64个页,这样算一下无论擦除块大小就是2048 * 64=131072=128KByte,-e的算法是物理擦除块大小 -2 * 页大小(block size - 2 x page_size),这里就是131072 - 2 * 2048 = 126976 = 128KByte - 2 * 2KByte = 124KByte
-c:说的是最大逻辑块数量,这个很重要,不能大也不能小,最小也要大于image大小,太大mount有问题。
计算起点是分区的物理块数量,比如128MiB的mtd分区,物理块数量是 128MiB / 128KiB = 1024 个,需要减去2个坏块保留块,减去1个wear-leveling块,还要减去1个eba的块等等,然后再容忍20个block用于坏块备份,则最终的值是1000。
注意,如果物理上这个分区有坏块的话,kernel会扫描到的,这时候,我们计算的这个值就要减去坏块数了,否则会有逻辑块大于物理块数的内核问题mount失败,确切知道坏块数是比较困难的,一般做法是做一个坏块容忍数,比如20个,这样我们再减去20个坏块,不要担心这个会浪费空间,ubinize的autoresize选项就是解决这个问题的。具体的这个值需要计算。!!!!
-x:说的是压缩方法,默认是lzo,还支持zlib,zlib压缩率高些,但是lzo压缩解压速度快 。
ubinize——制作ubi镜像
$ ubinize -h
用法:ubinize [options] <ini-file>
生成 UBI 图像。一个 UBI 映像可能包含一个或多个 UBI 卷,这些卷必须在输入配置 ini 文件中定义。 Flash 特性是通过命令行选项定义的。
-o, --output=<文件名> 输出文件名
-p, --peb-size=<bytes> 闪存物理擦除块的大小
这个 UBI 图像是以字节为单位创建的,
千字节 (KiB) 或兆字节 (MiB)
(必填参数)
-m, --min-io-size=<bytes> 闪存的最小输入/输出单元大小
以字节为单位
-s, --sub-page-size=<bytes> 用于 UBI 的最小输入/输出单位
标题,例如NAND 情况下的子页面大小
flash(相当于最小输入/输出
默认单位大小)
-O, --vid-hdr-offset=<num> 偏移,如果 VID 头从开始
物理擦除块(默认是下一个
EC 后的最小 I/O 单元或子页面
标题)
-e, --erase-counter=<num> 要放入 EC 标头的擦除计数器值
(默认为 0)
-x, --ubi-ver=<num> 要放入 EC 标头的 UBI 版本号
(默认为 1)
-Q, --image-seq=<num> 要使用的 32 位 UBI 图像序列号
(默认选择随机数)
-v, --verbose 详细
-h, --help 打印帮助信息
-V, --version 打印程序版本
有关更多信息,请参阅`man 8 ubinize`
示例:
ubinize -o rootfs-ubifs.ubi -m 2048 -p 131072 ubinize.cfg
或者
ubinize -o rootfs-ubifs.ubi -m 2KiB -p 128KiB ubinize.cfg
参数说明:
-o:输出image
-m:页大小
-p:物理擦除块大小
单卷ubinize.cfg配置参数如下:
[ubifs]
mode=ubi
image=rootfs-ubifs.img #说的是mkfs.ubifs的结果
vol_id=0
vol_size=120MiB #说的是volume大小,用 LEB_SIZE 和 LEBS 的值做乘法计算,一般不用写,autoresize会自动根据mtd分区大小适应,默认值是image大小,写了这个作用是帮助检查image是否超过了分区限制,制作时候就提示,否则mount会出错。-c的值是经过计算的最大值了,不过autoresize参数会自适应大小,不会浪费空间的。
vol_type=dynamic
vol_alignment=1
vol_name=rootfs #卷名
vol_flags=autoresize
多卷ubinize.cfg配置参数如下:
FLASH_TOTAL_SIZE=0x10000000 #256MiB
FLASH_BLOCK_SIZE=0x20000 #128KiB
FLASH_PAGE_SIZE=0x800 #2KiB
UBI_LIO_SIZE=$[${FLASH_PAGE_SIZE}]
UBI_LEB_SIZE=$[${FLASH_BLOCK_SIZE}-2*${FLASH_PAGE_SIZE}]
UBI_PEB_SIZE=$[${FLASH_BLOCK_SIZE}]
UBI_BEB_LIMIT_PER1024=20
PART_SIZE_ROOTFS=0x600000 #6MiB
PART_SIZE_FIRMWARE=0x2000000 #32MiB
PART_SIZE_DATA=0x2000000 #32MiB
PART_SIZE_USER=0x2000000 #32MiB
#UBI_RESERVED_PEBS_ROOTFS=$[${PART_SIZE_ROOTFS}/${FLASH_BLOCK_SIZE}*${UBI_BEB_LIMIT_PER1024}/1024+4]
#UBI_RESERVED_PEBS_FIRMWARE=$[${PART_SIZE_FIRMWARE}/${FLASH_BLOCK_SIZE}*${UBI_BEB_LIMIT_PER1024}/1024+4]
#UBI_RESERVED_PEBS_DATA=$[${PART_SIZE_DATA}/${FLASH_BLOCK_SIZE}*${UBI_BEB_LIMIT_PER1024}/1024+4]
#UBI_RESERVED_PEBS_USER=$[${PART_SIZE_USER}/${FLASH_BLOCK_SIZE}*${UBI_BEB_LIMIT_PER1024}/1024+4]
UBI_RESERVED_PEBS_ROOTFS=8
UBI_RESERVED_PEBS_FIRMWARE=16
UBI_RESERVED_PEBS_DATA=16
UBI_RESERVED_PEBS_USER=16
UBI_VOL_ROOTFS_LEBS=$[${PART_SIZE_ROOTFS}/${FLASH_BLOCK_SIZE}-${UBI_RESERVED_PEBS_ROOTFS}]
UBI_VOL_ROOTFS_SIZE=$[${UBI_LEB_SIZE}*${UBI_VOL_ROOTFS_LEBS}]
UBI_VOL_FIRMWARE_LEBS=$[${PART_SIZE_FIRMWARE}/${FLASH_BLOCK_SIZE}-${UBI_RESERVED_PEBS_FIRMWARE}]
UBI_VOL_FIRMWARE_SIZE=$[${UBI_LEB_SIZE}*${UBI_VOL_FIRMWARE_LEBS}]
UBI_VOL_DATA_LEBS=$[${PART_SIZE_DATA}/${FLASH_BLOCK_SIZE}-${UBI_RESERVED_PEBS_DATA}]
UBI_VOL_DATA_SIZE=$[${UBI_LEB_SIZE}*${UBI_VOL_DATA_LEBS}]
UBI_VOL_USER_LEBS=$[${PART_SIZE_USER}/${FLASH_BLOCK_SIZE}-${UBI_RESERVED_PEBS_USER}]
UBI_VOL_USER_SIZE=$[${UBI_LEB_SIZE}*${UBI_VOL_USER_LEBS}]
[rootfs]
mode=ubi
image=./rootfs.squashfs
vol_id=0
vol_size=${UBI_VOL_ROOTFS_SIZE}
vol_type=static
vol_name=rootfs
vol_alignment=1
[firmware]
mode=ubi
image=./firmware.ubifs
vol_id=1
vol_size=${UBI_VOL_FIRMWARE_SIZE}
vol_type=dynamic
vol_name=firmware
vol_alignment=1
[data]
mode=ubi
image=./data.ubifs
vol_id=2
vol_size=${UBI_VOL_DATA_SIZE}
vol_type=dynamic
vol_name=data
vol_alignment=1
[user]
mode=ubi
image=./user.ubifs
vol_id=3
vol_size=${UBI_VOL_USER_SIZE}
vol_type=dynamic
vol_name=user
vol_alignment=1
vol_flags=autoresize
备注:ubinize.cfg 文件应该是unix格式。还要确保文件末尾有一个空行。
ubiformat——格式化mtd设备
将一个mtd设备格式化为ubi镜像,使用默认参数即可,其将根据mtd的IO属性进行相关的格式化操作。
# ubiformat -h
ubiformat version 2.1.5 - a tool to format MTD devices and flash UBI images
Usage: ubiformat <MTD device node file name> [-s <bytes>] [-O <offs>] [-n]
[-Q <num>] [-f <file>] [-S <bytes>] [-e <value>] [-x <num>] [-y] [-q] [-v] [-h]
[--sub-page-size=<bytes>] [--vid-hdr-offset=<offs>] [--no-volume-table]
[--flash-image=<file>] [--image-size=<bytes>] [--erase-counter=<value>]
[--image-seq=<num>] [--ubi-ver=<num>] [--yes] [--quiet] [--verbose]
[--help] [--version]
Example 1: ubiformat /dev/mtd0 -y - format MTD device number 0 and do
not ask questions.
Example 2: ubiformat /dev/mtd0 -q -e 0 - format MTD device number 0,
be quiet and force erase counter value 0.
-s, --sub-page-size=<bytes> 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=<offs> 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)
-f, --flash-image=<file> flash image file, or '-' for stdin
-S, --image-size=<bytes> bytes in input, if not reading from file
-e, --erase-counter=<value> use <value> as the erase counter value for all
eraseblocks
-x, --ubi-ver=<num> UBI version number to put to EC headers
(default is 1)
-Q, --image-seq=<num> 32-bit UBI image sequence number to use
(by default a random number is picked)
-y, --yes assume the answer is "yes" for all question
this program would otherwise ask
-q, --quiet suppress progress percentage information
-v, --verbose be verbose
-h, -?, --help print help message
-V, --version print program version
示例如下:
# ubiformat /dev/mtd8
ubiformat: mtd8 (nand), size 41943040 bytes (40.0 MiB), 320 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
libscan: scanning eraseblock 319 -- 100 % complete
ubiformat: 318 eraseblocks have valid erase counter, mean value is 2
ubiformat: 2 bad eraseblocks found, numbers: 45, 184
ubiformat: formatting eraseblock 319 -- 100 % complete
ubiattach——绑定mtd设备
# ubiattach -h
ubiattach version 2.1.5 - a tool to attach MTD device to UBI.
Usage: ubiattach [<UBI control device node file name>]
[-m <MTD device number>] [-d <UBI device number>] [-p <path to device>]
[--mtdn=<MTD device number>] [--devn=<UBI device number>]
[--dev-path=<path to device>]
[--max-beb-per1024=<maximum bad block number per 1024 blocks>]
UBI control device defaults to /dev/ubi_ctrl if not supplied.
Example 1: ubiattach -p /dev/mtd0 - attach /dev/mtd0 to UBI
Example 2: ubiattach -m 0 - attach MTD device 0 (mtd0) to UBI
Example 3: ubiattach -m 0 -d 3 - attach MTD device 0 (mtd0) to UBI
and create UBI device number 3 (ubi3)
Example 4: ubiattach -m 1 -b 25 - attach /dev/mtd1 to UBI and reserve
25*C/1024 eraseblocks for bad block handling, where C is the flash
is total flash chip eraseblocks count, that is flash chip size in
eraseblocks (including bad eraseblocks). E.g., if the flash chip
has 4096 PEBs, 100 will be reserved.
-d, --devn=<number> the number to assign to the newly created UBI device
(assigned automatically if this is not specified)
-p, --dev-path=<path> path to MTD device node to attach
-m, --mtdn=<number> MTD device number to attach (alternative method, e.g
if the character device node does not exist)
-O, --vid-hdr-offset VID header offset (do not specify this unless you really
know what you are doing, the default should be optimal)
-b, --max-beb-per1024 maximum expected bad block number per 1024 eraseblock.
The default value is correct for most NAND devices.
Allowed range is 0-768, 0 means the default kernel value.
-h, --help print help message
-V, --version print program version
将mtd8绑定到ubi1中,并预留20blocks用于坏块备份,示例如下:
# ubiattach -p /dev/mtd8 -d 1 -b 20
[ 1754.399078] ubi1: default fastmap pool size: 15
[ 1754.403664] ubi1: default fastmap WL pool size: 7
[ 1754.408430] ubi1: attaching mtd8
[ 1754.672594] ubi1: scanning is finished
[ 1754.686586] ubi1: attached mtd8 (name "firmware", size 40 MiB)
[ 1754.692541] ubi1: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
[ 1754.699491] ubi1: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
[ 1754.706329] ubi1: VID header offset: 2048 (aligned 2048), data offset: 4096
[ 1754.713347] ubi1: good PEBs: 318, bad PEBs: 2, corrupted PEBs: 0
[ 1754.719394] ubi1: user volume: 0, internal volumes: 1, max. volumes count: 128
[ 1754.726671] ubi1: max/mean erase counter: 160/160, WL threshold: 4096, image sequence number: 505250580
[ 1754.736104] ubi1: available PEBs: 294, total reserved PEBs: 24, PEBs reserved for bad PEB handling: 18
[ 1754.745546] ubi1: background thread "ubi_bgt1d" started, PID 210
UBI device number 1, total 318 LEBs (40378368 bytes, 38.5 MiB), available 294 LEBs (37330944 bytes, 35.6 MiB), LEB size 126976 bytes (124.0 KiB)
ubimkvol——创建一个ubifs卷
# ubimkvol -h
ubimkvol version 2.1.5 - a tool to create UBI volumes.
Usage: ubimkvol <UBI device node file name> [-h] [-a <alignment>] [-n <volume ID>] [-N <name>]
[-s <bytes>] [-S <LEBs>] [-t <static|dynamic>] [-V] [-m] [-k]
[--alignment=<alignment>][--vol_id=<volume ID>] [--name=<name>]
[--size=<bytes>] [--lebs=<LEBs>] [--type=<static|dynamic>] [--help]
[--version] [--maxavsize] [--skipcheck]
Example: ubimkvol /dev/ubi0 -s 20MiB -N config_data - create a 20 Megabytes volume
named "config_data" on UBI device /dev/ubi0.
-a, --alignment=<alignment> volume alignment (default is 1)
-n, --vol_id=<volume ID> UBI volume ID, if not specified, the volume ID
will be assigned automatically
-N, --name=<name> volume name
-s, --size=<bytes> volume size volume size in bytes, kilobytes (KiB)
or megabytes (MiB)
-S, --lebs=<LEBs count> alternative way to give volume size in logical
eraseblocks
-m, --maxavsize set volume size to maximum available size
-t, --type=<static|dynamic> volume type (dynamic, static), default is dynamic
-k, --skipcheck skip the CRC check done at volume open time
-h, -?, --help print help message
-V, --version print program version
在ubi1上创建280LEBS的ubifs镜像,示例如下:
# ubimkvol /dev/ubi1 -S 280 -N firmware -t dynamic
Volume ID 0, size 280 LEBs (35553280 bytes, 33.9 MiB), LEB size 126976 bytes (124.0 KiB), dynamic, name "firmware", alignment 1
ubiscan——扫描mtd设备信息
# ubiscan -h
ubiscan version 2.1.5 - a tool to scan MTD devices
Usage: ubiscan <MTD device node file name> [--help] [--version] [--verbose] [--histogram=<list>]
-h, -?, --help print help message
-H, --histrogram=<list> comma-separated list of bin thresholds
-v, --verbose be verbose
-V, --version print program version
- 示例一:只显示全局信息
# ubiscan /dev/mtd8
Summary
=========================================================
mtd : 8
type : nand
size : 41943040 bytes (40.0 MiB)
PEBs : 320
min I/O: 2048 bytes
PEB erase counters
=========================================================
valid : 318
empty : 0
corrupted: 0
alien : 0
bad : 2
Histogram
=========================================================
from to count min avg max
---------------------------------------------------------
0 .. 9: 0 0 0 0
10 .. 99: 0 0 0 0
100 .. 999: 318 160 160 161
1000 .. 9999: 0 0 0 0
10000 .. 99999: 0 0 0 0
100000 .. inf: 0 0 0 0
---------------------------------------------------------
Total : 318 160 160 161
- 示例二:显示详细信息
# ubiscan /dev/mtd8 -v
Summary
=========================================================
mtd : 8
type : nand
size : 41943040 bytes (40.0 MiB)
PEBs : 320
min I/O: 2048 bytes
PEB erase counters
=========================================================
valid : 318
empty : 0
corrupted: 0
alien : 0
bad : 2
Histogram
=========================================================
from to count min avg max
---------------------------------------------------------
0 .. 9: 0 0 0 0
10 .. 99: 0 0 0 0
100 .. 999: 318 160 160 161
1000 .. 9999: 0 0 0 0
10000 .. 99999: 0 0 0 0
100000 .. inf: 0 0 0 0
---------------------------------------------------------
Total : 318 160 160 161
Details
=========================================================
PEB 0: 161
PEB 1: 161
PEB 2: 160
PEB 3: 160
PEB 4: 160
PEB 5: 160
......
PEB 44: 160
PEB 45: EB_BAD
PEB 46: 160
......
PEB 183: 160
PEB 184: EB_BAD
PEB 185: 160
......
PEB 319: 160
spinor使用ubifs
spinor:page_size=256Byte,block_size=64KiB
mtd_parttion:11MiB
spinor制作ubifs
示例如下:
mkfs.ubifs -m 1 -e 65408 -c 172 -x lzo -U -d ./data -o ./data.ubifs
参数说明:
-m spinor最小存储单元为 1byte
-e 逻辑块擦除大小,64KiB - 64Byte(leb) - 64Byte(peb) = 65536 - 64 -64 = 65408
-c 逻辑块数量,11MiB / 64KiB - 4 = 11 * 1024 / 64 - 4 = 176 - 4 = 172
spinor制作ubi镜像
示例如下:
ubinize -m 1 -p 65536 -o ./data_ubifs.img ./ubinize_data.cfg
参数说明:
-m spinor最小存储单元为 1byte
-p 物理块擦除大小,64KiB
ubinize_data.cfg配置信息如下:
[ubifs]
mode=ubi
image=./data.ubifs #ubifs原始镜像
vol_id=0
vol_size=10MiB #ubi卷大小,要小于mtd分区大小
vol_type=dynamic #ubi卷类型
vol_alignment=1
vol_name=data #卷名
vol_flags=autoresize
spinand使用ubifs
spinand:page_size=2KiB,block_size=128KiB
mtd_parttion:128MiB
spinand制作ubifs
示例如下:
mkfs.ubifs -m 2KiB -e 124KiB -c 1000 -x lzo -d ./data -o ./data.ubifs
参数说明:
-m spinand最小存储单元为 page_size=2048
-e 逻辑块擦除大小,block_size - 2 * page_size = 128KiB - 2 * 2KiB = 124KiB
-c 逻辑块数量,128MiB / 128KiB - 4 - 20 = 1024 - 4 - 20 = 1000
spinand制作ubi镜像
示例如下:
ubinize -m 2KiB -p 128KiB -o ./data_ubifs.img ./ubinize_data.cfg
参数说明:
-m spinor最小存储单元为 1byte
-p 物理块擦除大小,64KiB
ubinize_data.cfg配置信息如下:
[ubifs]
mode=ubi
image=./data.ubifs #ubifs原始镜像
vol_id=0
vol_size=120MiB #ubi卷大小,要小于mtd分区大小
vol_type=dynamic #ubi卷类型
vol_alignment=1
vol_name=data #卷名
vol_flags=autoresize
spinand保留块配置
默认情况下,大约 2% 的整个芯片大小 (20/1024 PEB) 被保留用于坏块处理。如果坏块的数量超过了分配的数量,就会打印一条错误消息,并且 UBI 将切换到只读模式。
NandFlash设备在出厂时可能包含一些无效块,并且规定了总可用块中的最小有效块数(Minimum number of Valid Blocks ,NVB)约总块数的98%。无效块是指其中至少包含一个页面的错误位数超过最小所需的 ECC 能够纠正的错误位数。在使用过程中可能会出现额外的坏块。然而,在产品的耐久寿命内,总可用块数不会低于 NVB。
2%的来源依据是spinand行规,也就是说在spinand设备寿命期间,设备会保证每1024个块中最多产生20个坏块。可在其Datasheet中找到相关的描述,如下:
-
GD5F2GM7UE
-
F50L2G41XA(2B)
-
1)kernel默认配置
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<*> Enable UBI - Unsorted block images --->
--- Enable UBI - Unsorted block images
(20) Maximum expected bad eraseblock count per 1024 eraseblocks
CONFIG_MTD_UBI_BEB_LIMIT:指定UBI在MTD设备上期望的最大坏物理擦除块数(每1024擦除块),默认值:20,即:2%
-
2)引导参数配置
详见:ubi attach mtd设备的用法;
-
3)ubiattach工具配置
详见:ubiattach的用法;
mtd-utils创建及挂载ubifs
1)ubiformat格式化mtd设备为ubi镜像
ubiformat /dev/mtd8
2)ubiattach绑定mtd设备到ubiX上
ubiattach -p /dev/mtd8 -d 1 -b 20
3)ubimkvol创建空的ubifs卷
ubimkvol /dev/ubi1 -S 280 -N firmware -t dynamic
4)mount挂载ubifs文件系统
mount -t ubifs ubi1:firmware /firmware/