摘要:阐述了Linux系统的文件结构类型,指出了EXT2是在Linux系统中最为常用的文件系统。分析了EXT2文件系统的磁盘布局、索引结点及目录结构,研究了EXT2系统实现按名存取的方法,文件读取速度更高效。关键词:EXT2文件系统;索引结点;混合索引;文件目录
Abstract:DescribethetypeofthefilestructureofLinuxsystems,pointingoutEXT2ismostcommonlyusedinLinuxfilesystem.Analysisofthedisklayout,indexnodesandEXT2filesystemdirectorystructure.StudyaboutthemethodtoachieveaccesstothefilebynameinEXT2systemwhichmakethefilereadmorespeedandefficient.Keywords:EXT2filesystem,indexnode,mixedindex,filedirectory引言
Linux系统的一个重要的特征就是支持多种不同的文件系统,如:EXT、FAT、EXT2、EXT3、SYSV等。目前,Linux主要使用的文件系统是EXT2和EXT3文件系统,也是Linux用户最常用的文件系统。
Linux最早的文件系统是Minix,但是专门为Linux设计的文件系统——扩展文件系统第二版或EXT2被设计出来并添加到Linux中,这对Linux产生了重大影响。EXT2文件系统功能强大、易扩充、性能上进行了全面优化,也是所有Linux发布和安装的标准文件系统类型。
每个实际文件系统从操作系统和系统服务中分离出来,它们之间通过一个接口层:虚拟文件系统或VFS来通讯。VFS使得Linux可以支持多个不同的文件系统,每个表示一个VFS的通用接口。由于软件将Linux文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。Linux的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。
在Linux文件系统中,作为一种特殊类型/proc文件系统只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。/proc文件系统是一个伪文件系统,用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。各种Linux的系统发布都将EXT2作为操作
系统的基础。EXT2文件系统支持标准UNIX文件类型:普通文件、目录文件、特别文件和符号链接。
1.EXT2磁盘布局
EXT2和其他逻辑块文件一样,由逻辑块序列组成,根据用途划分,这些逻辑块通常有:引导块、超级块、inode区及数据区等。
EXT2将其所占的逻辑分区划分为块组,由一个引导块和其他块组组成,每个块组又由超级块、组描述符表、块位图、索引节点位图、索引节点表、数据区构成,如图1所示。
图1EXT2磁盘布局在逻辑空间的映像每个块中保存的这些信息是有关EXT2文件系统的备份信息。当某个块组的超级块或inode受损时,这些信息可以用来恢复文件系统。2.EXT2索引结点
EXT2文件系统中的数据是以数据块的方式存储在文件中的。这些数据块的大小相同,其大小在EXT2创建时设定。磁盘上存储文件的基本单位是簇。一个簇也称为一个磁盘块,它通常是2n个磁盘扇区大小。
EXT2文件系统用一个inode数据结构描述系统中的每一个文件,定义系统的拓扑结构。一个inode描述了一个文件中的数据占用了哪些块以及文件的访问权限、文件的修改时间和文件的类型。EXT2文件系统中的每一个文件都用一个inode描述,而每一个inode都用一个独一无二的数字标识。文件系统的inode都放在一起,在inode索引表中。
EXT2块组中组描述符中的项称为组描述符,用于描述某个块组的整体信息。每个块组都有一个相应的组描述符来描述它,所有的组描述符形成一个组描述符表,并在使用时被调入块高速缓存。
EXT2中每个块组有两个位示图块,一个用于表示数据块的使用情况,叫数据块位图;另一个用于表示索引结点的使用情况,叫索引结点位图。位图中的每一位表示该组中一个数据块或一个索引块的使用情况,用0表示空闲,用1表示已分配。
在Linux的EXT2文件系统中,索引结点inode分为两类,即磁盘索引结点和内存索引结点,通常也分别叫做EXT2inode和VFSinode。(1)磁盘索引节点
磁盘索引节点是指存放在磁盘上的索引节点。每个文件有唯一的一个磁盘索引节点,它主要包括以下内容:
文件所有者标识号:指拥有该文件的文件主或同组的标识符。文件类型:指明文件是普通文件、目录文件还是特别文件等类型。
文件物理地址:指出数据文件所在的物理块号。如在Linux系统中,通过15个地址项来表明文件所在的物理块号。
文件存取权限:用户对文件的操作类型,如读、修改、执行等。文件大小:文件所占有的字节个数。
文件连接计数:指明系统中共享该文件的进程个数。
文件存取时间:指出该文件最近被进程存取的时间、最近被修改的时间及索引节点最近被修改的时间等。(2)内存索引节点
内存索引节点是指存放在内存的索引节点。当文件打开时,要将磁盘索引节点复制到内存索引节点中,便于以后使用。内存索引节点包括以下内容:索引节点编号:标识内存索引节点。
索引节点状态:指示该节点是否已被修改或已被上锁。访问计数:当进程访问该节点时,访问计数加1,访问完再减1。链接指针:指向空闲链表和散列队列的指针。逻辑设备名:含有该文件的文件系统的逻辑设备名。
3.文件的目录结构
Linux文件系统采用带链接的树形目录结构,即只有一个根目录(通常用“/”表示),其中含有下级子目录或文件的信息;子目录中又可含有更下级的子目录或者文件的信息。这样一层一层地延伸下去,构成一棵倒置的树,如图2所示。
图2:linux树形目录结构目录树中,根节点和中间节点(用圆圈表示)都必须是目录,而普通文件和特别文件只能作为“叶子”出现。当然,目录也可以作为叶子。
Linux系统的目录结构采用了将文件名与文件描述信息分开的方法。文件目录由文件名和该文件的索引节点号构成,一个目录项共占16B。其中,文件名占14个字节,索引节点号(或索引节点指针)占2个字节。因此,1KB的盘块中可以存放64(1K/16)个目录项,这样就节省了系统查找及访问文件的时间。在一个共有640个FCB的文件目录中查找一个文件时,平均只需启动磁盘5次,因此大大减少了系统开销。如表1所示为一个文件目录的实例。
表1Linux系统的文件目录一个文件的磁盘索引节点占64个字节,主要包括文件标识符、文件存取权限、文
件物理地址、文件长度、文件连接系数、文件存取时间等一些文件的重要信息。4.文件的物理结构
Linux系统文件的物理结构采用混合索引方式,对分配给文件的磁盘块进行管理。在Linux文件系统的索引节点中存在一项i.addr[14],用于存放该文件的磁盘块号。如图3所示为Linux系统的混合索引文件结构。
图3Linux的混合索引文件结构(1)直接寻址。i.addr[0]—i.addr[9]这10项用于直接存放该文件所占用的磁盘块号,文件的前10个磁盘块号依次放入其中。如果磁盘块的大小为1KB,则当文件长度不大于10K时,操作系统可采用直接索引文件的方式对文件进行访问,直接从索引节点中找出该文件所在的磁盘块号,访问速度较快。
(2)一次间接寻址方式。i.addr[10]项中存放的磁盘块号所指向的磁盘块再用来存放下一级的磁盘块号。假设一个磁块大小为1KB,每个磁盘块号占4个字节,则一个磁盘块可存放256个(1KB/4B)磁盘块号。这样,通过一次间接寻址,i.addr[10]项就引出了256个磁盘块号,所以,这一级可支持的文件长度为256K。
(3)二次间接寻址方式。i.addr[11]存放的磁盘块号采用两级索引的方式,如果沿用以上的假设,则该项可引出2562个磁盘块,可支持的文件长度为2562K。
(4)三次间接寻址方式。i.addr[12]存放的磁盘块号采用三级索引的方式,如果仍沿用以上的假设,则该项可引出2563个磁盘块,可支持的文件长度为2563K。由以上分析可以看出,UNIX系统对于长度较小的文件具有较快的读写速度,同时又具有支持大文件的功能。
Linux系统文件实现了按名查找。通过文件名访问文件的过程如下:通过文件名查找文件目录,找到该文件的索引结点号;通过索引结点号查找索引节点区,找到该文件的索引点;根据索引结点中提供a.ad-dr,找到该文件在磁盘的相应的块号序列;根据块号,找到文件内容。
FAT文件系统与NTFS文件系统目录的比较:FAT文件系统直接以文件控制块作为文件目录,这样文件系统目录相应较大,查询速度较慢。以索引结点作为文件目录,对于一些小的文件系统是可以的,但是对较大型的文件系统就不适用了。Linux系统的文件目录为:文件名、索引结点号。这使得Linux系统的文件目录更小,查询速度更快。5.与windows的比较
a)相同点Linux和Windows都支持多种文件系统。文件资源可以通过NetBIOS、FTP或者其他协议与其他客户机共享。可以很灵活地对各个独立的文件系统进行组织,由管理员来决定它们在何处可以以何种方式被访问。
两种操作系统都支持各种物理设备端口,比如并口、串口和USB接口。支持各种控制器,比如IDE和SCSI控制器。Linux还支持很多“刚刚上市”的标准硬件。
Linux和Windows都支持多种网络协议,比如TCP/IP、NetBIOS和IPX。都支持多种类型的网络适配器。都具备通过网络共享资源的能力,比如共享文件和打印。都可以提供网络服务能力,比如DHCP和DNS。
Linux和Windows都提供服务。所谓服务,指的是那些在后台运行的应用程序,可以为系统和远程调用该服务的计算机提供一些功能。在系统引导的时候可以单独控制并自动启动这些程序。(注意:Linux中沿用了Unix的习惯,称这种应用程序为daemon)
b)区别Linux的设计定位于网络操作系统。它的设计灵感来自于Unix操作系统,因此它的命令的设计比较简单,或者说是比较简洁。由于纯文本可以非常好地跨网络工作,所以Linux配置文件和数据都以文本为基础。对那些熟悉图形环境的人来说,Linux服务器初看可能比较原始。但是Linux开发更多关注的是它的内在功能而不是表面上的东西。即使是在纯文本的环境中,Linux同样拥有非常先进的网络、脚本和安全能力。执行一些任务所需的某些表面上看起来比较奇怪的步骤是令人费解的,除非您认识到Linux是期望在网络上与其他Linux系统协同执行这些任务。Linux的自动执行能力也很强,只需要设计批处理文件就可以让系统自动完成非常详细的任务。Linux的这种能力来自于其基于文本的本质。
Linux文件系统作为开端,只有一个单独的顶级目录结构。所有一切都从'根'开始,用'/'代表,并且延伸到子目录。DOS/Windows有不同的分区,同时目录都存于分区上。linux则通过'加载'的方式把所有分区都放置在'根'下制定的目录里。一句话总结:Windows下,目录结构属于分区;Linux下,分区'加载'于目录结构。在Windows下,启动时检测不同的分区并被赋予一个分区字母。在Linux下除非你加载一个分区或设备,否则系统不会知道那个分区的存在。这看上去也许不是访问分区或设备的最方便的方式,但是这种方式提供了机动性。
这种构建的方式被称为统一的文件系统,超越了Windows所使用的方式。举个使用/usr的例子。这个目录包含了大多数的系统可执行文件。在Linux文件系统下,你可以选择把它加载为其他分区甚至网络上的其他计算机。系统不会感知其中的不同,因为它表现出的只是本地目录结构下众多的目录中的一个而已。你是否有妄图在Windows下移动可执行文件和数据,而得到的是不得不去修改注册表或干脆蓝屏?你可曾奢望过移动C:到其他分区上?6.结束语
由于Linux系统的EXT2文件系统采用了合理巧妙的文件系统结构,以及目录结构,使得该文件系统多项性能得到优化。采用EXT2系统,能够大大改善磁盘I/O速度,提高I/O组织的灵活性及编程效率。因此,EXT2文件系统为开发嵌入式系统及实时应用系统提供了广泛的基础和手段。
参考文献:
[1]陈向阳.Linux实用大全[M].2版.北京:科学出版社,1998.
[2]陈莉君,康华.Linux操作系统原理与应用[M].北京:清华大学出版社,2006.[3]陆松年.操作系统教程[M].北京:电子工业出版社,2010.
[4]WilliamStallings.操作系统:精髓与设计原理[M].陈渝,译.北京:电子工业出版社,2006.
因篇幅问题不能全部显示,请点此查看更多更全内容