Linux文件系统.docx
- 文档编号:9180498
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:25
- 大小:157.77KB
Linux文件系统.docx
《Linux文件系统.docx》由会员分享,可在线阅读,更多相关《Linux文件系统.docx(25页珍藏版)》请在冰豆网上搜索。
Linux文件系统
Linux文件系统分析
福州大学刘延华
本文介绍有关Linux文件系统的有关内容。
1.1Linux文件系统概述2
1.2ext2文件系统5
1.2.1ext2的索引节点7
1.2.2ext2超级块9
1.2.3ext2数据块组描述符11
1.2.4ext2中的目录12
1.2.5在ext2文件系统中查找文件13
1.2.6改变ext2文件系统中文件的大小15
1.3VFS17
1.3.1VFS超级块21
1.3.2VFS索引节点22
1.3.3登记文件系统24
1.3.4挂接文件系统26
1.3.5在VFS中查找文件29
1.3.6撤消文件系统29
1.3.7VFS索引节点缓存30
1.3.8VFS目录缓存32
1.4缓冲区缓存34
1.5/proc文件系统40
1.1Linux文件系统概述
Linux系统的一个重要特征就是支持多种不同的文件系统。
这样,Linux系统就十分的灵活,并且可以十分容易地和其他操作系统共存。
目前,Linux系统支持大约15个文件系统:
EXT、EXT2、XIA、MINIX、UMSDOS、MSDOS、VFAT、PROC、SMB、NCP、ISO9660、SYSV、HPFS、AFFS和UFS。
并且,毫无疑问,Linux系统支持的文件系统还会增加。
在Linux系统中,每一个单独的文件系统都是代表整个系统的树状结构的一部分。
当挂接一个新的文件系统时,Linux把它添加到这个树状的文件系统中。
所有系统中的文件系统,不管是什么类型,都挂接到一个目录下,并隐藏掉目录中原有的内容。
这个目录叫做挂接目录或者挂接点。
当文件系统卸载掉时,目录中的原有内容将再一次的显示出来。
初始化时磁盘将被划分成几个逻辑分区。
每一个逻辑分区可以使用一种文件系统,例如EXT2文件系统。
文件系统把存储在物理驱动器中的文件组织成一个树状的目录结构。
可以存储文件的设备称为块设备。
Linux文件系统把这些块设备当作简单的线形块的集合,而不管物理磁盘的结构如何,而将读写某一个设备块的请求转换成特定的磁道、扇区和柱面是通过设备的驱动程序实现的。
因此,不同的设备控制器控制的不同设备中的不同文件系统在Linux中都可以同样地使用。
文件系统甚至可以不在当地的系统中,也就是说,文件系统可以通过网络远程连接到本地磁盘上。
请看下面的例子,这是一个Linux在SCSI磁盘上的根文件系统:
A
E
boot
etc
lib
opt
tmp
usr
C
F
cdrom
fd
proc
root
var
sbin
D
bin
dev
home
mnt
lost+found
在这里,用户和使用文件的程序都不必知道/C实际上是挂接的VFAT文件系统,而VFAT文件系统本身却存储在系统中的一个IDE硬盘上。
同样,/E是系统中第二个IDE控制器控制的主硬盘系统。
也可以使用调制解调器将远程的文件系统挂接到/mnt/remote目录下。
一个文件系统中不仅包括含有数据的文件,而且还存储着文件系统的结构。
文件系统中的信息必须是安全和保密的。
Linux系统中的第一个文件系统是Minux,但它的文件名只能有14个字符,最大的文件长度是64M字节。
所以,1992年4月引进了第一个专门为Linux设计的文件系统--ext(extendedfilesystem)。
但ext的功能还是有限。
最后在1993年又推出了一个新的文件系统--ext2。
当Linux引进ext文件系统时有了一个重大的改进:
真正的文件系统从操作系统和系统服务中分离出来,在它们之间使用了一个接口层-虚拟文件系统VFS(VirtualFilesystem)。
VFS允许Linux支持多种不同的文件系统,每个文件系统都要提供给VFS一个相同的接口。
这样所有的文件系统对系统内核和系统中的程序来说看起来都是相同的。
Linux系统中的VFS层使得你可以同时在系统中透明地挂接很多不同的文件系统。
VFS能高速度及高效率地存取系统中的文件,同时它还得确保文件和数据的正确性。
这两个目标有时可能相互矛盾。
VFS在每个文件系统挂接和使用时把文件系统的有关信息暂时保存在内存中,所以当内存中的信息改变时,例如创建、写入和删除目录和文件时,系统要保证正确地升级文件系统中相关的内容。
如果你了解在系统内核中运行的文件系统的数据结构,那么你也就了解了文件系统读取的数据块的情况。
系统缓存中最重要的就是缓冲区缓存,它被集成到每个单独的文件系统存取它们的块设备所使用的方法中。
每当系统存取数据块时,数据块都被放入缓冲区缓存中,并且依照它们的状态保存到各种各样的队列中。
缓冲区缓存中不仅保存了数据缓冲区,而且还可以帮助管理和块设备驱动程序之间的异步接口。
1.2ext2文件系统
ext2的物理结构图参见图1-1。
图1-1文件使用ext2示意图
ext2文件系统是Linux系统中最为成功的文件系统,各种Linux的系统发布都将ext2文件系统作为操作系统的基础。
ext2文件系统中的数据是以数据块的方式存储在文件中的。
这些数据块具有同样的大小,并且其大小可以在ext2创建时设定。
每一个文件的长度都要补足到块的整数倍。
例如,如果一个块的大小是1024字节,那么一个1025字节大小的文件则占用两个数据块。
所以,平均来说一个文件将浪费半个数据块的空间。
但这样可以减轻系统中CPU的负担。
文件系统中不是所有的数据块都存储数据,一些数据块用来存储一些描述文件系统结构的信息。
ext2通过使用索引节点(inode)数据结构来描述系统中的每一个文件。
索引节点描述了文件中的数据占用了哪一个数据块以及文件的存取权限、文件的修改时间和文件类型等信息。
ext2文件系统中的每一个文件都只有一个索引节点,而每一个索引节点都有一个唯一的标识符。
文件系统中的所有的索引节点都保存在索引节点表中。
ext2中的目录只是一些简单的特殊文件,这些文件中包含指向目录入口的索引节点的指针。
对于一个文件系统来说,某一个块设备只是一系列可以读写的数据块。
文件系统无须关心数据块在设备中的具体位置,这是设备驱动程序的工作。
每当文件系统需要从块设备中读取数据时,它就要求设备驱动程序读取整数数目的数据块。
ext2文件系统将它所占用的设备的逻辑分区分成了数据块组。
每一个数据块组都包含一些有关整个文件系统的信息以及真正的文件和目录的数据块。
1.2.1ext2的索引节点
ext2的索引节点图参见图1-2。
图1-2EXT2系统索引节点示意图
在ext2文件系统中索引节点是一切的基础,文件系统中的每一个文件和目录都使用一个唯一的索引节点。
每一个数据块组中的索引节点都保存在索引节点表中。
数据块组中还有一个索引节点位图,它用来记录系统中已分配和未分配的索引节点。
下面是ext2的索引节点的一些主要的字段:
1.mode
这里保存两个信息:
一个是此索引节点描述的是什么,另一个是用户拥有的权限。
例如,对于ext2,一个索引节点可以描述文件、目录、符号连接、块设备、字符设备以及FIFO结构。
2.OwnerInformation
这是文件或目录所有者的用户和组标识符。
这使得文件系统可以正确地授权某种存取操作。
3.Size
文件的字节大小。
4.Timestamps
索引节点建立的时间和索引节点最后修改的时间。
5.Datablocks
指向存储此索引节点描述文件的数据块的指针。
前十二个指针是指向存储数据的物理数据块的指针,而后三个指针则包括不同级别的间接指针。
例如,两级指针指向一个指向其他指针块的指针块。
这意味着小于或者等于12个数据块的文件的存取速度要高于多于12个数据块的文件。
你应该注意到ext2的索引节点可以描述一些特殊的设备文件。
这些设备文件不是真正的文件,但系统中的程序可以使用这些设备文件来存取它们相关的设备。
所有的这些设备文件都在/dev目录下面。
例如,挂接程序可以把它希望挂接的设备文件作为它的一个参数。
1.2.2ext2超级块
超级块(Superblock)存储着描述文件系统的大小和形状的基本信息。
文件系统的管理员可以使用其中的信息来使用和维护文件系统。
一般情况下,当文件系统挂接时,系统只读取数据块组0中的超级块,但每一个数据块组中都包含一个超级块的副本,以防系统崩溃时使用。
超级块包括如下的主要信息:
1.MagicNumber(幻数)使挂接程序确认这是ext2文件系统的超级块。
目前其值为0xEF53。
2.RevisionLevel(修订级别)
这是文件系统的主版本号和从版本号。
挂接程序可以根据此信息决定此文件系统是否支持一些特定文件系统的函数。
3.MountCount(挂接数)和MaximumMountCount(最大挂接数)
系统用来决定文件系统是否应该全面地检查。
文件系统每挂接一次,mountcount的值就会加1。
当mountcount的值和maximummountcount的值相等时,系统将显示maximalmountcountreached,runninge2fsckisrecommended信息,提示用户进行文件系统的检查。
4.BlockGroupNumber(块组号)
包含此超级块的数据块组号。
5.BlockSize(块大小)文件系统中数据块的大小,例如1024字节。
6.BlocksperGroup(每组块数)数据块组中的数据块数目和BlockSize一样,它在文件系统创建以后就是固定的了。
7.FreeBlocks(空闲块)
文件系统中空闲的数据块的数目。
8.FreeInodes(空闲索引节点)
文件系统中空闲的索引节点的数目。
9.FirstInode(第一个索引节点)
文件系统中的第一个索引节点号。
在一个ext2根文件系统中,第一个索引节点是/目录的入口。
1.2.3ext2数据块组描述符
每一个数据块组都有一个描述它的数据结构和超级块一样,在每一个数据块组中都要复制一份数据块组描述符。
数据块组描述符包含以下的信息:
1.BlocksBitmap(块位图)
2.InodeBitmap(索引节点位图)
3.InodeTable(索引节点表)
数据块组中数据块分配位图所占的数据块数。
在数据块分配和数据块撤消时使用。
数据块组中索引节点分配位图所占的数据块数。
在索引节点的分配和撤消中使用。
数据块组中索引节点表所占的数据块数。
系统中的每一个索引节点都由一个数据结构来描述。
4.Freeblockscount(空闲块数)、FreeInodescount(空闲索引节点数),Useddirectorycount(已用目录数)
这是空闲的数据块数,空闲的索引节点数和已用的目录数。
数据块组描述符组成一个数据块组描述符表。
每一个数据块组在其超级块之后都包含一个数据块组描述符表的副本。
EXT2文件系统事实上只是使用数据块组0中的数据块描述符表。
1.2.4ext2中的目录
在ext2文件系统中,目录是一些特殊的文件,它们用来创建和保存系统中文件的存取路径。
图1-3是一个目录入口在内存中的结构图。
图1-3EXT2文件系统目录结构示意图
一个目录文件包括很多的目录入口,一个目录入口包括以下的内容:
1.inode(索引节点)
目录入口的索引节点。
这是保存在数据块组中的索引节点表数组的索引值。
在上图中,file的目录入口的索引节点号的引用是i1。
2.namelength(名称长度)
目录入口的字节长度。
3.name(名称)
目录入口的名字。
每一个目录的头两个入口都是标准的.和..,分别代表本目录和父目录。
1.2.5在ext2文件系统中查找文件
Linux系统的文件名格式和Unix系统的文件名格式一样,其中的目录名用斜杠(/)分隔。
例如,文件名/home/zws/.cshrc,其中/home和/zws是目录名,.cshrc则是文件名。
Linux系统中的文件名可以由任何可打印的字符组成,也可以是任何的长度。
系统通过分析目录中的文件,来查找文件对应的索引节点。
系统需要的第一个索引节点是文件系统根目录的索引节点,它的值保存在文件系统的超级块中。
要读取一个ext2文件系统的索引节点,我们必须在相应的数据块组中的索引节点表中查找。
例如,如果一个根目录的索引节点值是42,那么我们需要读取在数据块组0中的索引节点表中的第42个索引节点。
根目录索引节点是一个ext2的目录节点,也就是说,根目录索引节点的模式(mode)是目录,而它的数据块中包含的是ext2目录的入口。
home目录只是众多目录入口中的一个,我们可以从中查找出描述/home/zws目录的索引节点值。
接下来我们读取这个目录(首先读取它的索引节点,然后读取此索引节点描述的数据块中的zws目录),从中查找描述/home/zws目录的索引节点值。
最后,在描述/home/zws目录的索引节点指向的目录入口中找到.cshrc文件的索引节点值,通过它的索引节点值找到存储在文件中的数据的数据块。
1.2.6改变ext2文件系统中文件的大小
文件系统的一个常见的问题就是文件碎片问题。
存储文件数据的数据块可能散布在整个文件系统中,这样顺序存取一个文件的数据块可能变得效率越来越低。
ext2文件系统通过为一个文件的新数据块分配靠近当前数据块的物理块或同一个数据块组中的数据块来解决文件碎片问题。
只有当这样的分配策略不能实现时,ext2才为新的文件数据块分配其他数据块组中的数据块。
当进程往文件中写入数据时,ext2文件系统都要检查数据是否已经超出了文件最后分配的数据块的范围。
如果写入的数据超出了该范围,那么文件系统必须为此文件分配一个新的数据块。
在这之前,进程不能继续运行。
ext2文件系统的数据块分配过程所做的第一件事就是锁定此文件系统的ext2超级块。
分配和撤消数据块需要改变超级块中字段的内容,并且Linux文件系统不允许多个进程同时修改超级块。
如果另外的进程在此时也需要分配新的数据块,那么它必须等待直到正在运行的进程处理完对超级块的修改并释放对超级块的控制才能恢复运行。
对超级块的操作本着先来先服务的策略。
在锁定了超级块以后,进程将检查文件系统中有无足够的空闲数据块。
如果没有,那么进程的分配请求将失败,进程将放弃对文件系统超级块的控制权。
如果系统中有足够的空闲数据块,则进程将为文件分配所需要的数据块。
如果ext2文件系统内建有预分配的数据块,那么我们可以使用预分配数据块。
预分配数据块实际上并不存在,它们保留在已分配的数据块位图中。
申请分配新数据块的文件的VFS索引节点有两个特别的字段:
prealloc_block和prealloc_count,分别是第一个预分配数据块的块号和可以使用的预分配块数。
如果没有预分配数据块或者系统中没有预分配数据块功能,ext2文件系统必须分配一个新的数据块。
它首先查看文件中最后一个数据块的后一个数据块是否空闲。
逻辑上,这个数据块是最为有效的数据块,因为这样可以加速对文件顺序的存取。
如果此数据块没有空闲,那么文件系统将加大搜索的范围,在64个数据块的范围内查找理想的数据块。
如果甚至连这样的空闲数据块找不到,进程则开始查看其他数据块组直到找到一个空闲的数据块为止。
数据块分配程序查找某一个数据块组中的一簇,也就是8个空闲的数据块。
如果无法找到8个连续的空闲数据块,数据块分配程序将查找较少的连续的空闲数据块。
无论在那一个数据块组中查找到空闲的数据块,数据块分配程序都将更新数据块组中的数据块位图,并且在缓冲区缓存中分配一个数据缓冲区。
这个分配的数据缓冲区由设备标识符和已分配的数据块的块号来标识。
最后将超级块标记为dirty来表明超级块已经改动,同时文件系统将超级块解锁。
此时,如果有任何进程等待使用超级块,那么系统将允许等待队列中的第一个进程控制超级块继续运行。
进程的数据被写入到新分配的数据块中。
如果新分配的数据块无法容纳全部的数据,则整个分配过程将重复进行。
1.3VFS
图1-4显示了Linux系统内核中的VFS和实际文件系统之间的关系。
VFS必须管理同时挂接在系统上的不同的文件系统。
它通过使用描述整个VFS的数据结构和描述实际挂接的文件系统的数据结构来管理这些不同的文件系统。
图1-4VFS系统结构示意图
令人易于混淆的是,VFS和ext2文件系统一样使用超级块和索引节点来描述系统中的文件。
和ext2中的索引节点一样,VFS的索引节点用来描述系统中的文件和目录。
当一个文件系统初始化时,它将在VFS中登记。
这些过程在系统启动操作系统初始化时完成。
实际的文件系统或者内建到系统内核中,或者作为可装入模块在需要时装入。
当一个基于块设备的文件系统挂接时,当然也包括根文件系统,VFS首先要读取它的超级块。
每一个文件系统的超级块读取程序都必须先清楚文件系统的结构,然后把有关的信息添加到VFS的超级块数据结构中。
VFS中保存了系统中挂接的文件系统的链表以及这些文件系统对应的VFS超级块。
每一个VFS超级块都包含一些信息和指向一些执行特别功能的子程序的指针。
例如,代表挂接的ext2文件系统的VFS超级块包含了一个指向ext2索引节点读取程序的指针。
这个ext2索引节点读取程序,和其他文件系统索引节点的读取程序一样,把信息添加到VFS索引节点中的字段中。
每一个VFS超级块都包含了一个指向文件系统中第一个VFS索引节点的指针。
对于根文件系统来说,第一个VFS索引节点是代表/目录的索引节点。
这种对应关系对于ext2文件系统来说十分有效,但对于其他的文件系统则效果一般。
当系统中的进程存取目录和文件时,需要调用系统中的子程序来遍厉搜索系统中的VFS索引节点。
例如,键入ls或者cat命令将导致VFS搜索整个文件系统中的VFS索引节点。
因为系统中的每一个文件和目录都由一个索引节点来表示,那么有些索引节点将经常会被重复地搜索。
这些索引节点将保存在索引节点缓存中,这样将增快以后的存取速度。
如果要找的索引节点不在索引节点缓存中,那么进程将调用一个特殊的系统程序来读取相应的索引节点。
读取了索引节点以后,此索引节点将放在索引节点缓存中。
最少用到的索引节点将被交换出索引节点缓存。
所有的Linux系统中的文件系统都使用一个相同的缓冲区缓存来保存相应的块设备中的数据缓冲区,这样可以加速所有的文件系统对其物理设备的存取。
这个缓冲区缓存和Linux系统中的各个不同的文件系统无关,并且缓冲区缓存集成到了Linux内核用来分配和读写数据缓冲区的机制中。
把Linux中的各个文件系统和其相应的物理设备分开是有很大好处的。
所有的块设备都在Linux系统内核中注册,并且提供一个相同的,以数据块为基础的,一般情况下是异步的接口。
当实际文件系统从相应的物理设备中读取数据时,将导致文件系统控制的物理设备读取它的物理块。
当文件系统读取数据块时,它们把数据块保存在所有文件系统和系统内核共同使用的公共的缓冲区缓存中。
缓冲区缓存中的缓冲区以它们的数据块号和读取设备的标识符名来区分。
所以,如果需要一些相同的数据,那么这些数据将从系统的缓冲区缓存而不是磁盘中读出,这就加快了读取的速度。
VFS中也保存了一个目录查找缓存,一些经常使用的目录的索引节点将会很快地找到。
目录缓存中并不保存目录的索引节点本身,索引节点保存在索引节点缓存中,目录缓存只是简单地保存目录的名字和目录的索引节点号的对应关系。
1.3.1VFS超级块
每一个挂接的文件系统都有一个VFS超级块,VFS超级块包括以下主要信息:
1.设备
这是存储文件系统的物理块设备的设备标识符。
例如,系统中第一个IDE磁盘/dev/hda1的标识符为0x301。
2.索引节点指针
挂接的(mounted)索引节点指针指向文件系统的第一个索引节点。
覆盖的(covered)索引节点指针指向文件系统挂接的目录的索引节点。
根目录文件系统的VFS超级块中没有覆盖的索引节点指针。
3.数据块大小文件系统数据块的字节数,例如,1024字节。
4.超级块操作
指向文件系统的一系列超级块子过程的指针。
VFS可以使用这些子过程读写索引节点和超级块。
5.文件系统类型指向挂接的文件系统的file_system_type数据结构的指针。
6.文件系统的特殊的信息
指向文件系统所需要的信息的指针。
1.3.2VFS索引节点
像EXT2文件系统一样,VFS中每一个文件和目录都有一个且仅有一个VFS索引节点。
每一个VFS索引节点中的信息都是文件系统的一些特殊的子过程根据相应的文件系统的信息产生的。
VFS索引节点只在系统需要时才保存在系统内核的内存及VFS索引节点缓存中。
它包括以下主要内容:
1.设备
这是索引节点代表的文件或目录所在的设备的设备标识符。
2.索引节点号
索引节点号在文件系统中是唯一的。
索引节点号加上设备号在VFS中是唯一的。
3.模式
用来描述VFS索引节点代表的是文件、目录或其他内容,以及对它的存取权限。
4.用户的标识符
表示用户的标识符。
5.时间
创建、修改和写入的时间。
6.数据块大小文件数据块的大小,例如,1024字节。
7.索引节点操作
一个指向一系列子程序地址的指针。
这些子程序和相应的文件系统有关,它们执行有关此索引节点的各种操作,例如,截断此索引节点代表的文件。
8.计数器
正在使用VFS索引节点的系统进程。
9.锁定
用于锁定VFS索引节点,例如,当文件系统读取索引节点的时候。
10.已修改(dirty)
指示索引节点是否已经被修改了,如果已修改,则相应的文件系统也需要修改。
11.文件系统的一些特殊的信息
指向文件系统所需要的信息的指针。
1.3.3登记文件系统
构建Linux系统内核时,需要选择文件系统。
当系统内核建好以后,文件系统的起始程序将包括调用系统中所有文件系统的初始化程序的调用。
Linux文件系统也可以作为系统的模块在需要时装入,或者使用insmod命令手工地装入。
每当一个文件系统装入时,它都要在系统内核中登记。
同样,当文件系统卸载时,也要从系统内核中取消登记。
每一个文件系统的初始化程序都在VFS中登记,并且创建一个file_system_type数据结构,其中包括文件系统的名字和指向VFS超级块读取程序地址的指针。
图1-5显示所有file_system_type结构组成的一个由file_systems指针指向的链表。
每一个file_system_type结构都包括以下的信息:
图1-5文件系统结构示意图
1.超级块读取程序当一个文件系统挂接时,VFS使用此程序读取文件系统的超级块。
2.文件系统名文件系统的名称,例如ext2。
3.需要的设备
指出文件系统是否需要设
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 文件系统