ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:157.77KB ,
资源ID:9180498      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9180498.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Linux文件系统.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Linux文件系统.docx

1、Linux文件系统Linux文件系统分析福州大学 刘延华本文介绍有关Linux文件系统的有关内容。1.1 Linux文件系统概述 21.2 ext2文件系统 51.2.1 ext2的索引节点 71.2.2 ext2超级块 91.2.3 ext2 数据块组描述符 111.2.4 ext2 中的目录 121.2.5 在ext2 文件系统中查找文件 131.2.6 改变ext2 文件系统中文件的大小 151.3 VFS 171.3.1 VFS 超级块 211.3.2 VFS 索引节点 221.3.3 登记文件系统 241.3.4 挂接文件系统 261.3.5 在VFS中查找文件 291.3.6 撤消

2、文件系统 291.3.7 VFS 索引节点缓存 301.3.8 VFS目录缓存 321.4 缓冲区缓存 341.5 /proc 文件系统 401.1 Linux文件系统概述Linux系统的一个重要特征就是支持多种不同的文件系统。这样,Linux系统就十分的灵活,并且可以十分容易地和其他操作系统共存。目前,Linux系统支持大约15个文件系统:EXT、 EXT2、 XIA、MINIX、UMS DOS、MS DOS、VFAT、 PROC、SMB、NCP、ISO9660、SYSV、 HPFS、AFFS 和UFS。并且,毫无疑问,Linux系统支持的文件系统还会增加。在Linux系统中,每一个单独的文

3、件系统都是代表整个系统的树状结构的一部分。当挂接一个新的文件系统时, Linux把它添加到这个树状的文件系统中。所有系统中的文件系统,不管是什么类型,都挂接到一个目录下,并隐藏掉目录中原有的内容。这个目录叫做挂接目录或者挂接点。当文件系统卸载掉时,目录中的原有内容将再一次的显示出来。初始化时磁盘将被划分成几个逻辑分区。每一个逻辑分区可以使用一种文件系统,例如 EXT2文件系统。文件系统把存储在物理驱动器中的文件组织成一个树状的目录结构。可以存储文件的设备称为块设备。 Linux文件系统把这些块设备当作简单的线形块的集合,而不管物理磁盘的结构如何,而将读写某一个设备块的请求转换成特定的磁道、扇区

4、和柱面是通过设备的驱动程序实现的。因此,不同的设备控制器控制的不同设备中的不同文件系统在 Linux中都可以同样地使用。文件系统甚至可以不在当地的系统中,也就是说,文件系统可以通过网络远程连接到本地磁盘上。请看下面的例子,这是一个 Linux在SCSI 磁盘上的根文件系统: AEbootetclibopttmpusrCFcdromfdprocrootvarsbinDbindevhomemntlost + found在这里,用户和使用文件的程序都不必知道/C实际上是挂接的VFAT文件系统,而VFAT文件系统本身却存储在系统中的一个IDE硬盘上。同样,/E是系统中第二个IDE控制器控制的主硬盘系统

5、。也可以使用调制解调器将远程的文件系统挂接到/mnt/remote目录下。一个文件系统中不仅包括含有数据的文件,而且还存储着文件系统的结构。文件系统中的信息必须是安全和保密的。Linux系统中的第一个文件系统是 Minux, 但它的文件名只能有14个字符,最大的文件长度是64 M字节。所以,1992年4月引进了第一个专门为Linux设计的文件系统-ext(extended file system )。但ext的功能还是有限。最后在1993年又推出了一个新的文件系统-ext2。当Linux引进ext文件系统时有了一个重大的改进:真正的文件系统从操作系统和系统服务中分离出来,在它们之间使用了一个接

6、口层-虚拟文件系统VFS(Virtual File system)。 VFS允许Linux支持多种不同的文件系统,每个文件系统都要提供给 VFS一个相同的接口。这样所有的文件系统对系统内核和系统中的程序来说看起来都是相同的。 Linux系统中的VFS层使得你可以同时在系统中透明地挂接很多不同的文件系统。VFS能高速度及高效率地存取系统中的文件,同时它还得确保文件和数据的正确性。这两个目标有时可能相互矛盾。VFS在每个文件系统挂接和使用时把文件系统的有关信息暂时保存在内存中,所以当内存中的信息改变时,例如创建、写入和删除目录和文件时,系统要保证正确地升级文件系统中相关的内容。如果你了解在系统内核

7、中运行的文件系统的数据结构,那么你也就了解了文件系统读取的数据块的情况。系统缓存中最重要的就是缓冲区缓存,它被集成到每个单独的文件系统存取它们的块设备所使用的方法中。每当系统存取数据块时,数据块都被放入缓冲区缓存中,并且依照它们的状态保存到各种各样的队列中。缓冲区缓存中不仅保存了数据缓冲区,而且还可以帮助管理和块设备驱动程序之间的异步接口。 1.2 ext2文件系统 ext2的物理结构图参见图1 - 1。图1-1 文件使用ext2示意图ext2文件系统是Linux系统中最为成功的文件系统,各种 Linux的系统发布都将 ext2文件系统作为操作系统的基础。ext2文件系统中的数据是以数据块的方

8、式存储在文件中的。这些数据块具有同样的大小,并且其大小可以在ext2创建时设定。每一个文件的长度都要补足到块的整数倍。例如,如果一个块的大小是1024字节,那么一个1025字节大小的文件则占用两个数据块。所以,平均来说一个文件将浪费半个数据块的空间。但这样可以减轻系统中CPU的负担。文件系统中不是所有的数据块都存储数据,一些数据块用来存储一些描述文件系统结构的信息。ext2通过使用索引节点(inode)数据结构来描述系统中的每一个文件。索引节点描述了文件中的数据占用了哪一个数据块以及文件的存取权限、文件的修改时间和文件类型等信息。ext2文件系统中的每一个文件都只有一个索引节点,而每一个索引节

9、点都有一个唯一的标识符。文件系统中的所有的索引节点都保存在索引节点表中。ext2中的目录只是一些简单的特殊文件,这些文件中包含指向目录入口的索引节点的指针。对于一个文件系统来说,某一个块设备只是一系列可以读写的数据块。文件系统无须关心数据块在设备中的具体位置,这是设备驱动程序的工作。每当文件系统需要从块设备中读取数据时,它就要求设备驱动程序读取整数数目的数据块。 ext2文件系统将它所占用的设备的逻辑分区分成了数据块组。每一个数据块组都包含一些有关整个文件系统的信息以及真正的文件和目录的数据块。 1.2.1 ext2的索引节点 ext2的索引节点图参见图1-2。 图1-2 EXT2 系统索引节

10、点示意图在ext2文件系统中索引节点是一切的基础,文件系统中的每一个文件和目录都使用一个唯一的索引节点。每一个数据块组中的索引节点都保存在索引节点表中。数据块组中还有一个索引节点位图,它用来记录系统中已分配和未分配的索引节点。下面是 ext2的索引节点的一些主要的字段:1. mode这里保存两个信息:一个是此索引节点描述的是什么,另一个是用户拥有的权限。例如,对于ext2,一个索引节点可以描述文件、目录、符号连接、块设备、字符设备以及FIFO结构。 2. Owner Information这是文件或目录所有者的用户和组标识符。这使得文件系统可以正确地授权某种存取操作。 3. Size文件的字节

11、大小。 4. Time stamps索引节点建立的时间和索引节点最后修改的时间。 5. Data blocks指向存储此索引节点描述文件的数据块的指针。前十二个指针是指向存储数据的物理数据块的指针,而后三个指针则包括不同级别的间接指针。例如,两级指针指向一个指向其他指针块的指针块。这意味着小于或者等于 1 2个数据块的文件的存取速度要高于多于 1 2个数据块的文件。你应该注意到ext2的索引节点可以描述一些特殊的设备文件。这些设备文件不是真正的文件,但系统中的程序可以使用这些设备文件来存取它们相关的设备。所有的这些设备文件都在 / d e v目录下面。例如,挂接程序可以把它希望挂接的设备文件作

12、为它的一个参数。 1.2.2 ext2超级块超级块(Super block)存储着描述文件系统的大小和形状的基本信息。文件系统的管理员可以使用其中的信息来使用和维护文件系统。一般情况下,当文件系统挂接时,系统只读取数据块组0中的超级块,但每一个数据块组中都包含一个超级块的副本,以防系统崩溃时使用。超级块包括如下的主要信息: 1. Magic Number(幻数)使挂接程序确认这是ext2文件系统的超级块。目前其值为0xEF53。2.Revision Level(修订级别)这是文件系统的主版本号和从版本号。挂接程序可以根据此信息决定此文件系统是否支持一些特定文件系统的函数。 3.Mount Co

13、unt(挂接数)和Maximum Mount Count(最大挂接数)系统用来决定文件系统是否应该全面地检查。文件系统每挂接一次, mount count的值就会加1。当mount count的值和maximum mount count的值相等时,系统将显示maximal mount count reached, running e2fsck is recommended信息,提示用户进行文件系统的检查。 4. Block Group Number(块组号)包含此超级块的数据块组号。 5. Block Size(块大小)文件系统中数据块的大小,例如1 0 2 4字节。 6. Blocks pe

14、r Group(每组块数)数据块组中的数据块数目和Block Size一样,它在文件系统创建以后就是固定的了。 7. Free Blocks(空闲块)文件系统中空闲的数据块的数目。 8. Free Inodes(空闲索引节点)文件系统中空闲的索引节点的数目。 9. First Inode(第一个索引节点)文件系统中的第一个索引节点号。在一个 ext2根文件系统中,第一个索引节点是 /目录的入口。 1.2.3 ext2 数据块组描述符每一个数据块组都有一个描述它的数据结构和超级块一样,在每一个数据块组中都要复制一份数据块组描述符。数据块组描述符包含以下的信息: 1. Blocks Bitmap(

15、块位图)2. Inode Bitmap(索引节点位图)3. Inode Table(索引节点表)数据块组中数据块分配位图所占的数据块数。在数据块分配和数据块撤消时使用。数据块组中索引节点分配位图所占的数据块数。在索引节点的分配和撤消中使用。数据块组中索引节点表所占的数据块数。系统中的每一个索引节点都由一个数据结构来描述。 4. Free blocks count(空闲块数)、Free Inodes count(空闲索引节点数), Used directory c o u n t(已用目录数)这是空闲的数据块数,空闲的索引节点数和已用的目录数。数据块组描述符组成一个数据块组描述符表。每一个数据块

16、组在其超级块之后都包含一个数据块组描述符表的副本。 EXT2文件系统事实上只是使用数据块组 0中的数据块描述符表。 1.2.4 ext2 中的目录在ext2文件系统中,目录是一些特殊的文件,它们用来创建和保存系统中文件的存取路径。图1-3是一个目录入口在内存中的结构图。图1-3 EXT2文件系统目录结构示意图一个目录文件包括很多的目录入口,一个目录入口包括以下的内容: 1. inode(索引节点)目录入口的索引节点。这是保存在数据块组中的索引节点表数组的索引值。在上图中,file的目录入口的索引节点号的引用是i1。 2. name length(名称长度)目录入口的字节长度。 3. name(

17、名称)目录入口的名字。每一个目录的头两个入口都是标准的 . 和 . .,分别代表本目录和父目录。 1.2.5 在ext2 文件系统中查找文件 Linux系统的文件名格式和U n i x系统的文件名格式一样,其中的目录名用斜杠( /)分隔。例如,文件名/ h o m e / z w s / . c s h r c,其中/home 和 / z w s是目录名,. c s h r c则是文件名。Linux系统中的文件名可以由任何可打印的字符组成,也可以是任何的长度。系统通过分析目录中的文件,来查找文件对应的索引节点。系统需要的第一个索引节点是文件系统根目录的索引节点,它的值保存在文件系统的超级块中。

18、要读取一个ext2文件系统的索引节点,我们必须在相应的数据块组中的索引节点表中查找。例如,如果一个根目录的索引节点值是 4 2,那么我们需要读取在数据块组 0中的索引节点表中的第4 2个索引节点。根目录索引节点是一个 ext2的目录节点,也就是说,根目录索引节点的模式(m o d e)是目录,而它的数据块中包含的是 ext2目录的入口。 h o m e目录只是众多目录入口中的一个,我们可以从中查找出描述 / h o m e / z w s目录的索引节点值。接下来我们读取这个目录(首先读取它的索引节点,然后读取此索引节点描述的数据块中的z w s目录),从中查找描述/ h o m e / z w

19、 s目录的索引节点值。最后,在描述 / h o m e / z w s目录的索引节点指向的目录入口中找到 . c s h r c文件的索引节点值,通过它的索引节点值找到存储在文件中的数据的数据块。 1.2.6 改变ext2 文件系统中文件的大小文件系统的一个常见的问题就是文件碎片问题。存储文件数据的数据块可能散布在整个文件系统中,这样顺序存取一个文件的数据块可能变得效率越来越低。 ext2文件系统通过为一个文件的新数据块分配靠近当前数据块的物理块或同一个数据块组中的数据块来解决文件碎片问题。只有当这样的分配策略不能实现时, ext2才为新的文件数据块分配其他数据块组中的数据块。当进程往文件中写

20、入数据时, ext2文件系统都要检查数据是否已经超出了文件最后分配的数据块的范围。如果写入的数据超出了该范围,那么文件系统必须为此文件分配一个新的数据块。在这之前,进程不能继续运行。 ext2文件系统的数据块分配过程所做的第一件事就是锁定此文件系统的 ext2超级块。分配和撤消数据块需要改变超级块中字段的内容,并且 Linux文件系统不允许多个进程同时修改超级块。如果另外的进程在此时也需要分配新的数据块,那么它必须等待直到正在运行的进程处理完对超级块的修改并释放对超级块的控制才能恢复运行。对超级块的操作本着先来先服务的策略。在锁定了超级块以后,进程将检查文件系统中有无足够的空闲数据块。如果没有

21、,那么进程的分配请求将失败,进程将放弃对文件系统超级块的控制权。如果系统中有足够的空闲数据块,则进程将为文件分配所需要的数据块。如果ext2文件系统内建有预分配的数据块,那么我们可以使用预分配数据块。预分配数据块实际上并不存在,它们保留在已分配的数据块位图中。申请分配新数据块的文件的 VFS索引节点有两个特别的字段:prealloc_block 和 prealloc_count,分别是第一个预分配数据块的块号和可以使用的预分配块数。如果没有预分配数据块或者系统中没有预分配数据块功能, ext2文件系统必须分配一个新的数据块。它首先查看文件中最后一个数据块的后一个数据块是否空闲。逻辑上,这个数据

22、块是最为有效的数据块,因为这样可以加速对文件顺序的存取。如果此数据块没有空闲,那么文件系统将加大搜索的范围,在 6 4个数据块的范围内查找理想的数据块。如果甚至连这样的空闲数据块找不到,进程则开始查看其他数据块组直到找到一个空闲的数据块为止。数据块分配程序查找某一个数据块组中的一簇,也就是 8个空闲的数据块。如果无法找到8个连续的空闲数据块,数据块分配程序将查找较少的连续的空闲数据块。 无论在那一个数据块组中查找到空闲的数据块,数据块分配程序都将更新数据块组中的数据块位图,并且在缓冲区缓存中分配一个数据缓冲区。这个分配的数据缓冲区由设备标识符和已分配的数据块的块号来标识。最后将超级块标记为di

23、rty来表明超级块已经改动,同时文件系统将超级块解锁。此时,如果有任何进程等待使用超级块,那么系统将允许等待队列中的第一个进程控制超级块继续运行。进程的数据被写入到新分配的数据块中。如果新分配的数据块无法容纳全部的数据,则整个分配过程将重复进行。 1.3 VFS图1 - 4显示了Linux系统内核中的VFS和实际文件系统之间的关系。 VFS必须管理同时挂接在系统上的不同的文件系统。它通过使用描述整个 VFS的数据结构和描述实际挂接的文件系统的数据结构来管理这些不同的文件系统。图1-4 VFS系统结构示意图令人易于混淆的是,VFS和ext2文件系统一样使用超级块和索引节点来描述系统中的文件。和e

24、xt2中的索引节点一样,VFS的索引节点用来描述系统中的文件和目录。当一个文件系统初始化时,它将在 VFS中登记。这些过程在系统启动操作系统初始化时完成。实际的文件系统或者内建到系统内核中,或者作为可装入模块在需要时装入。当一个基于块设备的文件系统挂接时,当然也包括根文件系统, VFS首先要读取它的超级块。每一个文件系统的超级块读取程序都必须先清楚文件系统的结构,然后把有关的信息添加到 VFS的超级块数据结构中。VFS中保存了系统中挂接的文件系统的链表以及这些文件系统对应的 VFS超级块。每一个VFS超级块都包含一些信息和指向一些执行特别功能的子程序的指针。例如,代表挂接的ext2文件系统的V

25、FS超级块包含了一个指向ext2索引节点读取程序的指针。这个 ext2索引节点读取程序,和其他文件系统索引节点的读取程序一样,把信息添加到 VFS索引节点中的字段中。每一个 VFS超级块都包含了一个指向文件系统中第一个 VFS索引节点的指针。对于根文件系统来说,第一个VFS索引节点是代表/目录的索引节点。这种对应关系对于 ext2文件系统来说十分有效,但对于其他的文件系统则效果一般。当系统中的进程存取目录和文件时,需要调用系统中的子程序来遍厉搜索系统中的 VFS索引节点。例如,键入 l s或者c a t命令将导致VFS搜索整个文件系统中的 VFS索引节点。因为系统中的每一个文件和目录都由一个索

26、引节点来表示,那么有些索引节点将经常会被重复地搜索。这些索引节点将保存在索引节点缓存中,这样将增快以后的存取速度。如果要找的索引节点不在索引节点缓存中,那么进程将调用一个特殊的系统程序来读取相应的索引节点。读取了索引节点以后,此索引节点将放在索引节点缓存中。最少用到的索引节点将被交换出索引节点缓存。所有的Linux系统中的文件系统都使用一个相同的缓冲区缓存来保存相应的块设备中的数据缓冲区,这样可以加速所有的文件系统对其物理设备的存取。这个缓冲区缓存和 Linux系统中的各个不同的文件系统无关,并且缓冲区缓存集成到了 Linux内核用来分配和读写数据缓冲区的机制中。把 Linux中的各个文件系统

27、和其相应的物理设备分开是有很大好处的。所有的块设备都在 Linux系统内核中注册,并且提供一个相同的,以数据块为基础的,一般情况下是异步的接口。当实际文件系统从相应的物理设备中读取数据时,将导致文件系统控制的物理设备读取它的物理块。当文件系统读取数据块时,它们把数据块保存在所有文件系统和系统内核共同使用的公共的缓冲区缓存中。缓冲区缓存中的缓冲区以它们的数据块号和读取设备的标识符名来区分。所以,如果需要一些相同的数据,那么这些数据将从系统的缓冲区缓存而不是磁盘中读出,这就加快了读取的速度。 VFS中也保存了一个目录查找缓存,一些经常使用的目录的索引节点将会很快地找到。目录缓存中并不保存目录的索引

28、节点本身,索引节点保存在索引节点缓存中,目录缓存只是简单地保存目录的名字和目录的索引节点号的对应关系。 1.3.1 VFS 超级块每一个挂接的文件系统都有一个VFS超级块,VFS超级块包括以下主要信息: 1. 设备这是存储文件系统的物理块设备的设备标识符。例如,系统中第一个 I D E磁盘/ d e v / h d a 1的标识符为0 x 3 0 1。 2. 索引节点指针挂接的(m o u n t e d)索引节点指针指向文件系统的第一个索引节点。覆盖的( c o v e r e d)索引节点指针指向文件系统挂接的目录的索引节点。根目录文件系统的 VFS超级块中没有覆盖的索引节点指针。 3.

29、数据块大小文件系统数据块的字节数,例如, 1 0 2 4字节。 4. 超级块操作指向文件系统的一系列超级块子过程的指针。 VFS可以使用这些子过程读写索引节点和超级块。 5. 文件系统类型指向挂接的文件系统的f i l e _ s y s t e m _ t y p e数据结构的指针。6. 文件系统的特殊的信息指向文件系统所需要的信息的指针。 1.3.2 VFS 索引节点像EXT2文件系统一样, VFS 中每一个文件和目录都有一个且仅有一个 VFS索引节点。每一个VFS索引节点中的信息都是文件系统的一些特殊的子过程根据相应的文件系统的信息产生的。VFS索引节点只在系统需要时才保存在系统内核的内

30、存及 VFS索引节点缓存中。它包括以下主要内容: 1. 设备这是索引节点代表的文件或目录所在的设备的设备标识符。 2. 索引节点号索引节点号在文件系统中是唯一的。索引节点号加上设备号在 VFS中是唯一的。 3. 模式用来描述VFS索引节点代表的是文件、目录或其他内容,以及对它的存取权限。 4. 用户的标识符表示用户的标识符。 5. 时间创建、修改和写入的时间。 6. 数据块大小文件数据块的大小,例如,1 0 2 4字节。 7. 索引节点操作一个指向一系列子程序地址的指针。这些子程序和相应的文件系统有关,它们执行有关此索引节点的各种操作,例如,截断此索引节点代表的文件。 8. 计数器正在使用VF

31、S索引节点的系统进程。 9. 锁定用于锁定VFS索引节点,例如,当文件系统读取索引节点的时候。 10. 已修改(d i r t y)指示索引节点是否已经被修改了,如果已修改,则相应的文件系统也需要修改。11. 文件系统的一些特殊的信息指向文件系统所需要的信息的指针。 1.3.3 登记文件系统构建Linux系统内核时,需要选择文件系统。当系统内核建好以后,文件系统的起始程序将包括调用系统中所有文件系统的初始化程序的调用。 Linux文件系统也可以作为系统的模块在需要时装入,或者使用 i n s m o d命令手工地装入。每当一个文件系统装入时,它都要在系统内核中登记。同样,当文件系统卸载时,也要从系统内核中取消登记。每一个文件系统的初始化程序都在 VFS中登记,并且创建一个 f i l e _ s y s t e m _ t y p e数据结构,其中包括文件系统的名字和指向 VFS超级块读取程序地址的指针。图1- 5显示所有file_system_type 结构组成的一个由file_systems 指针指向的链表。每一个file_system_type 结构都包括以下的信息:图1-5 文件系统结构示意图1. 超级块读取程序当一个文件系统挂接时,VFS使用此程序读取文件系统的超级块。 2. 文件系统名文件系统的名称,例如ext2。 3. 需要的设备指出文件系统是否需要设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1