🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk)
💬 博主粉丝群介绍:① 群内高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。
🗄️ 专栏介绍:本文归属于专栏《嵌入式开发工具》,专注嵌入式开发中的常用工具,持续更新中,欢迎大家免费订阅关注。
1. 制作ubi镜像的步骤
制作ubi镜像,需要用到两个命令mkfs.ubifs
和unbnize
,两者均包含在mtd-utils工具集中。
以下命令均以gd5f1gq4uby1g这款spinand为例,其相关参数如下所示:
页(PAGESIZE)大小: 2048
物理擦除块(PEB)大小:128KiB
逻辑擦除块(LEB)大小:124KiB(PEB-4KiB)
逻辑擦除块总数量:992(分区容量 / PEB)
1.1 使用mkfs.ubifs制作ubi文件系统
$ mkfs.ubifs -m 2KiB -e 124KiB -c 992 -r output/fs/rootfs -o output/target/rootfs.ubifs
其中:
- -m, 最小输入输出单元大小,即页大小
- -e, 逻辑擦除块(LEB)大小, 即逻辑块大小(擦除块大小, 4KiB)
- -c, 最大逻辑擦除块数量, 分区大小/PEB, 通过
mtdinfo /dev/mtdX
输出结果中的Amount of eraseblocks也可得到. - -r, 文件系统源目录
- -o, 目标文件
1.2 使用ubinize制作ubi镜像
$ ubinize -o rootfs.img -p 128KiB -m 2048 -s 2048 -O 2048 ubi.ini
其中,
- -o, 目标文件
- -p, 物理擦除块(PEB)大小.
- -m, 最小输入输出单元大小,即页大小
- -s, UBI头的大小输入输出大小, 从
mtdinfo /dev/mtdX
的输出结果中的Sub-page size可以得知(默认为页大小) - -O, VID头从PEB起始位置的偏移位置(默认为Sub-page size)
- ubi.ini, UBI镜像文件配置文件, 该文件内容如下所示
[rootfs]
mode=ubi
image=output/target/rootfs.ubifs
vol_id=0
vol_size=32MiB
vol_type=dynamic
vol_name=rootfs
vol_alignment=1
vol_flags=autoresize
至此,ubi镜像制作成功(上述部分参数从开机时的内核打印信息中也可以获取到)
2. 相关信息补充
2.1 ubi相关命令
-
ubiattach
:链接MTD设备(MTD设备描述原始Flash设备)到UBI并且创建相应的UBI设备。比如:将MTD设备**/dev/mtd2链接到UBI设备/dev/ubi2上:ubiattach -m 2 -d 2
.链接成功后会在/sys/class/ubi/目录下生成对应的UBI设备目录/sys/class/ubi/ubi2**, 该UBI设备上如果有卷,则会根据卷的数量同时创建各个卷的目录:/sys/class/ubi/ubi2_0、/sys/class/ubi/ubi2_1等。通过**/sys/class/ubi/ubi2_X/name**可以查看各个卷的名字。 -
ubidetach
:与ubiattach相反的操作,将MTD设备与UBI设备解除链接; 比如:解除MTD设备**/dev/mtd2与UBI设备的链接:ubidetach -m 2
, 解除UBI设备/dev/ubi2**上链接的MTD设备:ubidetach -d 2
.注意-m
和-d
不可同时使用 -
ubimkvol, 从UBI设备上创建UBI卷;
-
ubirmvol, 从UBI设备上删除UBI卷;
-
ubiblock, 管理UBI卷上的block;
-
ubinize, 制作UBI镜像;
-
ubiformat, 擦除Flash(
ubiformat /dev/mtd2
)、写入UBI镜像到Flash(ubiformat /dev/mtd2 -f /mnt/sdcard/ubifs.img
); -
mtdinfo, 报告从系统中找到的UBI设备的信息(
mtdinfo /dev/mtd2
).
3. 注意事项
- uboot bootargs中添加ubi.mtd=X选项,内核会自动自动链接MTD设备__/dev/mtdX__到UBI设备**/dev/ubi0**上
- 板子上挂载ubifs分区,mount命令不能使用**/dev/mtdblockX**, 需要使用
UBI设备:卷标
的格式进行挂载。比如:MTD设备**/dev/mtdblock2已经链接到UBI设备/dev/ubi0
上,其卷标为rootfs**, 挂载**/dev/mtdblock2需要使用mount -t ubifs ubi0:rootfs /mnt/ubifs/
。另一张办法:UBI设备/dev/ubi0
创建时,会为其上每一个卷各自创建一个字符设备/dev/ubi0_X**;目前**/dev/ubi0上只有一个卷,因此只有/dev/ubi0_0**一个字符设备,使用mount -t ubifs /dev/ubi0_0 /mnt/ubifs
命令就可以进行挂载。 - dd命令(操作**/dev/mtdblockX**)或者ubiformat命令(操作**/dev/mtdX**)都可以写ubi镜像,写之前需要先解除其与UBI设备的链接,否则操作会失败。