Linux系统移植(四) -- 根文件系统
文件系统的制作和移植是系统移植的最后一道工序了,在进行这一步之前,我们需要搞懂几个问题:
1.什么是文件系统?
2.如何实现文件系统?
3.常用的文件系统有哪些?为什么需要这些文件系统?
首先我们先讲清楚这几个问题。
文件系统我们在日常生活中则很少听说,但是它确实存在,只是名字不叫文件系统罢了,一般叫资料库。资料库里面的文件众多,我们如何快速准确的找到我们要的那份文件呢?资料库采用了分类索引的方法来实现快速查找。类似于我们学校图书馆的管理方式,一楼可能是哲学类,二楼是社科类的,三楼是电子类的,四楼是计算机类的…………等等,我们把这种进行了分类索引的资料库叫文件系统。
对于计算机而言,文件其实就是资料数据,只能存储在物理介质上面,比如:硬盘,但是我们人不可能自己读取物理介质上的文件,或者自己把文件写入物理介质,物理介质上文件的读写只能采用程序来完成,为了方便实现,程序又被分成了物理介质驱动程序、内容存储程序和文件内容存储程序。物理介质驱动程序专门用于从物理介质上存取数据;内容存储程序用于把文件内容和文件属性信息打包;文件内容存储程序用于把用户输入形成文件内容,或者取得文件内容显示出来。
我们可以把一个文件系统(倒树)分解成多个文件系统(倒树)分别存放到存储介质上,比如:一个存储到光盘里,一个存储到硬盘中,在使用时,我们把光盘里的文件系统的根目录挂到硬盘文件系统的一个目录下面,这样访问这个目录就相当于是访问光盘的根目录了,找到了根目录,我们也就可以访问整个光盘上的文件系统了。
“在Linux系统中一切皆是文件”这句话是我们学习Linux系统的时候常常听到的一句话。虽然有些夸张,但是它揭示了文件系统对于Linux系统的重要性;实际上文件系统对于所有的操作系统都很重要,因为它们把大部分的硬件设备和软件数据以文件的形式进行管理。Linux系统对设备和数据的管理框架图如下:
-
VFS(virtual file system)是虚拟文件系统,它管理特殊文件(虚拟文件)、磁盘文件和设备文件
-
fs_operations结构是由一系列文件操作接口函数组成,由文件系统层来完成,为VFS提供文件操作;
-
在文件系统层,磁盘文件要实现各种文件系统(如:ext2),设备文件要实现各种抽象的设备驱动
-
在设备驱动层,磁盘驱动要实现各种磁盘的驱动程序,其他设备驱动要实现具体的设备驱动
-
物理层就是设备自身
那么为什么会有不同的文件类型呢
由于存储介质有很多种,所以没有办法用一种统一的格式存放文件系统到各种不同的存储介质上,而是需要多种不同的存储格式来适应各种存储介质的特性,以求达到存取效率和空间利用率的最优化,这样就需要对每种存储格式制定一个规范,这写规范就叫文件系统类型。常见的文件系统类型有:
FAT16
FAT16、FAT32、NTFS
Minix、ext、ext2 、ext3 、ISO9660 、jffs2, yaffs, yaffs2、cramfs, romfs, ramdisk, rootfs、proc、sysfs、usbfs、devpts、 tmpfs & ramfs、 NFS
由此可见,Linux支持的文件系统最多。以不同的介质来分类,又可以分为
-
磁盘 FAT16、 FAT16、FAT32、NTFS、ext、ext2 、ext3、Minix
-
光盘 ISO9660、Flash jffs2, yaffs, yaffs2、cramfs, romfs
-
内存 Ramdisk、tmpfs & ramfs
-
虚拟 rootfs、proc、sysfs、usbfs、devpts、NFS
常用的存储介质理论上都可以用于存储Linux支持的文件系统;因为我们这里只研究嵌入式系统,而嵌入式系统由于体积和移动特性的限制,不能采用磁盘和光盘,所以只能采用flash类的存储设备、内存和虚拟存储设备作为文件系统的存储质;
flash芯片的驱动程序是由系统来提供,所以它的存取特点完全是flash自身的特点,这时最好有更加适合flash的文件系统——Jffs、Yaffs、Cramfs和Romfs。这些文件系统都是嵌入式Linux系统中常用的文件系统,可以根据特点来选择使用它们,特点如下表:
文件系统类型 | 特点 |
Jffs | A.针对NOR Flash的实现 B.基于哈希表的日志型文件系统 C.采取损耗平衡技术,每次写入时都会尽量使写入的位置均匀分布 D.可读写,支持数据压缩 E.崩溃/掉电安全保护 F.当文件系统已满或接近满时,因为垃圾收集的关系,运行速度大大放慢 |
Yaffs | A.针对Nand Flash的实现 B.日志型文件系统 C.采取损耗平衡技术,每次写入时都会尽量使写入的位置均匀分布 D.可读写,不支持数据压缩 E.挂载时间短,占用内存小 F.自带Nandflash驱动,可以不使用VFS和MTD |
crams | A.单页压缩,支持随机访问,压缩比高达2:1 B.速度快,效率高 C.只读,有利于保护文件系统免受破坏,提高了系统的可靠性,但是无法对其内容进行 |
Romfs | A.简单的、紧凑的、只读的文件系统 B.顺序存放数据,因而支持应用程序以XIP(execute In Place,片内运行)方式运行,在系统运行时,节省RAM空间 |
注意:这些文件系统都是基于MTD驱动的。
特有的文件系统类型:Ramdisk文件系统
在Linux系统中,内存经常用于存储文件系统,这种叫做Ramdisk,Ramdisk有两种,一种是完全把内存看成物理存储介质,利用内存模拟磁盘,运用磁盘的文件系统类型;另一种只是在内存中存储了文件系统逻辑结构,运用tmpfs & ramfs文件系统类型:
tmpfs & ramfs
概述
用物理内存模拟磁盘分区,挂载这种分区后,就可以跟读写磁盘文件一样读写这里面的文件,但是操作速度要比磁盘文件快得多;所以一般应用在下面几个方面:
1)读写速度要求快的文件应该放在这种文件系统中
2)磁盘分区为flash的情况下,把需要经常读写的文件放在这种文件系统中,然后定期写回flash
3)系统中的临时文件,如/tmp、/var目录下的文件应该放在这种文件系统中
4)/dev设备文件(因为设备文件随驱动和设备的加载和卸载而变化),应该放在这种文件系统中
特点
1)由于数据都存放在物理内存中,所以系统重启后,这个文件系统中的数据会全部丢失
2)ramfs在没有指定最大的大小值情况下,会自动增长,直到用掉系统中所有的物理内存为止,这时会导致系统的崩溃,建议挂载时最好限定其最大的大小值
3)tmpfs如果指定了大小值,自动增长至大小值后,系统会限定它的大小;这个文件系统占用的物理内存页可以背置换到swap分区,但是ramfs不行
了解了什么是根文件系统以及根文件系统的分类后,我们下一步就要看下怎么来制作根文件系统了。但是这个步骤比较繁琐,受制于篇幅,将会另写一篇文章来讲述。