1 / 54

嵌入式系统 第九章 嵌入式 Linux 的文件系统

嵌入式系统 第九章 嵌入式 Linux 的文件系统. 第九章 Agenda. 9.1 Linux 的文件系统结构概要 9.2 MTD 9.3 嵌入式 Linux 专用的文件系统 9.4 如何构造根文件系统 9.5 Ramdisk. 9.1 Linux 的文件系统结构概要. 9.1.1 Linux 文件系统的特点 9.1.2 Mount 命令 9.1.3 文件的类型 9.1.4 Linux 常见的文件系统 9.1.5 VFS . 9.1.1 Linux 文件系统的特点. 文件系统是指操作系统中于管理文件有关的软件和数据。

abra
Download Presentation

嵌入式系统 第九章 嵌入式 Linux 的文件系统

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 嵌入式系统 第九章 嵌入式Linux 的文件系统

  2. 第九章 Agenda 9.1 Linux 的文件系统结构概要 9.2 MTD 9.3 嵌入式Linux 专用的文件系统 9.4 如何构造根文件系统 9.5 Ramdisk

  3. 9.1 Linux 的文件系统结构概要 • 9.1.1 Linux 文件系统的特点 • 9.1.2 Mount 命令 • 9.1.3 文件的类型 • 9.1.4 Linux 常见的文件系统 • 9.1.5 VFS

  4. 9.1.1 Linux 文件系统的特点 • 文件系统是指操作系统中于管理文件有关的软件和数据。 • Linux的文件系统和Windows中的文件系统是有很大的区别的 • Windows文件系统是以驱动器的盘符为基础的,而且每一个目录是与相应的分区对应,例如“C:\Projects”是指此文件在C盘这个分区下。 • 而Linux恰好相反,文件系统是一个文件树,且它的所有文件和外部设备(如硬盘,光驱等)都是以文件的形式挂结在这个文件树上,例如“\dev\floppy”。对于Windows而言,就是指所有分区都是在一些目录下。 • 总之,在Windows下,目录结构属于分区;Linux下,分区属于目录结构。

  5. Mount • 在Linux中把每一个分区和某一个目录相对应,以后在对这个目录的操作就是对这个分区的操作,这样就实现了硬件管理手段和软件目录管理手段的统一,这个把分区和目录对应的过程叫做挂载(Mount),而这个挂载在文件树中的位置就是挂载点。这种对应关系可以由用户随时中断和改变。

  6. Linux的目录结构

  7. 9.1.2 Mount 命令 • mount命令的功能是加载指定的文件系统。 • 它的语法如下所示: • mount [-afFhnrvVw] [-L<标签>] [-o<选项>] [-t<文件系统类型>] [设备名] [加载点] • 例如:Mount -t vfat /dev/hda1 /mnt/c

  8. 9.1.3 文件的类型 • Linux中的文件类型与Windows中的文件类型有显著区别,其中最显著的区别在于Linux对目录和设备都当作文件来进行处理,这样就简化了对各种不同类型设备的处理,提高了效率。 • 普通文件 • 目录文件 • 链接文件 • 设备文件

  9. 1. 普通文件 • 普通文件如同Windows中的文件一样,是用户日常使用最多的文件。它包括文本文件,shell脚本,二进制的可执行程序和各种类型的数据。

  10. 2. 目录文件 • 在Linux中,目录也是文件,它们包含文件名和子目录名以及指向那些文件和子目录的指针。 • 目录文件是Linux中存储文件名的唯一地方,当把文件和目录对应起来的时候,也就是用指针将其链接起来的之后,就构成了目录文件。 • Linux系统中的每个文件都被赋予一个唯一的数值,而这个数值被称做索引节点。一个索引节点包含文件的所有信息 • Linux文件系统把索引节点号1赋于根目录,这也就是Linux的根目录文件在磁盘上的地址。 • Linux通过上下链接目录文件系统来实现对整个文件系统的操作。

  11. 3. 链接文件 • 链接文件(软链接)有些类似于Windows中的“快捷方式”,但是它的功能更为强大。它可以实现对不同的目录、文件系统甚至是不同机器上的文件直接访问,并且不需要重新分配磁盘空间。

  12. 硬链接 • 目录中每一对文件名和inode的对应关系称为一个硬链接。显然一个inode号可以出现在多个目录中,甚至可以在一个目录中多次出现,也就是说,一个文件可以有多个不同的名称 • 硬链接是一个指针,指向文件索引节点,系统并不为它重新分配inode。 • 硬链接节省空间,是Linux系统整合文件系统的传统方式 • 存在不足之处: • 不可以在不同文件系统的文件间建立链接 • 只有超级用户才可以为目录创建硬链接。 • 硬连接的命令是 • ln-dexistfilenewfile • 在/home/longcheng中建立file2的硬链接 ln file2 /home/longcheng/file2hard

  13. 软链接 • 软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。 • 命令格式: • ln[-s]source_pathtarget_path • 例如:ln-shttpd.confhttpd2.conf

  14. 区别 • 硬链接原文件&链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件&链接文件拥有不同的inode号,表明他们是两个不同的文件; • 在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系; • 链接数目是不一样的,软链接的链接数目不会增加; • 文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的,而软链接显示的大小与原文件就不同了。

  15. 4. 设备文件 • Linux把设备都当作文件来进行操作,这样就大大方便了用户的使用。在Linux中,与设备相关的文件一般都在/dev目录下,它包括两种,一种是块设备文件,另一种是字符设备文件。 • 块设备文件是指数据的读写,它们是以块(如由柱面和扇区编址的块)为单位的设备,最简单的如硬盘(/dev/hda1)等。字符设备主要是指串行端口等接口设备。

  16. 9.1.4 Linux 常见的文件系统 • EXT2 • Ext2是GNU/Linux系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。其单一文件大小及文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的X86系统中,簇最大为4KB,则单一文件大小上限为2048GB,而文件系统的容量上限为16384GB。

  17. 9.1.4 Linux 常见的文件系统 • Ext3 • Ext3是Ext2的下一代,也就是在保有目前Ext2的格式之下再加上日志功能。 • 日志文件系统(Journal File System) :它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。

  18. 9.1.4 Linux 常见的文件系统 • swap • Linux中有一种专门用于交换分区的swap文件系统,Linux使用整个分区来作为交换空间,而不像Windows使用交换文件。 • 一般这个SWAP格式的交换分区的容量大小是主内存的2倍。

  19. 9.1.5 VFS • 虽然Linux内核是用C语言写的,但是其中借鉴了很多“面向对象”的思想 • VFS层类似于面向对象理论中的“抽象基类”的概念,而下面的一个个具体文件系统就相当于是这个抽象基类的“派生类”。 • 所有对文件的操作如open,write,read等在VFS中只是实现了一个类似于“纯虚函数”的接口,针对每种具体的文件系统,就会使用其派生类中被“改写”的“虚函数”。

  20. 9.1.5 VFS • 这样一来就可以面向用户界面(系统调用)提供一个统一的编程接口。例如用户可以在不同的文件系统上创建文件,但所使用的函数或命令都是相同的。

  21. 第九章 Agenda 9.1 Linux 的文件系统结构概要 9.2 MTD 9.3 嵌入式Linux 专用的文件系统 9.4 如何构造根文件系统 9.5 Ramdisk

  22. 9.2 MTD • 在Linux下,MTD(Memory Technology Device,存储技术设备)是用于访问存储设备(如ROM和Flash等)的系统。 • MTD的主要目的是为了使新的存储设备的驱动更加简单,为此,它在硬件和上层间提供了一个统一的抽象接口,把文件系统和存储设备相隔离。

  23. MTD驱动程序 • MTD驱动程序是在Linux下专门为嵌入式环境应用而开发的一类驱动程序。 • 相对于常规的块设备驱动程序,使用MTD驱动程序的主要优点在于,它主要是专门针对各种非易失性存储器(以Flash为主)而设计的,所以它对Flash又更好的支持,管理和基于扇区的擦除,读写操作的接口。

  24. MTD驱动程序 • MTD的所有源代码在/drivers/mtd子目录下。以CFI(Common Flash Interface,通用Flash接口)的MTD设备为例,可把MTD驱动程序分为4层 • Flash硬件驱动层 • MTD原始设备层 • MTD设备层 • 设备节点

  25. 1. Flash硬件驱动层 • 负责在初始化时驱动Flash硬件。 • Linux MTD设备的NOR Flash芯片驱动遵循CFI接口标准,其驱动程序位于/driver/mtd/chips子目录下 • NAND型Flash的驱动程序则位于/drivers/mtd/nand子目录下。

  26. 2. MTD原始设备层 • 由两部分组成: • 一部分是MTD原始设备的通用代码 • 另一部分是各个特定的Flash的数据,例如分区。 • 用于描述MTD原始设备的数据结构是mtd_info,这其中定义了大量关于MTD的数据和操作函数。 • Mtd_table(mtdcore.c)则是所有MTD原始设备的列表 • mtd_part(mtd_part.c)是用于表示MTD原始设备分区的结构,其中包含了mtd_info,因为每个分区都是被看成一个MTD原始设备加在mtd_table中。

  27. 3. MTD设备层 • Linux系统可定义出MTD的块设备(主设备号31)和字符设备(主设备号90)。 • MTD字符设备的定义通过注册一系列字符设备操作函数,这些是在mtdchar.c中实现的。 • MTD块设备则是定义了一个描述MTD块设备的结构mtdblk_dev,并声明了一个名为mtdblks的指针数组,该数组中的每个mtdblk_dev成员与mtd_table中的mtd_info一一对应。

  28. 4.设备节点 • 通过mknod在/dev子目录下建立MTD字符设备节点(主设备号为90)和MTD块设备节点(主设备号为31) • 通过访问此设备节点即可访问MTD字符设备的块设备。

  29. 9.3 嵌入式Linux 专用的文件系统 • 9.3.1 JFFS/JFFS2 • 9.3.2 YAFFS/YAFFS2 • 9.3.3 Cramfs

  30. 背景知识:Flash • Flash和EEPROM都是常用的非易失性存储(即系统掉电以后,存储器中的数据仍然可以保存)技术。在使用上Flash和EEPROM最主要的区别是什么呢? • 从容量上说,随着Flash技术的发展,Flash的容量远远超过EEPROM • 最主要的区别还是在读写特性上。Flash在写入之前,必须要经过擦除(erase)操作,而且擦除只能以块(block)为单位,整块擦除,即使要修改一个字节的数据,也需要擦除整个块的内容;而EEPROM是可以逐字节修改的。

  31. Flash特点 • Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1。例如:Flash中一个地址事先保存的数据为0x55,再对其写入0xAA,结果读取到的数据就是0x00。也就是说,Flash的写入其实是按照逻辑“与”特性进行的,其结果是写入的数据和原有数据的逻辑“与”结果。要想使数据从0恢复成1,则必须进行擦除操作,擦除必须按块进行,一次擦除整个块的数据都被修改为0xFF。 • 按照这种特性,在某些情况下,不要求写入Flash前一定要先擦除。例如,要利用Flash存储器记录一个采样的数据,每秒得到4字节的采样结果并保存。没有必要每次写入都擦除整个块的数据(这会减少Flash的寿命);也不能等攒够一个Flash块的数据再写入(这个写入时间太长,有可能因为系统掉电而丢失一段时间的数据)。利用Flash的写入特性,只需擦除一个块的数据,然后按照记录顺序写入即可(因为不需要修改原来的数据)。

  32. NOR和NAND • NOR(或非)和NAND(与非)是现在市场上2种主要的非易失闪存技术 • Intel公司于1988年首先开发出NOR Flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。 • 1989年,Toshiba公司发表NAND Flash结构,强调降低每比特的成本,提供更高的性能,并且像磁盘一样可通过接口轻松升级

  33. NOR和NAND • NOR的传输效率较高,再1-4MB的小容量时有明显的成本优势,但是很低的写入和擦除速度大大影响了它的性能。 • NAND结构能提供极高的单元密度,可达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于Flash的管理和需要特殊的系统接口。

  34. NOR和NAND比较 • 1. 性能比较 • 从软件角度来说,对Flash设备的写入速度,其实是写入和擦除的综合速度。NAND器件执行擦除操作是十分简单的,而NOR则要求再进行擦除前先将目标块内的所有位都写为0 • 由于擦除NOR器件时是以64-128KB的块进行的,执行一个块写入/擦除操作的典型时间大概为0.7s;与此相反,擦除NAND器件是以8-32KB的块进行的,执行相同的操作通常不会超过4ms。

  35. NOR和NAND比较 • 2. 接口差别 • NOR Flash的接口时序与SRAM一样,它与支持Host Bus的嵌入式处理器很容易连接。有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。 • NAND Flash使用地址和数据通用的I/O口,通过多次寻址存取数据。通常,其读和写操作采用512(或者2K)字节的页(page),这更类似于硬盘管理的操作,自然地,基于NAND的存储器就可以取代硬盘或其他块设备,但实际上还要考虑Flash均匀磨损的问题。

  36. NOR和NAND比较 • 3. 容量和成本 • NOR Flash常见的容量1-32MB,主要应用在代码存储介质中; • 而NANDFlash通常应用在8-128MB的产品中,它更适合于数据存储。NAND在Compact Flash,Secure Digital,PCCCards和MMC存储卡市场上所占份额较大。

  37. NOR和NAND比较 • 4. 可靠性和耐用性 • 寿命:在NAND闪存中每个块的最大擦写次数是一百万次甚至千万次;而NOR的擦写次数是十万次数量级 • 位交换:所有Flash器件都受位交换现象的困扰。在某些情况下,一个比特位会发生反转。NAND发生的次数要比NOR多 ,需要使用错误探测/错误更正(EDC/ECC)算法 • NAND器件中的坏块是随机分布的,所有NAND器件需要对介质进行初始化扫描,以发现坏块,并将坏块标记为不可用 • 可以非常直接地使用基于NOR的闪存,它像SRAM等存储器那样连接,并能在上面直接运行代码;而NAND因为有特殊的时序,访问起来要复杂一些

  38. 9.3.1 JFFS/JFFS2 • 2000年,Axis公司发布了日志式Flash文件系统jffs • 2001年初,Red Hat公司在此基础上推出了jffs2文件系统。 • 它们都是针对嵌入式系统中的Flash存储器进行设计的。

  39. (1)JFFS存储格式 • 第一版本的jffs是一个日志结构的文件系统。在Flash的存储空间中,数据和辅助信息都依次存放于其中。 • 在该文件系统中,只有一种文件节点,它通过jffs_raw_inode这个结构进行描述。每个这样的节点都关联到某个文件上,其中包含了一个简单的头部,辅助信息以及存储的数据。 • 由于在jffs中,大的文件都分为很多节点存放,所以除了必须存放数据之外,还要额外保存这段数据在文件中的偏移量。

  40. (2)文件系统操作的实施过程 • 挂接 • 读取 • 改变属性

  41. (3) 空间回收 • 在进行空间回收时,系统自动从所有存储块中的第一个开始进行分析,不断将废弃的节点回收,将尚在使用的节点进行合并,这样最终合成出整个的一块废弃的Flash存储块,这样就可以将这一整块存储块的内容一次性擦除,成为新的空闲块。

  42. (4) 缺陷 • 关于空间回收,jffs并没有进行太多优化。 • 不支持对数据进行压缩之后进行存储。 • 不支持硬链接,每一个存储块中都保存了对应的文件名

  43. JFFS2:改进 • jffs2的节点头部中增加了一些新的信息,包括CRC校验码和节点类型等。 • 由于jffs空间回收方式的缺陷,在jffs2中,所有的存储节点都不可以跨越Flash的块界限了。 • jffs2不再像jffs中只有一种节点,现在有3种节点类型了,分别用于表示擦除块的标记,普通文件,目录。 • 文件系统的信息并不是像jffs中那样,全部保存在内存之中。可以很快取得的数据并不保存在内存之中,这样可以提高内存的利用率。 • 增加了对数据的压缩。 • 开始支持硬链接。

  44. 9.3.2 YAFFS/YAFFS2 • 虽然JFFS/JFFS2是针对Flash建立的文件系统,它可支持NOR和NAND Flash,但是把它应用于NAND Flash还存在如下问题: • JFFS需要通过建立在内存中的jffs_node结构体维护Flash中的日志节点,每个节点需要占用48个字节的内存空间。 • JFFS/JFFS2在挂载时需要扫描整个Flash的内容,以找出所有的日志节点,建立文件结构

  45. YAFFS • YAFFS(Yet Another Flash File System)是专门针对NAND Flash特点编写的日志文件系统。它克服了JFFS/JFFS2的缺点,具有如下特性: • 很小的内存空间占用。 • 很短的挂载时间。 • 跨平台的文件系统。

  46. YAFFS2 • YAFFAS是效果很理想的NAND Flash上的文件系统 • 但它不支持数据压缩,而且它仅对512字节页(后简称小页)大小的NAND Flash存储器。而很多大容量的NAND Flash(128MB以上),使用大小为2KB的页(后简称为大页),YAFFS并不能支持这种Flash。 • YAFFS2是为此而开发出来的。YAFFS2实现对大页Flash的支持。同时,YAFFS2在内存空间占用,垃圾回收速度,读写速度等方面均有大幅度提升。

  47. 9.3.3 Cramfs • CRAMFS最初是Linus Torvalds 编写的一个文件系统,具有简单、压缩和只读等特点。是用于保存只读的根文件系统内容的一个很好的方案。 • CRAMFS 主要的优点:是将文件数据以压缩形式存储,在需要运行的时候进行解压缩。由于它存储的文件形式是压缩的格式,所以文件系统不能直接在 Flash 上运行。虽然这样可以节约很多Flash 存储空间,但是文件系统运行需要将大量的数据拷贝进RAM 中,造成一定的浪费。

  48. 创建CRAMFS 根文件系统映像 • 需要相关的文件系统工具mkcramfs 和cramfsck。mkcramfs 在一般的桌面Linux 系统中都可以找到,如果没有的话我们可以从内核源代码编译和安装这些工具。这两个工具的源代码位于内核源代码的 scripts/cramfs 目录下,可以直接编译: • user$ cd ${KERNELDIR}/scripts/cramfs • user$ make • 然后把生成的mkcramfs 和cramfsck 拷贝到系统执行路径中就可以使用了。 • 可以使用如下命令来制作一个CRAMFS 映像,${ROOTFS}为目标根文件系统所在目录: • user$ mkcramfs ${ROOTFS}/ cramfs.img

  49. 9.4 如何构造根文件系统 • 9.4.1 根文件系统的基本结构 • 9.4.2为嵌入式系统建立一个完整的文件系统

  50. 9.4.1 根文件系统的基本结构(书)

More Related