UBI文件系统和镜像的制作及分区挂载说明
定义:无排序区块图像文件系统(Unsorted Block Image File System, UBIFS),主要适用于nand flash设备。
三个子系统:
UBIFS文件系统
可以理解为用户层,工作于UBI之上。
比如我们设备中挂载可见的分区。
UBI
是MTD设备的高层次表示,一般用户层也可以在这里做开发定制,比如升级,通过ioctl控制MTD设备的读写。
MTD子系统
提供nand flash底层访问接口。
下面是这三个子系统的关系图,画图太费时,借用一下牛画好滴~~
好了,接下来就可以讲UBIFS文件系统的制作和镜像的制作,以及分区的挂载了,顺序就是先制作*.ubifs,然后制作*.img,最后mount分区。
一、UBIFS文件系统制作
我们先手动通过命令来制作UBIFS
这两条命令后,就会产生my.ubifs了,mkfs.ubifs工具mtd-utils中会提供,这个大家就想办法自己去弄吧。
参数说明如下:
这里重点讲一下这个-c 400是怎么得来的,首先我的物理分区大小是100MB
公式:(10010241024)/ 4096 / 64 = 400
理论上要给bad block坏块预留点空间,大家制作的时候尽量预留一点出来,-c 指定该分区最大逻辑擦除块数量,该值随着根文件系统分区的大小和该分区的坏块数调整。
二、UBI镜像的制作
有了my.ubifs后,就可以使用如下命令制作img镜像了,命令如下:
其中ubinize.cfg内容如下:
[ubifs] mode=ubi image=./my.ubifs vol_id=0 vol_type=dynamic vol_name=rootfs vol_flags=autoresize如上,ubinize是mtd-util中提供的,
“配置文件说明:
mode=ubi
image=./my.ubifs 指定mkfs.ubifs制作生成的根文件系统镜像文件路径;
vol_id=0 指定根文件系统树的卷标为0,u-boot的bootargs参数需要根据它来设置;
vol_size=xxx指定该UBI逻辑卷的大小,该值计算公式一般为 逻辑擦除块大小逻辑擦除块个数,
该值一般不用写,默认值是image大小。
vol_type=dynamic
vol_name=rootfs 指定UBI卷的名称,u-boot的bootargs参数需要根据它来设置;
vol_flags=autoresize UBI Subsystem在系统启动时自动调整逻辑擦除块的个数”
三、ubifs分区的挂载
有了镜像,在gtp分区表中添加新增的分区配置,我这里是添加了100MB的空间,然后烧录到设备中,那开机的时候需要去挂载新增的分区。
需要两个步骤完成:
1、ubiattach
shell脚本如下,10是dev/mtd10的序号,2是整个ubifs中的第二个序号
2、mount
将/dev/ubi2_0挂载/data目录,这个2就是上面的第二个参数序号2
最终的开机效果:
/dev/ubi2_0 79284 24 79260 0% /data四、分区的读写
最后我还想讲一下如何在用户层对这个/dev/ubi2_0进行读写操作,比如OTA
Nand flash设备和eMMC的有些不同,需要先erase后write,不然数据是不会成功的。
这里提供一下最终的几个系统调用,这些是kernel提供给上层的操作接口。
ioctl(dev_fd, MEMGETINFO, &meminfo); 查询 ioctl(dev_fd, MEMGETBADBLOCK, &offset); 判断是否有坏块 ioctl(dev_fd, MEMERASE, &erase);erase擦除 写入的话,直接write到指定的fd就可以了好了,以上就是整理的nand相关的ubifs的内容,希望对大家有所帮助!
总结
以上是生活随笔为你收集整理的UBI文件系统和镜像的制作及分区挂载说明的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Page.OnPreInit 方法
- 下一篇: Vista 系统C盘(系统盘)越来越小的