Linux系统的一个重要特点就是支持多种不同的文件系统,如ext、FAT、ext2、ext3、MINIX、MSDOS、SYSV等。目前,Linux主要使用的文件系统是ext2和ext3。
ext3是ext2的升级版本,加入了记录数据的日志功能。ext2和ext3都是非常优秀的文件系统,虽然系统发生崩溃也能很快修补。
Linux系统的第一个文件系统是Minix,1992年引进了第一个专门为Linux设计的文件系统—ext(extendedfile
system),1993年又推出了一个新文件系统—ext2。
当Linux引进ext文件系统时有了一个重大的改进:真正的文件系统从操作系统和系统服务中分离下来,在它们之间使用了一个插口层—虚拟文件系统VFS(Virtual
File
System)。VFS为用户程序提供一个统一的、抽象的、虚拟的文件系统界面,这个界面主要由一组标准的、抽象的、有关文件操作的系统调用构成。
ext2文件系统
ext2文件系统支持标准Unix文件类型,比如普通文件、目录文件、特别文件和符号链接等。ext2文件系统可以管理非常大的分区。曾经内核代码限制文件系统的大小为2GB,如今VFS把这个限制提升到4TB。为此,现今使用大c盘而毋须界定多个分区。
ext2文件系统支持长文件名,最大宽度为255个字符,假如须要还可以降低到1012个字符,但是,它使用变长的目录表项。
ext2文件系统为超级用户保留了一些数据块,约为5%。这样,在用户进程占满整个文件系统的情况下,系统管理员仍可以简单地恢复整个系统。
不仅标准的Unix功能外,ext2文件系统还支持在通常Unix文件系统中没有的中级功能,如设置文件属性、支持数据更新时同步写入c盘的功能、允许系统管理员在创建文件系统时选择逻辑数据块的大小、实现快速符号链接,以及提供两种定期逼迫进行文件系统检测的工具等。
1.ext2文件系统的化学结构
与其它文件系统一样,ext2文件系统中的文件信息都保存在数据块中。对同一个ext2文件系统而言,所有数据块的大小都是一样的,比如1024字节。并且,不同的ext2文件系统中数据块的大小可以不同。ext2文件系统的数学构造方式如图1所示。
图1ext2文件系统的数学布局
ext2文件系统分布在块结构的设备中,文件系统毋须了解数据块的化学储存位置,它保存的是逻辑块的编号。块设备驱动程序才能将逻辑块号转换到块设备的化学储存位置。
ext2文件系统将逻辑块界定成块组,每位块组重复保存着一些有关整个文件系统的关键信息及实际文件和目录的数据块。
系统引导块总是介质上的第一个数据块,只有根文件系统才有引导程序置于这儿,其余通常文件系统都不使用引导块。
使用块组对于提升文件系统的可靠性有很大益处,因为文件系统的控制管理信息在每位块组中都有一份拷贝,因而当文件系统意外出现崩溃时可以很容易地恢复。另外,因为在有关块组内部,索引节点表和数据块的位置很近,在对文件进行I/O操作时,可降低硬碟盘片的联通距离。
2.块组的构造
从图1中可以看出,每位块组重复保存着一些有关整个文件系统的关键信息,以及真正的文件和目录的数据块。每位块组中包含超级块、组描述结构、块位图、索引节点(即I节点)位图、索引节点表和数据块。
(1)超级块(Superblock)
超级块中包含有文件系统本身的大小和方式的基本信息,系统管理员可以借助那些信息使用和维护文件系统。每位块组都一个超级块。通常情况下,当安装文件系统时,系统只读取数据块组1中的超级块,将其倒入显存,直到该文件系统被卸载。
超级块中包含以下内容:
◆块数,用于安装时确认是ext2文件系统的超级块。
◆修订级别,这是文件系统的主版本号和次版本号。
◆安装计数和最大安装数linux文件系统管理,系统拿来决定文件系统是否应当全面地进行检测。
◆块组号码,包含此超级块的数据块组的号码。
◆数据块大小,文件系统创建后数据块的大小就固定了,通常为1024、2048或4096个字节。
◆每组数据块的个数,即块组中数据块的个数,文件系统创建后它就固定了。
◆空闲块,文件系统中空闲块的个数。
◆空闲索引节点,文件系统中空闲索引节点的数量。
◆第一个索引节点,文件系统中第一个索引节点的号码。在ext2根文件系统中,第一个索引节点是根目录(/)的入口。
(2)块组描述结构(BlockGroupDescriptors)
每位数据块组都有一个描述它的数据结构,即块组描述结构,其中包含以下信息:
◆数据块位示图,这一项表示数据块位示图所占的数据块数。块位示图反映出数据块组中数据块的分配情况,在分配或释放数据块时要使用块位示图。
◆索引节点位示图,这一项表示索引节点位示图所占的数据块数。索引节点位示图反映出数据块组中索引节点分配的情况linux系统镜像下载,在创建或删掉文件时要使用索引节点位示图。
◆索引节点表,数据块组中索引节点表所占的数据块数。系统中的每一个文件都对应一个索引节点,每位索引节点都由一个数据结构来描述。
◆空闲块数、空闲索引节点数和已用目录数。
一个文件系统中的所有数据块组描述结构组成一个数据块组描述结构表。每一个数据块组在其超级块然后都包含一个数据块组描述结构表的副本。实际上,ext2文件系统只使用块组1中的数据块组描述结构表。
3.索引节点(Inode)
索引节点又被称为I节点,每位文件都有唯一一个索引节点。ext2文件系统的索引节点起着文件控制块的作用,借助这些数据结构可对文件进行控制和管理。每位数据块组中的索引节点都保存在索引节点表中。数据块组中还有一个索引节点位示图,它拿来记录系统中索引节点的分配情况——哪些节点早已分配出去了,什么节点仍未分配。
索引节点有盘索引节点(如ext2_inode)和显存索引节点(如inode)
有两种方式。盘索引节点储存在c盘的索引节点表中,显存索引节点储存在系统专门开办的索引节点区中。
所有文件在创建时就分配一个盘索引节点。当一个文件被打开,或则一个目录成为当前工作目录时,系统内核就把相应的盘索引节点复制到显存索引节点中;当文件被关掉时,就释放其显存索引节点。
盘索引节点和显存索引节点的基本内容是相同的,但两者存在很大差异。盘索引节点包括文件模式、描述文件属性和类型主要内容。
◆文件属主信息,包括文件主标示号和同组用户标示号。
◆文件大小,即文件的字节大小。
◆时间戳,包括索引节点构建的时间、最近访问时间、最后更改时间等。
◆文件链接计数。
◆数据块索引表。借助多重索引表的结构储存指向文件数据块的表针。
显存索引节点不仅具有盘索引节点的主要信息外,还平添了反映该文件动态状态的项目,比如,共享访问计数(i_count),表示在某一时刻该文件被打开之后进行访问的次数。
当它为0时,该索引节点被放在自由链中,表示它是空闲的;队列结构,通过几个list_head结构可以动态地链入到显存中的若干队列中,可推动检索索引节点的速率。
4.多重索引结构
普通文件和目录文件都要占用盘块储存其数据。为了用户使用便捷,系统通常不应限制文件的大小。假如文件很大,这么不仅剩放文件信息须要大量盘块,但是相应的索引表也必然很大。在这些情况下,把索引表整个置于显存是不合适的,并且不同文件的大小不同linux文本编辑器,文件在使用过程中很可能须要扩展空间。
单一索引表结构已难以满足灵活性和节约显存的要求,因此引出多重索引结构(又称多级索引结构)。在这些结构中采用了间接索引方法,即由最初索引项中得到某一盘块号,该块中储存的信息是另一组盘块号;而前者每一块中又可储存下一组盘块号(或则是文件本身信息)。
这样间接几级(一般为1~3级),最末尾的盘块中储存的信息一定是文件内容。ext2文件系统就采用了多重索引方法,如图2所示。
图2索引节点结构示意图
图2的左部是索引节点(即I节点),其中富含对应文件的状态和管理信息。一个打开文件的索引节点放到系统显存区,与文件储存位置有关的索引信息是索引节点的一个组成部份,它是由直接表针、一级间接表针、二级间接表针和五级间接表针构成的链表。
前12项作为直接表针。直接表针所指向的盘块中放有该文件的数据,这些盘块称为直接块。而一级间接表针所指向的盘块(间接块)中放有直接块的块号表。为了通过间接块储存文件数据,核心必须先读出间接块,找到相应的直接块项,之后从直接块中读取数据。
二级间接表针所指向的盘块中放有一级间接块号表。同样,五级间接表针所指向的盘块中放有二级间接块号表。因而,借助前12个直接表针可以储存的文件不超过12KB。假如文件大小超过12KB,则可以用一级间接表针;若更大,则可用二级间接表针;以这种推,使用五级间接表针最大的文件可以是16GB。
5.ext2中的目录项
在ext2文件系统中,目录文件包含有下属文件与子目录的登记项。当创建一个文件时,就构成一个目录项,并添加到相应的目录文件中。一个目录文件可以包含好多目录项,每位目录项(如ext2文件系统的ext2_dir_entry_2)包含的信息如下:
(1)索引节点号。这是相应文件在数据块组中的索引节点号码,即检索索引节点表字段的索引值。
(2)目录项宽度。记载该目录项占多少字节。
(3)名子宽度。记载相应文件名的字节数。
(4)文件类型。用一个数字表示文件的类型,比如,1表示普通文件,2表示目录,3表示字符设备文件,4表示块设备文件等。
(5)文件名子。文件名(不包括路径部份)的最大宽度为255个字符。
每位目录的前两个目录仍然是标准的“.”和“..”,它们分别代表目录自身和其父目录。当用户须要打开某个文件时,首先要指定该文件的路径和名称,文件系统按照路径和名称搜索对应的索引节点,找到该文件的数据块,因而读取文件中的数据。
比如,要读取文件/home/mengqc/m1.c,文件系统首先根据超级块中根目录的索引节点找到根目录的数据块,从中找到表示home文件的目录项,得到相应的索引节点号码;接着在home所对应的索引节点中找到储存home数据块的地址,从而从相应的数据块中找到mengqc对应的目录项linux文件系统管理,得到相应的索引节点号码;再由mengqc目录文件中获取m1.c文件的索引节点号码,通过这个索引节点就可以访问m1.c文件了。
6.位示图
图1中示出了每位块组包含一个块位示图和一个索引节点位示图。位示图(Bitmap)借助一串二进位的值来反映该块组中数据块的分配情况,也叫做位向量(Bit
Vector)法。
位示图似乎是一个很大的棋盘,每位盘格(一个二进位)对应着块组中的一个数据块,假如数据块是空闲的,则其对应位是0;假如数据块早已分配出去,则对应位是1。
比如,设下述数据块是空闲的2、3、4、5、8、9、10、11、12、13、17、18、25、26、27……则块位示图的表示为11000……
块位示图的大小取决于块组的大小。
当数据块的大小为1K字节,而块组的大小为8192时,该位示图正好占一个数据块。在ext2文件系统中,用于索引节点的数据块数目取决于文件系统的参数,而索引节点的位示图则不会超出一个数据块。
虚拟文件系统
Linux系统可以支持多种文件系统,因此,必须使用一种统一的插口,这就是虚拟文件系统(VFS)。通过VFS将不同文件系统的实现细节隐藏上去,因此从外部看起来,所有的文件系统都是一样的。
1.VFS系统结构
图3示出VFS和实际文件系统之间的关系,从图中可以看出,用户程序(进程)通过有关文件系统操作的系统调用步入系统空间,之后经由VFS才可使用Linux系统中具体的文件系统。也就是说,VFS是构建在具体文件系统之上的,它为用户程序提供一个统一的、抽象的、虚拟的文件系统界面。
这个具象的界面主要由一组标准的、抽象的有关文件操作构成,以系统调用的方式提供给用户程序,如read()、write(
)和lseek(
)等。所以,VFS必须管理所有同时安装的文件系统。它通过使用描述整个VFS的数据结构和描述实际安装的文件系统的数据结构,来管理这种不同的文件系统。
图3VFS和实际文件系统之间的关系
不同的文件系统通过不同的程序来实现其各类功能。VFS定义了一个名为file_operations的数据结构,这个数据结构成为VFS与各个文件系统的界面。
每种文件系统都有自己的file_operations数据结构,结构中的成份是指向文件操作的函数表针,比如,open是指向具体文件系统的打开文件的函数表针。这样,在VFS之上的用户程序中对文件的操作就不涉及具体的文件系统,经file_operations数据结构的转换才跳转到具体文件系统上。
2.VFS超级块
VFS和ext2文件系统一样也使用超级块和索引节点来描述和管理系统中的文件。每位安装的文件系统都有一个VFS超级块,其中包含以下主要信息:
(1)设备标示符。这是储存文件系统的数学块设备的设备标示符,如系统中第一个IDEc盘/dev/hda1的标示符是0x301。
(2)索引节点表针。安装索引节点表针指向被安装的子文件系统的第一个索引节点;覆盖索引节点表针指向安装文件系统目录(安装点)的索引节点。根文件系统的VFS超级块中没有覆盖索引节点表针。
(3)数据块大小。文件系统中数据块的字节数。
(4)超级块操作集。指向一组超级块操作类库的表针,VFS借助它们可以读写索引节点和超级块。
(5)文件系统类型。指向所安装的文件系统类型的表针。
(6)文件系统的特殊信息。指向文件系统所须要信息的表针。
可以看出,VFS超级块的结构比ext2文件系统的超级块简单,主要降低的是超级块操作集,它用于对不同文件系统进行操作,对于超级块本身并无作用。
3.VFS索引节点
VFS中每位文件和目录都有一个且只有一个VFS索引节点。VFS索引节点仅在系统须要时,才保存在系统内核的显存及VFS索引节点缓存中。
VFS索引节点包含的主要内容有所在设备的标示符、惟一的索引节点号码、模式(所代表对象的类型及存取权限)、用户标示符、有关的时间、数据块大小、索引节点操作集(指向索引节点操作类库的一组表针)、计数器(系统进程使用该节点的次数)、锁定节点指示、节点更改标示,以及与文件系统相关的特殊信息。