Uboot支持

添加配置:

#define CONFIG_MTD_PARTITIONS
#define CONFIG_CMD_UBI
#define CONFIG_RBTREE

boot启动参数设置:

setenv bootargs 'console=0,115200 mem=64M  phy_mode=rmii rootwait=1 rw ubi.mtd=4 ubi.mtd=5 rootfstype=ubifs root=ubi0:rootfs'

可在命令行参数中增加多个ubi设备,如ubi.mtd=2,ubi.mtd=1,这样传递后,内核启动后会做attach的操作,attach之后,/dev/下就建立好设备

Kernel支持

Kernel> make menuconfig
File systems 
	---> [*] Miscellaneous filesystems 
		---> <*> UBIFS file system support

UBIFS制作

mkfs.ubifs -F -r ./flash -m 2048 -e 126976 -c 256 -o ubifs.img

#-m:最小读写单元大小为2KiB(2048bytes),一般为页大小
#-e:逻辑可擦除块大小为124KiB=(每块的页数-2)*页大小=(64-2)*2KiB=124KiB=126976bytes
#-c:最多逻辑可擦除块数目为256, 这个值是通过 ubinize.cfg 里面的 vol_size=32MiB算出来的, 32M * 1024 / 128K 算出来的。
#-F:使能“white-space-fixup”,如果是通过u-boot烧写需要使能此功能。

ubinize -o ubi.img -m 2048 -s 2048 -p 128KiB ubinize.cfg

#-m:最小输入输出大小为2KiB(2048bytes),一般为页大小 
#-p:物理可擦出块大小为128KiB=每块的页数*页大小=64*2KiB=128KiB 
#-s:用于UBI头部信息的最小输入输出单元,一般与最小输入输出单元(-m参数)大小一样

ubinize.cfg:

[ubifs]
mode=ubi
image=ubifs.img	#mkfs.ubi生成的源镜像
vol_id=0		#卷序号
vol_size=32MiB  #要小于文件系统分区大小
vol_type=dynamic	#动态卷 dynamic类型的设备表示可以读写,static类型的设备表示只读
vol_name=ubi-vol0	#卷名 
vol_flags=autoresize
#ubiformat /dev/mtd5
ubiattach /dev/ubi_ctrl -m 5 > /dev/null 2>&1
#ubimkvol /dev/ubi0 -s 32MiB -N ubi0_0 > /dev/null 2>&1
mount -t ubifs ubi0_0 /mnt/flash
  • 反向制作:
    sudo modprobe nandsim first_id_byte=0xec second_id_byte=0xd3 third_id_byte=0x10 fourth_id_byte=0xa4  #0xa4 2K, 0xa6 4K

错误

vtbl_check: too large reserved_pebs 496, good PEBs 479
ubi 文件系统制作过大
vol_size=32MiB #要小于文件系统分区大小
然后上面所有的值都要根据这个值来计算
要修改-c参数,不能大也不能小,太小也要大于image大小,太大mount有问题

挂载

手动挂载

#格式化
ubiformat /dev/mtd4
#挂载
/usr/sbin/ubiattach /dev/ubi_ctrl -m 5 > /dev/null 2>&1
##/usr/sbin/ubimkvol /dev/ubi0 -s 28MiB -N ubi0_0 > /dev/null 2>&1
/bin/mount -t ubifs ubi0_0 /mnt/flash
#Mount "rootfs" volume of UBI device 0 to /mnt/ubifs ("rootfs" is volume name):
$ mount -t ubifs ubi0:rootfs /mnt/ubifs

烧写

(1)mkfs.ubifs工具制作的结果,就是ubifs镜像,不包含volume信息,需要用
nand erase.part system – 擦除分区
ubi part system - 激活分区
ubi create system - 创建分区
ubi write 84000000 system xxxxx - xxxxx表示镜像实际大小
(2)ubi volume bin烧写
mkfs.ubifs后,使用ubinize处理了ubifs的镜像后,镜像含有了volume信息,直接
nand write 84000000 system xxxxx - xxxxx表示镜像实际大小

和分区大小要匹配,要小于分区大小。

参考

linux源码中Documentation/filesystems/ubifs.txt
https://www.cnblogs.com/embedded-linux/p/5674218.html