`
字符串
  • 浏览: 37810 次
文章分类
社区版块
存档分类
最新评论

嵌入式linux文件系统简介

 
阅读更多

Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统 进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。
不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为 RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。

基于RAM的文件系统
initramfs
initramfs在编译内核的同时被编译并与内核生成一个映像文件,可以压缩也可以不压缩,但是目前只支持cpio包格式。它是根文件系统制作和制作的一种非常简单的方法,也可以通过执行这个文件系统中的程序引导真正的文件系统,这样加载根文件系统的工作就不是内核的工作,而是initramfs的工作。由于initramfs使用cpio包格式,所以很容易将一个单一的文件、目录、node编译链接到系统中去,这样很简单的系统中使用起来很方便,不需要另外挂接文件系统。
但是因为cpio包实际是文件、目录、节点的描述语言包,为了描述一个文件、目录、节点,要增加很多额外的描述文字开销,特别是对于目录和节点,本身很小额外添加的描述文字却很多,这样使得cpio包比相应的image文件大很多。
ramdisk
ramdisk是一种基于内存的虚拟文件系统(并非一个实际的文件系统),它将一部分固定大小(这个大小在编译内核的make menuconfig时配置)的内存当作硬盘一个分区来使用。ramdisk是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统,通常我们会使用ext2或ext3文件系统来格式化它。由于ramdisk是在内存中进行操作的,所以我们可以对里面的文件进行添加,修改,删除等等操作,但是一掉电,就什么也没有了。由于这个特性,我们可以将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,这样可以明显地提高系统的性能。
在Linux的启动阶段,内核和ramdisk都是由 bootloader在启动时加载至内存的指定位置(),而initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。initrd 是boot loader initialized RAM disk,顾名思义是在系统初始化引导时候用的ramdisk,它的作用是完善内核的模块机制,让内核的初始化流程更具弹性。 
ramfs/tmpfs
Ramfs是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。但他们都不可以像ramdisk一样作为根文件系统,而只能像procfs,devfs一样作为伪文件系统使用。
nfs
NFS网络文件系统(Network File System)是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。
伪文件系统
以上讨论的都是基于存储设备的文件系统(memory-based file system),它们都可用作Linux的根文件系统(除tmpfs和ramfs外)。实际上,Linux还支持逻辑的或伪文件系统(logical or pseudo file system),例如procfs(proc文件系统),用于获取系统信息,以及devfs(设备文件系统)和sysfs,用于维护设备文件。
基于FLASH的文件系统
Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为 单位进行的。
闪存主要有NOR和NAND两种技术(简单比较见附录)。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因 此,必须针对Flash的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。
在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见下面的Linux下的文件系统结构图)。使用MTD驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有 更好的支持、管理和基于扇区的擦除、读/写操作接口。
顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。
jffs2
JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2(Journalling Flash FileSystem v2,日志闪存文件系统版本2 )是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所JFFS2也可以用在Linux, uCLinux中。它主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。
Jffs2不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs2为维护日志节点所占用的内存空间迅速增大,另外,jffs2文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。
目前jffs3正在开发中,关于jffs2系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。
yaffs2
yaffs/yaffs2(Yet Another Flash File System)是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数 据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。
yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。
ubifs
无排序区块图像文件系统(Unsorted Block Image File System, UBIFS)是用于固态硬盘存储设备上,并与LogFS相互竞争,作为JFFS2的后继文件系统之一。真正开始开发于2007年,并于2008年10月第一次加入稳定版本于Linux核心2.6.27版。UBIFS最早在2006年由IBM与Nokia的工程师Thomas Gleixner,Artem Bityutskiy所设计,专门为了解决MTD(Memory Technology Device)设备所遇到的瓶颈。由于Nand Flash容量的暴涨,YAFFS等皆无法再去控制Nand Flash的空间。UBIFS通过子系统UBI处理与MTD device之间的动作。与JFFS2一样,UBIFS 建构于MTD device 之上,因而与一般的block device不兼容。
JFFS2运行在MTD设备之上,而UBIFS则只能工作于UBI volume之上。也可以说,UBIFS涉及了三个子系统:
1.         MTD 子系统, 提供对flash芯片的访问接口, MTD子系统提供了MTD device的概念,比如/dev/mtdx,MTD可以认为是raw flash
2.         UBI subsystem,为flash device提供了wear-leveling和 volume management功能; UBI工作在MTD设备之上,提供了UBI volume;UBI是MTD设备的高层次表示,对上层屏蔽了一些MTD不得不处理的问题,比如wearing以及坏块管理
3.         UBIFS文件系统,工作于UBI之上
以下是UBIFS的一些特点:
可扩展性:UBIFS对flash 尺寸有着很好的扩展性; 也就是说mount时间,内存消耗以及I/O速度都不依赖与flash 尺寸(对于内存消耗并不是完全准确的,但是依赖性非常的低); UBIFS可以很好的适应GB flashes;  当然UBI本身还有扩展性的问题,无论如何 UBI/UBIFS都比JFFS2的可扩展性好,此外如果UBI成为瓶颈,还可以通过升级UBI而不需改变UBIFS  
 快速mount:不像JFFS2,UBIFS在mount阶段不需要扫描整个文件系统,UBIFS mount介质的时间只是毫秒级,时间不依赖与flash的尺寸;然而UBI的初始化时间是依赖flash的尺寸的,因此必须把这个时间考虑在内
write-back 支持: 回写或者叫延迟写更准确些吧,同JFFS2的write-through(立即写入内存)相比可以显著的提高文件系统的吞吐量。  
 异常unmount适应度:UBIFS是一个日志文件系统可以容忍突然掉电以及unclean重启; UBIFS 通过replay 日志来恢复unclean unmount,在这种情况下replay会消耗一些时间,因此mount时间会稍微增加,但是replay过程并不会扫描整个flash介质,所以UBIFS的mount时间大概在几分之一秒。
快速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日志方式等技巧。  
on-the_flight compression - 存储在flash介质上的数据是压缩的;同时也可以灵活的针对单个文件来打开关闭压缩; 例如,可能需要针对某个特定的文件打开压缩,或者可能缺省方式下支持压缩,但是对多媒体文件则关闭压缩。
可恢复性 - UBIFS可以从index破坏后恢复; UBIFS中的每一片信息都有一个header来描述,因此可以通过扫描这个flash介质来重构文件系统,这点和JFFS2非常类似;想像一下,如果你擦出了FAT文件系统的FAT表,那么对于FAT FS是致命的错误,但是如果擦除UBIFS的index,你人然可以重构文件系统,当然这需要一个特定的用户空间程序来做这个恢复  
完整性 - UBIFS通过写checksum到flash 介质上来保证数据的完整性,UBIFS不会无视损坏文件数据或meta-data; 缺省的情况,UBIFS仅仅检查meta-data的CRC,但是你可以通过mount选项,强制进行data CRC的检查
cramfs
Cramfs(Compressed ROM File System)是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统,它也基于MTD驱动程序。在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。
Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时 解压缩到RAM中。
另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback设备可以把它安装别的文件系统里。
由于以上特性,Cramfs在嵌入式系统中应用广泛。但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。
romfs
传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以 XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。
其他文件系统
fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA, Smartphone, 数码相机等的SD卡),这主要是为了更好的与最流行的Windows桌面操作系统相兼容。ext2也可以作为嵌入式Linux的文件系统,不过将它用于FLASH闪存会有诸多弊端。

分享到:
评论

相关推荐

    嵌入式Linux根文件系统

    总的来说,嵌入式Linux根文件系统的构建是一项涉及多方面知识的任务,需要熟悉Linux文件系统原理、嵌入式设备特性和软件配置。ubIFS作为现代嵌入式环境中的优选文件系统,其优势在于能够提供高效、可靠的存储解决...

    嵌入式LINUX操作系统.pdf

    嵌入式 LINUX 操作系统 嵌入式 LINUX 操作系统是指在嵌入式系统中使用的 LINUX 操作系统。嵌入式系统是一种专用计算机系统,具有高可靠性、低功耗、低成本、小体积等特点。嵌入式 LINUX 操作系统的特点是可以根据...

    嵌入式linux文件系统---很详细,非常适合初学者

    嵌入式Linux文件系统是专为在嵌入式设备上运行的Linux操作系统设计的一种文件组织结构。对于初学者来说,理解这一概念至关重要,因为它涉及到如何有效地管理和存储数据在这些资源有限但功能强大的设备上。 首先,...

    嵌入式Linux文件系统的设计和实践.nh

    Linux文件系统简介 嵌入式文件系统的几种解决方案 直接针对Flash设备的实现方案 基于DOC设备的JFFS. 基于MTD设备的JFFS VFS和JFFSZ 32MTD抽象层和 文件系统体系结构的设计 支持MTD设备JFFSZ的实现 3JFFSZ映象文件的...

    基于嵌入式Linux平台的最小文件系统的制作

    ### 基于嵌入式Linux平台的最小文件系统制作详解 #### 一、引言 随着嵌入式系统的快速发展,对于嵌入式Linux平台的...通过深入学习这些资料,你可以进一步了解如何根据实际需求定制更加复杂的嵌入式Linux文件系统。

    嵌入式Linux文件系统剪裁方法研究

    ### 嵌入式Linux文件系统剪裁方法研究 #### 引言 文件系统作为操作系统的核心组件之一,承担着管理存储设备上的文件及其提供给操作系统和用户的文件存取、共享和保护功能。其设计的质量直接影响到整个系统的安全性...

    对嵌入式Linux操作系统中的UBIFS文件系统备份方法.docx

    嵌入式Linux操作系统中的UBIFS文件系统备份方法 嵌入式Linux操作系统中的UBIFS文件系统备份方法是指在嵌入式Linux操作系统中对UBIFS文件系统进行备份的方法,以减少由于断电导致数据设置问题。本方法的实现目标是...

    基于嵌入式Linux的无线文件传输系统的实现.pdf

    "基于嵌入式Linux的无线文件传输系统的实现.pdf" 本文将对基于嵌入式Linux的无线文件传输系统的实现进行详细的分析和介绍。 嵌入式Linux 嵌入式Linux是一种基于Linux操作系统的嵌入式系统解决方案。它将Linux操作...

    嵌入式Linux文件系统的构造.pdf

    嵌入式Linux文件系统的构造 Linux操作系统中,文件系统是最基本的资源,它是一个计算机系统内的文件和目录的集合。嵌入式Linux文件系统的构造是嵌入式操作系统中的重要组成部分,因为它需要考虑到嵌入式设备存储...

    嵌入式Linux文件系统

    嵌入式Linux文件系统是操作系统的核心组成部分,负责管理和组织存储设备上的数据,使得程序和用户能够高效地访问和操作文件。文件系统不仅包含常规的文件和目录,还映射了与设备相关的各种实体,如磁盘、打印机和...

    嵌入式Linux文件系统及其存储机制分析 

    ### 嵌入式Linux文件系统及其存储机制分析 #### 一、嵌入式系统存储设备及其管理机制 嵌入式系统与通用个人计算机(PC)有着显著的区别,特别是存储设备方面。通常情况下,嵌入式系统不会使用硬盘作为主要的存储...

    嵌入式Linux系统移植.pdf

    4. 配置和优化Linux文件系统,以满足嵌入式设备的存储需求。 嵌入式Linux系统移植的关键技术包括: 1. Linux内核移植技术,包括内核编译、配置和优化。 2. 嵌入式设备驱动程序开发技术,包括驱动程序的设计、实现...

    ARM嵌入式Linux系统开发详解.zip

    《ARM嵌入式Linux系统开发详解》是一本深入探讨如何在ARM处理器上构建和开发Linux系统的资源集合。ARM架构因其低功耗、高性能的特点,在嵌入式领域广泛应用,而Linux作为开源的操作系统,为开发者提供了丰富的工具和...

    嵌入式Linux操作系统原理与应用

    嵌入式Linux操作系统是将Linux操作系统精简优化后应用于各种嵌入式设备中的核心系统,如智能手机、智能家居、工业控制设备等。它以其开源、稳定、高效和强大的功能深受开发者喜爱。本资料集包含了嵌入式Linux操作...

    嵌入式Linux系统的移植及其根文件系统的实现.pdf

    ### 嵌入式Linux系统的移植及其根文件系统的实现 #### 概述 本文主要讨论了如何在基于ARM9核的硬件平台上构建嵌入式Linux系统,并特别关注根文件系统的实现过程。文中以AT91RM9200微处理器为例,详细介绍了整个...

    嵌入式linux下常见的文件系统

    ### 嵌入式Linux下的常见文件系统 在嵌入式Linux系统中,根据不同的应用场景与硬件特性,选择合适的文件系统对于确保系统稳定运行、提高性能具有重要意义。本文将详细介绍几种常用的文件系统类型及其特点。 #### 1...

    嵌入式Linux系统开发教程(第2版)

    本书系统论述了在Linux 环境下开发嵌入式系统的设计思想、设计方法及开发流程...第9章 嵌入式Linux文件系统 第10章 嵌入式Linux驱动程序开发基础 第11章 嵌入式Linux图形设计 第12章 嵌入式视频监视系统开发实例

    用Busybox制作嵌入式Linux根文件系统.pdf

    嵌入式 Linux 根文件系统制作技术概述 Busybox 作为一个快速工具,可以帮助开发者快速制作嵌入式 Linux 根文件系统。 Busybox 提供了多种 GNU 常用工具、shell 脚本和其他实用工具,总共超过100种。 Busybox 的...

    嵌入式Linux操作系统原理与应用源代码

    《嵌入式Linux操作系统原理与应用源代码》一书由文全刚编著,主要针对嵌入式领域的Linux操作系统进行深入探讨,旨在帮助读者理解其内部工作原理,并掌握实际应用中的编程技巧。这本书包含了丰富的源代码,使得学习...

Global site tag (gtag.js) - Google Analytics