文件系统介绍 --- ubifs

UBIFS(Unsorted Block Image File System)无序区块镜像文件系统是用于固态存储设备上,UBIFS在设计与性能上均较YAFFS2、JFFS2更适合MLC(Multi-Level Cell) NAND FLASH。例如:UBIFS支持凑数(write-back), 其写入的数据会被缓存起来, 直到有必要写入时才写到flash, 这样大大降低分散小区块数量,并提高读写效率。UBIFS文件系统目录存储在flash上,UBIFS 挂载时不需要扫描整个存储器来重新创建文件目录。支持实时压缩,而且可选择性压缩部份文件。另外UBIFS使用日志(journal),可减少对flash index的更新频率。因为UBIFS是直接工作在Raw Flash设备上(如Nandflash),所以他不能工作在SD卡、U盘这些常用的存储设备上,目前的安卓手机上绝大部分都是使用的UBIFS文件系统。关于UBIFS的更多信息请参考: http://www.linux-mtd.infradead.org/doc/ubifs.html

传统的flash文件系统如Jffs2、yaffs2等是工作在MTD设备层之上,而UBIFS则建立在UBI卷层之上,UBI卷层工作在MTD设备层之上。也可以说,UBIFS涉及三个子系统:
1. MTD 子系统,flash驱动直接操作设备,而MTD在flash驱动之上,向上呈现统一的操作接口。所以MTD子系统的使命是:屏蔽不同flash的操作差异,向上提供统一的操作接口;对应drivers/mtd;
2. UBI Subsystem,它工作在MTD设备之上,提供了UBI卷(类似于Linux服务器上的LVM概念),对上层屏蔽了一些直接使用MTD设备需要处理的问题,如wear-leveling(磨损平衡算法)和volume management(坏块管理)功能等;对应drivers/mtd/ubi;
3. UBIFS文件系统,工作于UBI之上。它提供文件的open、read、write等操作;

UBI Volume 与 UBI Device

在UBI中有两个概念:UBI卷与UBI设备
UBI设备相当于磁盘设备(sda、mmcblk0);
UBI卷相当于磁盘上对应分区(sda1,mmcblk0p1);
UBI设备是在MTD设备上创建出来的设备,而UBI卷则是从UBI设备上划分出来的分区;

UBI文件系统制作

mkfs.ubifs 制作 UBIFS 文件系统镜像(不带卷集信息)

mkfs.ubifs -e 0x1f000 -c 568 -m 2048 -d config/ -o config.ubifs -v

-e 0x1f000 : 表示逻辑擦除块(LEB) 的 size,等于物理擦除块-2页
-c 568 : 最多逻辑可擦除块数目为 568(568*128KB=71MB),这个可根据 ubi volume 数量来设置, 实际上是设置此卷的最大容量。(理论上要给bad block坏块预留点空间,制作的时候尽量预留一点出来,-c 指定该分区最大逻辑擦除块数量,该值随着根文件系统分区的大小和该分区的坏块数调整。)
-m 2048 : flash 最小的读写单元, 一般为 flash 的页大小。
-d config/ : 需要制作成 UBI 文件系统的源文件。
-o config.ubifs : 制作出来的镜像名称为 config.ubifs。
-v : 显示制作的详细过程。
制作成功的 UBI 镜像,是没有创建 volume 的,不能直接烧录使用,需要进行创建 volume 步骤

ubinize 制作 UBI 文件系统镜像(带有卷集信息)

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

-o config.img : 制作出的镜像名称是 config.img。
-m 2048 : flash 最小的读写单元, 一般为 flash 的页大小。
-p 128KiB : 表示物理擦除块(PEB) 的 size, 一般为块大小。
-s 2048 : UBI 头部信息的最小输入输出单元, 一般与最小读写单元(-m 参数)大小一样。
ubinize.cfg : 制作带 volume UBI 格式的镜像所需要的配置文件。
-v : 显示制作过程中的详细参数。

ubinize.cfg 制作

$ touch ubinize.cfg
$ vim ubinize.cfg
[ubifs]
mode=ubi
image=config.ubifs
vol_id=0
#vol_size=64MiB
vol_type=dynamic
vol_name=config
vol_flags=autoresize
vol_alignment=1

mode=ubi : 这是个强制参数, 目前只能是 ubi
image=config.ubifs : 指定 mkfs.ubifs 输出的 UBIFS 镜像文件, 作为源文件。
vol_id=0 : 指定卷的 id 为 0。
vol_size=64MiB : 指定该卷的 size 为 64MiB, 使用该参数的时候要注意当设置了 vol_flags=autoresize, 这个参数将不起作用, 设置成了自动分配 size。 手动指定 size 的时候, 要注意, 参数的大小不能超过当前分区的最大 size。
vol_type=dynamic : dynamic 指示当前卷为动态卷, 是可读可写的。static指示卷为静态卷, 是只读的。
vol_name=config : 指定当前卷的卷名为 config。
vol_flags=autoresize : 指定当前卷为自动分配 size, 当有一个文件系统有两个卷的时候只能有一个为 autoresize。
vol_alignment=1 : 指定对齐方式, 默认为 1。
备注:通过 ubinize 制作的 ubi 文件系统可以直接烧录使用

 

posted @ 2024-07-25 12:05  流水灯  阅读(36)  评论(0编辑  收藏  举报