转自 http://www.mcuos.com/thread-3822-1-10.html 一.文件系统简介 理论上说一个嵌入式设备若是内核可以运行起来,且不须要运行用户进程的话,是不须要文件系统的,文件系统简单的说就是一种目录结构,因为linux操做系统的设备在系统中是以文件的形式存在,将这些文件进行分类管理以及提供和内核交互的接口,就造成必定的目录结构也就是文件系统,文件系统是为用户反映系统的一种形式,为用户提供一个检测控制系统的接口。 根文件系统,我认为根文件系统就是一种特殊的文件系统,那么根文件系统和普通的文件系统有什么区别呢?因为根文件系统是内核启动时挂在的第一个文件系统,那么根文件系统就要包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都须要有init目录下的相关文件,在Linux挂载分区时Linux必定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux系统启动所必须的文件均可以成为根文件系统。 Linux支持多种文件系统,包括ext二、ext三、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各种文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual FileSystem),为各种文件系统提供一个统一的操做界面和应用编程接口。 Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。以后能够自动或手动挂载其余的文件系统。所以,一个系统中能够同时存在不一样的文件系统。 不一样的文件系统类型有不一样的特色,于是根据存储设备的硬件特性、系统需求等有不一样的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),经常使用的基于存储设备的文件系统类型包括:jffs2,yaffs,cramfs, romfs, ramdisk, ramfs/tmpfs等。 1. 基于FLASH的文件系统 Flash(闪存)做为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操做只能把对应位置的1修改成0,而不能把0修改成1(擦除Flash就是把对应存储块的内容恢复为1),所以,通常状况下,向Flash写入内容时,须要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。 闪存主要有NOR和NAND两种技术。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。所以,必须针对Flash的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用做Flash的文件系统会有诸多弊端。 一块Flash芯片能够被划分为多个分区,各分区能够采用不一样的文件系统;两块Flash芯片也能够合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。 在嵌入式Linux下,MTD(MemoryTechnologyDevice,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD驱动程序的主要优势在于,它是专门针对各类非易失性存储器(以闪存为主)而设计的,于是它对Flash有更好的支持、管理和基于扇区的擦除、读/写操做接口。 (1) jffs2 JFFS文件系统最先是由瑞典AxisCommunications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,因此JFFS2也能够用在Linux, uCLinux中。 Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2) 主要用于NOR型闪存,基于MTD驱动层,特色是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,由于垃圾收集的关系而使jffs2的运行速度大大放慢。 jffs不适合用于NAND闪存主要是由于NAND闪存的容量通常较大,这样致使jffs为维护日志节点所占用的内存空间迅速增大,另外,jffs文件系统在挂载时须要扫描整个FLASH的内容,以找出全部的日志节点,创建文件结构,对于大容量的NAND闪存会耗费大量时间。 (2) yaffs:Yet Another Flash File System yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减小了一些功能(例如不支持数据压缩),因此速度更快,挂载时间很短,对内存的占用较小。另外,它仍是跨平台的文件系统,除了Linux和eCos,还支持WinCE,pSOS和ThreadX等。 yaffs/yaffs2自带NAND芯片的驱动,而且为嵌入式系统提供了直接访问文件系统的API,用户能够不使用Linux中的MTD与VFS,直接对文件系统操做。固然,yaffs也可与MTD驱动程序配合使用。 yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提高。 (3) Cramfs:Compressed ROM File System Cramfs是Linux的创始人 LinusTorvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。在cramfs文件系统中,每一页(4KB)被单独压缩,能够随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可经过更低容量的FLASH存储相同的文件,从而下降系统成本。 Cramfs文件系统以压缩方式存储,在运行时解压缩,因此不支持应用程序以XIP方式运行,全部的应用程序要求被拷到RAM里去运行,但这并不表明比Ramfs需求的RAM空间要大一点,由于Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一会儿就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当咱们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。 另外,它的速度快,效率高,其只读的特色有利于保护文件系统免受破坏,提升了系统的可靠性。 因为以上特性,Cramfs在嵌入式系统中应用普遍。 可是它的只读属性同时又是它的一大缺陷,使得用户没法对其内容对进扩充。 Cramfs映像一般是放在Flash中,可是也能放在别的文件系统里,使用loopback 设备能够把它安装别的文件系统里。 (4) Romfs 传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,于是支持应用程序以XIP(eXecuteInPlace,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统一般采用Romfs文件系统。 其余文件系统:fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA,Smartphone,数码相机等的SD卡),这主要是为了更好的与最流行的Windows桌面操做系统相兼容。ext2也能够做为嵌入式Linux的文件系统,不过将它用于FLASH闪存会有诸多弊端。