ubifs文件系统简介
UBIFS(Unsorted Block Image File System,无排序区块图像文件系统)是用于固态存储设备上,并与LogFS相互竞争,作为JFFS2的后继文件系统之一。由于Nand Flash容量的暴涨,JFFS2、Yaffs2等皆无法操控大的Nand Flash空间,IBM、Nokia工程师Thomas Gleixner、Artem Bityutskiy等人2006年发起,致力于开发性能卓越、扩展性高的FLASH专用文件系统,以解决嵌入式环境下以FLASH作为MTD设备使用时的技术瓶颈。真正开始开发于2007年,并于2008年10月第一次加入稳定版本于Linux核心2.6.27版,在设计与性能上均较优于YAFFS2、JFFS2,更实用于MLC NAND FLASH。因为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涉及三个子系统:
- MTD 子系统,提供对flash芯片Raw的访问接口。 MTD子系统提供了MTD device的概念,比如/dev/mtdx(字符设备)和/dev/mtdblockX(块设备);
- UBI Subsystem,它工作在MTD设备之上,提供了UBI逻辑卷(类似于Linux服务器上的LVM概念),对上层屏蔽了一些直接使用MTD设备需要处理的问题,如wear-leveling(磨损平衡算法)和volume management(坏块管理)功能等;
- UBIFS文件系统,工作于UBI之上。它提供文件的open、read、write等操作;
作为新一代文件系统新贵,他具有如下特性:
- 可扩展性: UBIFS对Flash 尺寸有着很好的扩展性; 也就是说文件系统挂载时间,内存消耗以及I/O速度都不依赖于Flash的大小; UBIFS可以很好的运行在GB级的 flashe设备; 当然UBI本身还是有扩展性的问题,无论如何 UBI/UBIFS都比JFFS2的可扩展性好,如果UBI成为瓶颈,可以改进UBI而不需改变UBIFS本身;
- 快速挂载:不像JFFS2,UBIFS在挂载阶段不需要扫描整个文件系统,UBIFS mount的时间只是毫秒级,时间不依赖于Flash的大小;然而UBI的初始化时间依赖Flash的大小,因此必须把这个时间考虑在内。
- write-back 支持:文件的改变并不是立刻提交到flash media上,而是cache这些修改,直到达到写入的条件,这减少了I/O的数目因此改善I/O性能和系统性能。回写本身也是文件系统的标准技术,由于数据没有立刻写入flash, 回写带来了突然掉电就会存在数据丢失的风险。相反, JFFS2不支持write-back, JFFS2文件系统的所有变化都是立刻同步到flash介质上。同JFFS2的writethrough(立即写入内存)相比可以显著的提高文件系统的吞吐量。
- 容忍不清洁的重启:UBIFS是日志文件系统,所以容忍突然关闭和不清洁的重启。UBIFS会回放日志并从不切底的重启中恢复过来。这时挂载时间会有点慢。但由于只是需要重做日志,而不需要扫描储存介质,所以性能影响不大。
- 快速I/O:即使回写功能被禁能(例如在挂载时加入“-o sync”的参数),UBIFS也表现良好,接近jffs2。在同步I/O方面UBIFS是极难与jffs2相抗争的。因为jffs2在flash维护数据索引结构,不需要额外的开销,而UBIFS需要。然而UBIFS依然是很快,因为它依靠日志。它不需要把数据物理地从一个地方移动到另一个地方,仅把有关信息加入文件系统的索引以及为新日志挑选一个擦除块。
- 快速压缩:与jffs2相似,UBIFS支持数据压缩储存。对于单个文件的储存,UBIFS可以使能/禁能压缩功能。
- 自恢复功能:有数据索引有损坏的情况下,UBIFS可以恢复过来。在UBIFS每一块信息有描述整个信息的数据头。在扫描介质的情况下这数据头信息可以重建。而在FAT文件系统,发生这样
的事件是致命的。 - 数据的完整性:UBIFS在每次写入数据时都会对数据进行核实,以确保数据的完整性。UBIFS不会容忍任何不可用的数据或元数据。然而为了加快数据的读写速度,用户可以关闭CRC检查。
镜像文件制作
mtd-utils不仅提供mkfs.jffs2制作工具,他还提供mkfs.ubifs和ubinize制作工具,mkfs.ubifs他会直接生成一个.img的文件
mkfs.ubifs -h
/*基本用法*/
Options:
-r, -d, --root=DIR build file system from directory DIR //根目录树路径
-m,