近日,阅读著名通讯半导体公司——博通公司(broadcom)的资料时,发现他们提供的linux系统中使用了一种名为ubi的文件系统。怀着好奇心,在网上搜索下ubi文件系统的资料。
网上关于ubi文件系统的介绍,大多数是华清远见刘洪涛老师所写的文章。该文章主要介绍了ubi文件系统产生的背景和用法。不过,本文将从一个认识的角度来了解ubi文件系统。
一、 UBI/UBIFS产生背景
FLASH具有的“先擦除再写入”、坏块、“有限的读写次数”等特性,目前管理FLASH的方法主要有:
1、 采用MTD+FTL/NFTL(flash 转换层/nand flash转换层)+ 传统文件系统,如:FAT、ext2等。FTL/NFTL的使用就是针对FLASH的特有属性,通过软件的方式来实现日志管理、坏块管理、损益均衡等技 术。但实践证明,由于知识产权、效率等各方面因素导致本方案有一定的局限性。
2、采用硬件翻译层+传统文件系统的方案。这种方法被很多存储卡产品采用,如:SD卡、U盘等。这种方案对于一些产品来说,成本较高。
3、采用MTD+ FLASH专用文件系统,如JFFS1/2,YAFFS1/2等。它们大大提高了FLASH的管理能力,并被广泛应用。
JFFS2、YAFFS2等专用文件系统也存在着一些技术瓶颈,如:内存消耗大,对FLASH容量、文件系统大小、内容、访问模式等的线性依赖,损益均衡能力差或过渡损益等。在此背景下内核加入了UBI文件系统的支持。
二、UBI/UBIFS简单介绍
由于超大容量Nand Flash的普及,YAFFS等皆无法再去控制Nand Flash的空间,于是在2006年由IBM与Nokia的工程师Thomas Gleixner,Artem Bityutskiy设计开发了UBI及其UBIFS文件系统,专门为了解决MTD(Memory Technology Device)设备所遇到的瓶颈。UBIFS通过子系统UBI处理与MTD device之间的动作。与JFFS2一样,UBIFS 建构于MTD device 之上,因而与一般的block device不兼容。
其中,UBI是一种类似于LVM的逻辑卷管理层。主要实现损益均衡,逻辑擦除块、卷管理,坏块管理等。而UBIFS是一种基于UBI的FLASH日志文件系统。
一句话解读就是,UBIFS及其使用的UBI子系统,是一种用在大容量flash上的文件系统。
三、UBI/UBIFS的特点
1. 可扩展性
UBIFS对flash 尺寸有着很好的扩展性;也就是说mount时间、内存消耗以及I/O速度都不依赖于flash 尺寸(对于内存消耗并不是完全准确的,但是依赖性非常的低); UBIFS可以很好的适应GB以上大小的大容量flash; 当然UBI本身还有扩展性的问题,无论如何, UBI/UBIFS都比JFFS2的可扩展性好,此外如果UBI成为瓶颈,还可以通过升级UBI而不需改变UBIFS。
2. 快速mount
不像JFFS2,UBIFS在mount阶段不需要扫描整个文件系统,UBIFS mount介质的时间只是毫秒级,时间不依赖与flash的尺寸;然而UBI的初始化时间是依赖flash的尺寸的,因此必须把这个时间考虑在内。
3. write-back 支持
UBIFS的回写(延迟写)同JFFS2的write-through(立即写入内存)相比可以显著地提高文件系统的吞吐量。
4. 异常unmount适应度
UBIFS是一个日志文件系统,可以容忍突然掉电以及unclean重启; UBIFS 通过replay 日志来恢复unclean unmount,在这种情况下replay会消耗一些时间,因此mount时间会稍微增加,但是replay过程并不会扫描整个flash介质,所以UBIFS的mount时间大概在几分之一秒。
5. 快速I/O
即使我们disable write-back(可以在unmount时使用-o sync mount选项), UBIFS的性能仍然接近JFFS2。记住,JFFS2的同步I/O是非常惊人的,因为JFFS2不需要在flash上维护indexing data结构, 所以就没有因此而带来的负担; 而UBIFS恰恰是有index数据的。 UBIFS之所以够快是因为UBIFS提交日志的方式:不是把数据从一个地方移动到另外一个位置,而只是把数据的地址加到文件系统的index,然后选择不同的eraseblock作为新的日志块,此外还有multi-headed日志方式等技巧。
6. on-the_flight compression
存储在flash介质上的数据是压缩的;同时也可以灵活的针对单个文件来打开关闭压缩; 例如,可能需要针对某个特定的文件打开压缩,或者可能缺省方式下支持压缩,但是对多媒体文件则关闭压缩。
7. 可恢复性
UBIFS可以从index破坏后恢复; UBIFS中的每一片信息都有一个header来描述,因此可以通过扫描这个flash介质来重构文件系统,这点和JFFS2非常类似;想像一下,如果你擦出了FAT文件系统的FAT表,那么对于FAT FS是致命的错误,但是如果擦除UBIFS的index,你人然可以重构文件系统,当然这需要一个特定的用户空间程序来做这个恢复。
8. 完整性
UBIFS通过写checksum到flash 介质上来保证数据的完整性,UBIFS不会无视损坏文件数据或meta-data; 缺省的情况,UBIFS仅仅检查meta-data的CRC,但是你可以通过mount选项,强制进行data CRC的检查。
三、UBI/UBIFS的层次结构
UBI和UBIFS在linux上的层次结构如下图所示。
- UBIFS是工作在UBI子系统之上的。
- UBI没有FLASH转换成(FTL,Flash Translation Layer)。
- 因为没有FTL,所以UBI只能工作在裸的flash,因此,它不能用于消费类FLASH,如MMC, RS-MMC, eMMC, SD, mini-SD, micro-SD, CompactFlash, MemoryStick等,UBI在嵌入式设备如智能手机中被广泛使用。