ubifs使用

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_GLUEBIUBI 卷的基础上模拟 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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值