嵌入式系统开发中,最常见的文件系统格式是UBIFS。需注意的是UBIFS和任何传统的文件系统是不一样的:UBIFS不是运行在block device之上的(比如硬盘, MMC/SD卡,U盘等等)。UBIFS是运行于raw flash之上。最早它是诺基亚工程师在Szeged大学帮助下开发的一种新flash文件系统。UBIFS可以认为是JFFS2文件系统的下一代产品。
JFFS2运行在MTD设备之上,而UBIFS则只能工作于UBI volume之上。也可以说,UBIFS涉及三个子系统:
1. MTD 子系统, 提供对flash芯片的访问接口, MTD子系统提供了MTD device的概念,比如/dev/mtdx,MTD可以认为是raw flash
2. UBI subsystem,为flash设备提供了wear-leveling和 volume management功能; UBI工作在MTD设备之上,提供了UBI volume;UBI是MTD设备的高层次表示,对上层屏蔽了一些直接使用MTD设备需要处理的问题,比如wearing-leveling以及坏块管理。
3. UBIFS文件系统,工作于UBI之上
UBIFS的一些特点:
可扩展性:UBIFS对flash 尺寸有着很好的扩展性;它可以很好的运行在GB级的 flash设备;
快速挂载:不像JFFS2,UBIFS在mount阶段不需要扫描整个文件系统,UBIFS mount的时间一般只需毫秒级。
write-back 支持: 回写或者叫延迟写更准确些吧,同JFFS2的write-through(立即写入内存)相比可以显著的提高文件系统的吞吐量。
异常unmount适应度:UBIFS是一个日志文件系统可以容忍突然掉电以及unclean重启; UBIFS 通过replay 日志来恢复unclean unmount,异常mount时间大概在几分之一秒。
快速I/O : 即使我们disable write-back(可以在unmount时使用-o sync mount选项), UBIFS的性能仍然接近JFFS2。
on-the_flight compression : 存储在flash介质上的数据是压缩的;同时也可以灵活的针对单个文件来打开关闭压缩。例如,可能需要针对某个特定的文件打开压缩;或者可能缺省方式下支持压缩,但是对多媒体文件则关闭压缩。
可恢复性 : UBIFS可以从index破坏后恢复; UBIFS中的每一片信息都用一个header来描述,因此可以通过扫描整个flash介质来重构文件系统,这点和JFFS2非常类似。想像一下,如果你擦除了FAT文件系统的FAT表,对于FAT 文件系统是致命的错误,但是如果擦除UBIFS的index,你仍然可以重构文件系统,当然这需要使用一个用户空间程序来做恢复。
完整性 : UBIFS通过把checksum写到flash 介质上来保证数据的完整性,UBIFS不会无视损坏的文件数据或meta-data;缺省的情况,UBIFS仅仅检查meta-data的CRC,但是你可以通过mount选项,强制进行data CRC的检查。
UBIFS具有很好的性能,这从ubifs作为rootfs的mount和启动速度就可以看出。部分原因是ubifs可以说是一个write back的文件系统。 也就是说,ubifs会在内存中维持一个buf,当文件被修改时,只是这个buf的内容被改变,但是不一定会将改动回写到nand;系统会积累一定时间的改动然后再写入,这样能提高系统的性能。但是这样带来的问题是一旦断电,buf里的改动全部丢失。 因此,对于重要数据,在程序中修改了文件内容后要及时调用fsync写入到flash中。