linux中文件和设备管理,Linux 文件系统和设备管理(1)

Linux系统的一个重要特征就是支持多种不同的文件系统,如ext、FAT、ext2、ext3、MINIX、MSDOS、SYSV等。目前,Linux主要使用的文件系统是ext2和ext3。

ext3是ext2的升级版本,加入了记录数据的日志功能。ext2和ext3都是十分优秀的文件系统,即使系统发生崩溃也能很快修复。

Linux系统的第一个文件系统是Minix,1992年引进了第一个专门为Linux设计的文件系统—ext(extended file

system),1993年又推出了一个新文件系统—ext2。

当Linux引进ext文件系统时有了一个重大的改进:真正的文件系统从操作系统和系统服务中分离出来,在它们之间使用了一个接口层—虚拟文件系统VFS(Virtual

File

System)。VFS为用户程序提供一个统一的、抽象的、虚拟的文件系统界面,这个界面主要由一组标准的、抽象的、有关文件操作的系统调用构成。

ext2文件系统

ext2文件系统支持标准Unix文件类型,例如普通文件、目录文件、特别文件和符号链接等。ext2文件系统可以管理特别大的分区。以前内核代码限制文件系统的大小为2GB,现在VFS把这个限制提高到4TB。因此,现在使用大磁盘而不必划分多个分区。

ext2文件系统支持长文件名,最大长度为255个字符,如果需要还可以增加到1012个字符,而且,它使用变长的目录表项。

ext2文件系统为超级用户保留了一些数据块,约为5%。这样,在用户进程占满整个文件系统的情况下,系统管理员仍可以简单地恢复整个系统。

除了标准的Unix功能外,ext2文件系统还支持在一般Unix文件系统中没有的高级功能,如设置文件属性、支持数据更新时同步写入磁盘的功能、允许系统管理员在创建文件系统时选择逻辑数据块的大小、实现快速符号链接,以及提供两种定期强迫进行文件系统检查的工具等。

1.ext2文件系统的物理结构

与其它文件系统一样,ext2文件系统中的文件信息都保存在数据块中。对同一个ext2文件系统而言,所有数据块的大小都是一样的,例如1024字节。但是,不同的ext2文件系统中数据块的大小可以不同。ext2文件系统的物理构造形式如图1所示。

a4c26d1e5885305701be709a3d33442f.png

图1 ext2文件系统的物理布局

ext2文件系统分布在块结构的设备中,文件系统不必了解数据块的物理存储位置,它保存的是逻辑块的编号。块设备驱动程序能够将逻辑块号转换到块设备的物理存储位置。

ext2文件系统将逻辑块划分成块组,每个块组重复保存着一些有关整个文件系统的关键信息及实际文件和目录的数据块。

系统引导块总是介质上的第一个数据块,只有根文件系统才有引导程序放在这里,其余一般文件系统都不使用引导块。

使用块组对于提高文件系统的可靠性有很大好处,由于文件系统的控制管理信息在每个块组中都有一份拷贝,因此当文件系统意外出现崩溃时可以很容易地恢复。另外,由于在有关块组内部,索引节点表和数据块的位置很近,在对文件进行I/O操作时,可减少硬盘磁头的移动距离。

2.块组的构造

从图1中可以看出,每个块组重复保存着一些有关整个文件系统的关键信息,以及真正的文件和目录的数据块。每个块组中包含超级块、组描述结构、块位图、索引节点(即I节点)位图、索引节点表和数据块。

(1) 超级块(Superblock)

超级块中包含有文件系统本身的大小和形式的基本信息,系统管理员可以利用这些信息使用和维护文件系统。每个块组都一个超级块。一般情况下,当安装文件系统时,系统只读取数据块组1中的超级块,将其放入内存,直至该文件系统被卸载。

超级块中包含以下内容:

◆块数,用于安装时确认是ext2文件系统的超级块。

◆修订级别,这是文件系统的主版本号和次版本号。

◆安装计数和最大安装数,系统用来决定文件系统是否应该全面地进行检查。

◆块组号码,包含此超级块的数据块组的号码。

◆数据块大小,文件系统创建后数据块的大小就固定了,一般为1024、2048或4096个字节。

◆每组数据块的个数,即块组中数据块的个数,文件系统创建后它就固定了。

◆空闲块,文件系统中空闲块的个数。

◆空闲索引节点,文件系统中空闲索引节点的数目。

◆第一个索引节点,文件系统中第一个索引节点的号码。在ext2根文件系统中,第一个索引节点是根目录(/)的入口。

(2) 块组描述结构(Block Group Descriptors)

每个数据块组都有一个描述它的数据结构,即块组描述结构,其中包含以下信息:

◆数据块位示图,这一项表示数据块位示图所占的数据块数。块位示图反映出数据块组中数据块的分配情况,在分配或释放数据块时要使用块位示图。

◆索引节点位示图,这一项表示索引节点位示图所占的数据块数。索引节点位示图反映出数据块组中索引节点分配的情况,在创建或删除文件时要使用索引节点位示图。

◆索引节点表,数据块组中索引节点表所占的数据块数。系统中的每一个文件都对应一个索引节点,每个索引节点都由一个数据结构来描述。

◆空闲块数、空闲索引节点数和已用目录数。

一个文件系统中的所有数据块组描述结构组成一个数据块组描述结构表。每一个数据块组在其超级块之后都包含一个数据块组描述结构表的副本。实际上,ext2文件系统只使用块组1中的数据块组描述结构表。

3.索引节点(Inode)

索引节点又被称为I节点,每个文件都有惟一一个索引节点。ext2文件系统的索引节点起着文件控制块的作用,利用这种数据结构可对文件进行控制和管理。每个数据块组中的索引节点都保存在索引节点表中。数据块组中还有一个索引节点位示图,它用来记录系统中索引节点的分配情况——哪些节点已经分配出去了,哪些节点尚未分配。

索引节点有盘索引节点(如ext2_inode)和内存索引节点(如inode)

有两种形式。盘索引节点存放在磁盘的索引节点表中,内存索引节点存放在系统专门开设的索引节点区中。

所有文件在创建时就分配一个盘索引节点。当一个文件被打开,或者一个目录成为当前工作目录时,系统内核就把相应的盘索引节点复制到内存索引节点中;当文件被关闭时,就释放其内存索引节点。

盘索引节点和内存索引节点的基本内容是相同的,但二者存在很大差别。盘索引节点包括文件模式、描述文件属性和类型主要内容。

◆文件属主信息,包括文件主标识号和同组用户标识号。

◆文件大小,即文件的字节大小。

◆时间戳,包括索引节点建立的时间、最近访问时间、最后修改时间等。

◆文件链接计数。

◆数据块索引表。利用多重索引表的结构存放指向文件数据块的指针。

内存索引节点除了具有盘索引节点的主要信息外,还增添了反映该文件动态状态的项目,例如,共享访问计数(i_count),表示在某一时刻该文件被打开以后进行访问的次数。

当它为0时,该索引节点被放到自由链中,表示它是空闲的;队列结构,通过几个list_head结构可以动态地链入到内存中的若干队列中,可加快检索索引节点的速度。

4.多重索引结构

普通文件和目录文件都要占用盘块存放其数据。为了用户使用方便,系统一般不应限制文件的大小。如果文件很大,那么不仅存放文件信息需要大量盘块,而且相应的索引表也必然很大。在这种情况下,把索引表整个放在内存是不合适的,而且不同文件的大小不同,文件在使用过程中很可能需要扩充空间。

单一索引表结构已无法满足灵活性和节省内存的要求,为此引出多重索引结构(又称多级索引结构)。在这种结构中采用了间接索引方式,即由最初索引项中得到某一盘块号,该块中存放的信息是另一组盘块号;而后者每一块中又可存放下一组盘块号(或者是文件本身信息)。

这样间接几级(通常为1~3级),最末尾的盘块中存放的信息一定是文件内容。ext2文件系统就采用了多重索引方式,如图2所示。

a4c26d1e5885305701be709a3d33442f.png

图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对应的目录项,得到相应的索引节点号码;再由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……则块位示图的表示为100001100000011100111111000……

块位示图的大小取决于块组的大小。

当数据块的大小为1K字节,而块组的大小为8192时,该位示图恰好占一个数据块。在ext2文件系统中,用于索引节点的数据块数量取决于文件系统的参数,而索引节点的位示图则不会超出一个数据块。

虚拟文件系统

Linux系统可以支持多种文件系统,为此,必须使用一种统一的接口,这就是虚拟文件系统(VFS)。通过VFS将不同文件系统的实现细节隐藏起来,因而从外部看上去,所有的文件系统都是一样的。

1.VFS系统结构

图3示出VFS和实际文件系统之间的关系,从图中可以看出,用户程序(进程)通过有关文件系统操作的系统调用进入系统空间,然后经由VFS才可使用Linux系统中具体的文件系统。也就是说,VFS是建立在具体文件系统之上的,它为用户程序提供一个统一的、抽象的、虚拟的文件系统界面。

这个抽象的界面主要由一组标准的、抽象的有关文件操作构成,以系统调用的形式提供给用户程序,如read( )、write(

)和lseek(

)等。所以,VFS必须管理所有同时安装的文件系统。它通过使用描述整个VFS的数据结构和描述实际安装的文件系统的数据结构,来管理这些不同的文件系统。

a4c26d1e5885305701be709a3d33442f.png

图3 VFS和实际文件系统之间的关系

不同的文件系统通过不同的程序来实现其各种功能。VFS定义了一个名为file_operations的数据结构,这个数据结构成为VFS与各个文件系统的界面。

每种文件系统都有自己的file_operations数据结构,结构中的成分是指向文件操作的函数指针,例如,open是指向具体文件系统的打开文件的函数指针。这样,在VFS之上的用户程序中对文件的操作就不涉及具体的文件系统,经file_operations数据结构的转换才跳转到具体文件系统上。

2.VFS超级块

VFS和ext2文件系统一样也使用超级块和索引节点来描述和管理系统中的文件。每个安装的文件系统都有一个VFS超级块,其中包含以下主要信息:

(1)设备标识符。这是存储文件系统的物理块设备的设备标识符,如系统中第一个IDE磁盘/dev/hda1的标识符是0x301。

(2)索引节点指针。安装索引节点指针指向被安装的子文件系统的第一个索引节点;覆盖索引节点指针指向安装文件系统目录(安装点)的索引节点。根文件系统的VFS超级块中没有覆盖索引节点指针。

(3)数据块大小。文件系统中数据块的字节数。

(4)超级块操作集。指向一组超级块操作例程的指针,VFS利用它们可以读写索引节点和超级块。

(5)文件系统类型。指向所安装的文件系统类型的指针。

(6)文件系统的特殊信息。指向文件系统所需要信息的指针。

可以看出,VFS超级块的结构比ext2文件系统的超级块简单,主要增加的是超级块操作集,它用于对不同文件系统进行操作,对于超级块本身并无作用。

3.VFS索引节点

VFS中每个文件和目录都有一个且只有一个VFS索引节点。VFS索引节点仅在系统需要时,才保存在系统内核的内存及VFS索引节点缓存中。

VFS索引节点包含的主要内容有所在设备的标识符、惟一的索引节点号码、模式(所代表对象的类型及存取权限)、用户标识符、有关的时间、数据块大小、索引节点操作集(指向索引节点操作例程的一组指针)、计数器(系统进程使用该节点的次数)、锁定节点指示、节点修改标识,以及与文件系统相关的特殊信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值