1. 文件系统简介

文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。

文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设备中的物理位置。但是,实际上文件系统也可能仅仅是一种访问数据的界面而已,实际的数据是通过网络协议(如NFSSMB9P等)提供的或者内存上,甚至可能根本没有对应的文件(如proc文件系统)。

严格地说,文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型(Abstract data type)。

2. 存储设备和文件系统的关系

在嵌入式系统中,与文件系统相关的存储设备包括硬盘、Flash存储器等。Flash存储器又分为Flash芯片设备(Raw Flash device,也叫MTD设备)和带Flash控制器的设备(Flash Translation Layer device FTL设备),两者的关键区别是是否带有Flash控制器,这也直接决定了文件系统分为不同的两类。

  嵌入式文件系统简介(一) —— Linux MTD设备文件系统_嵌入式

2.1 MTD设备和FTL设备比较

其中MTD设备包括NOR FlashNAND Flash等,FTL设备包括SDeMMCSSDUSB大容量存储设备等。如 2.1 2.2所示JFFS2YAFFS2UBIFLogFS支持MTD设备,FATEXT3/4XFSBtrfs支持 FTL设备和硬盘(HDD)。MTD设备对应的设备文件为/dev/mtdFTL设备对应的设备文件可为/dev/mtdblock

嵌入式文件系统简介(一) —— Linux MTD设备文件系统_UBIFS_02

2.2 Linux文件系统软件模块图

3. MTD设备文件系统

3.1.1   JFFS2

JFFS意为“Journaling Flash File System”,该文件系统是瑞典Axis通信公司开发的一种基于Flash存储器的日志文件系统。该公司于1999年在GNU/Linux上发行了第一版JFFS文件系统,后来经过Redhat公司的发展,发行了第二个版本的JFFS2JFFS2 是一个日志结构(log-structured)的文件系统,将文件系统的数据和原数据以节点的形式存储在闪存上。主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使JFFS2的运行速度大大放慢。

JFFS2的缺点包括:挂载时间过长;对芯片存储块读写不均衡;扩展性较差等。JFFS2不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致JFFS2为维护日志节点所占用的内存空间迅速增大,另外,JFFS2文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。扩展资料https://www.ibm.com/developerworks/cn/linux/l-jffs2/

3.1.2   YAFFS2

YAFFS/YAFFS2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与JFFS2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统。

    YAFFS/YAFFS2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTDVFS,直接对文件系统操作。当然,YAFFS也可与MTD驱动程序配合使用。这方便了其跨平台移植。

YAFFSYAFFS2的主要区别在于,前者仅支持小页(512 Bytes)NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,YAFFS2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。

3.1.3   UBIFS

UBIFSUnsorted Block Image File System)最早在2006年由IBMNokia的工程师Thomas GleixnerArtem Bityutskiy所设计,专门为了解决MTDMemory Technology Device)设备所遇到的瓶颈。由于NAND Flash容量的暴涨,YAFFS等皆无法再去控制NAND Flash的空间。UBIFS通过子系统UBI处理与MTD device之间的动作。与JFFS2一样,UBIFS 建构于MTD device 之上,因而与一般的block device不兼容。

UBIFS在设计与性能上均较YAFFS2JFFS2更适合NAND Flash,例如:UBIFS 支持 write-back, 其写入的数据会被cache, 直到有必要写入时才写到Flash,大地降低分散小区块数量并提高I/O效率。UBIFS文件系统目录存储在Flash上,UBIFS mount时不需要scan整个Flash的数据来重新创建文件目录。支持on-the-flight压缩文件数据,而且可选择性压缩部份文件。另外UBIFS使用日志(journal),可减少对Flash index的更新频率。扩展阅读https://blog.csdn.net/younger_china/article/details/12651909

3.1.4   总结

当前主流的选择是UBIFSYAFFS2,如果是非Linux系统可以选用移植性较好的YAFFS2。具体的比较见 3.1 3.2。扩展阅读资料https://elinux.org/images/7/7e/ELC2009-FlashFS-Toshiba.pdf

嵌入式文件系统简介(一) —— Linux MTD设备文件系统_嵌入式_03

3.1 MTD设备文件系统比较

嵌入式文件系统简介(一) —— Linux MTD设备文件系统_Linux_04

3.2 MTD设备文件系统选用建议