简介
UBI文件系统是linux-2.6.27后内核新加入的flash文件系统,开发环境主机要求至少是在linux2.6.27后的内核,且已经有nandsim,ubi等相关模块。
UBI文件系统不能直接挂载,而是要用 nandsim 模拟出一个 mtd 设备,而且这个 mtd 设备要与 ubi 镜像的参数保存一致,否则后面的挂载会失败。
这些参数包括 mtd 设备的物理块擦除大小 (Physical Erase Block, PEB) 和 页大小 (Page Size)。
制作简单的ubi文件系统
准备目录(rootfs)文件内容如下:
使用命令mkfs.ubifs打包为一个UBIFS文件系统映像:
# mkfs.ubifs -r rootfs -m 512 -e 128KiB -c 100 -o rootfs.ubifs
参数说明:
参数 | 说明 |
-r rootfs | 指定根文件系统目录树的路径为rootfs/ |
-m 512 | Nand Flash的最小读写单元,一般为page size,这里设置为512字节 |
-e 128KiB | 逻辑擦除块(LEB)的大小,这里设置为128KB |
-c 100 | 逻辑擦除块(LEB)的个数,与分区大小有关,这里设置为100个 |
-o rootfs.ubifs | 输出的根文件系统文件为rootfs.ubifs |
ubi镜像文件生成
将rootfs.ubifs文件系统打包为镜像文件:
# ubinize -o ubi.img -m 512 -O 512 -p 128KiB ubinize.cfg
参数说明:
参数 | 说明 |
-o ubi.img | 输出的根文件系统镜像文件为ubi.img |
-m 512 | Nand Flash的最小读写单元,这里设置为512字节 |
-O 512 | 卷标识符头(VID header)在物理擦除块(PEB)的偏移,这里设置为512字节 |
-p128KiB | 物理擦除块(PEB)的大小,这里设置为128KB |
ubinize.cfg | ubi镜像配置文件 |
其中ubinize.cfg配置文件的内容如下所示:
[main]
mode=ubi
image=/home/chen/hik/rootfs.ubifs
vol_id=0
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
挂载ubi文件系统
过程如下:
- 模拟创建一个大小合适的闪存设备;
- 启动ubi驱动,并关联/dev/mtd0;
- 格式化/dev/mtd0,并写入ubi.img镜像文件;
- 关联mtd0与ubi_ctrl;
- 挂载ubi0到/mnt/ubi目录
- 创建被挂载目录,载入mtd模块,载入ubi模块
- 载入nandsim来模拟nand设备,检查加入模块的环境
# modprobe nandsim first_id_byte=0x2C second_id_byte=0xDA third_id_byte=0x00 fourth_id_byte=0x15
// disk size=128MB, page size=2048 bytes,block size=128KB
// 主要看第四个id,代表大小
- 将 ubi 与 /dev/mtd0 关联
modprobe ubi mtd=0
- 把rootfs.ubi加载到mtd的块设备,在这里需要安装mtd-utils工具箱(ubuntu下 直接apt-get install mtd-utils)
# apt install mtd-utils
# ubidetach /dev/ubi_ctrl -m 0 // 格式化前先解绑定
# ubiformat /dev/mtd0 -s 2048 -f ubi.img
ubiformat: mtd0 (nand), size 134217728 bytes (128.0 MiB), 1024 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
libscan: scanning eraseblock 1023 -- 100 % complete
ubiformat: 1024 eraseblocks are supposedly empty
...
ubiformat: flashing eraseblock 208 -- 100 % complete
ubiformat: formatting eraseblock 1023 -- 100 % complete
// 指令功能类似于`dd if=rootfs.ubi of=/dev/mtdblock0 bs=2048`
//-O参数用来指定VID header offset,默认是512
- 将ubi模块与已载入了rootfs.ubi的mtd模块关联
# ubiattach /dev/ubi_ctrl -m 0 -O 2048
- 创建ubi分卷,挂载该模块到指定目录
# ubimkvol /dev/ubi0 -N ubifs_0 -m
# mount -t ubifs ubi0:ubifs_0 /mnt/loop/
# ls -ahl /mnt/loop/ //查看
- 解挂载和绑定
$ sudo umount /mnt/ubi
$ sudo ubidetach /dev/ubi_ctrl -m 0
查看内核错误信息
如果遇到其他错误可用以下命令查看内核错误信息:
# dmesg | tail -20