从新打包ubi镜像
从网上了解到ubi image不能像其他格式的文件系统image那样作为loop设备mount起来,所以需要找其它方法。具体做法就是安装nandsim模块来模拟一个nand flash,然后将ubi image写到mtd设备上,再将mtd设备attach起来,最后就可一mount ubi设备了。
2002 sudo modprobe ubi
(需要安装ubi模块,不然ubiattach会报错)
2003 sudo modprobe nandsim first_id_byte=0x20 second_id_byte=0xaa third_id_byte=0x00 fourth_id_byte=0x15
(安装nandsim来模拟nand设备,执行后可以看到/dev/mtd0。传入的四个id在执行“read ID”命令时返回)
2005 cat /proc/mtd
(mtd设备信息)
2008 sudo ubiformat -y /dev/mtd0 -s 512 -f ubi.img
(格式化mtd,并写入ubi image)
2009 sudo ubiattach -m 0
(将/dev/mtd0 attach到ubi设备。detach则用-d 0,表示detach /dev/ubi0)
2010 ls /dev/ubi0*
2012 sudo mount -t ubifs /dev/ubi0_0 ubi
(将ubi设备0的第一个分区mount到ubi目录)
2025 sudo mkfs.ubifs -r ubi -m 2048 -e 129024 -c 863 -o fs.img
(由ubi目录制作文件系统image。-m为最小io大小,-e为逻辑擦除块leb大小,-c为最大leb个数)
2027 sudo ubinize -o fs.img.ubinized -m 2048 -p 128KiB -s 512 -O 512 ubi.ini
(制作待烧录的ubi image。-m为最小io大小,-p为物理擦除块peb大小,-s为用作ubi头的page大小,-O为VID头的偏移量)
ubi.ini内容:
[ubifs]
mode=ubi
image=fs.img
vol_id=0
vol_type=dynamic
vol_alignment=1
vol_name=rootfs
vol_flags=autoresize
有关ubi可以参考:
http://www.linux-mtd.infradead.org/doc/ubi.html
UBI头:
每一个PEB开始处存由两个64byte的的头,分为EC头和VID头。EC头存放PEB的擦除次数。VID头存放所属volume,以及映射时对应的LEB号码。EC头位于0偏移量处,VID位置取决于是否由sub-page:如果没有,则位于第二个page处;如果由,则位于第二个sub-page处。由于PEB包含两个头,所以LEB比PEB小。
最小io单元:
NOR flash的大小为1byte,NAND的对应page大小,比如512或者2k等等。