分享
 
 
 

linux bible 第九章 文件系统

王朝system·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

第九章 文件系统

本章主要描叙Linux核心对文件系统的支持,虚拟文件系统(VFS)以

及Linux核心对实际文件系统的支持。

Linux的最重要特征之一就是支持多种文件系统。这样它更加灵活并

可以和许多其它种操作系统共存。在本文写作时Linux已经支持15种

文件系统:ext,ext2,xia,minix,umsdos,msdos,vfat,proc,smb,ncp,

iso9660,sysv,hpfs,affs以及ufs。毫无疑问,今后支持的文件系统类

型还将增加。

Linux和Unix并不使用设备标志符(如设备号或驱动器名称)来访问独

立文件系统,而是通过一个将整个文件系统表示成单一实体的层次树

结构来访问它。Linux每安装(mount)一个文件系统时都会其加入到文

件系统层次树中。不管是文件系统属于什么类型,都被连接到一个目

录上且此文件系统上的文件将取代此目录中已存在的文件。这个目录

被称为安装点或者安装目录。当卸载此文件系统时这个安装目录中原

有的文件将再次出现。

当磁盘初始化时(使用fdisk),磁盘中将添加一个描叙物理磁盘逻辑

构成的分区结构。每个分区可以拥有一个独立文件系统如EXT2。文件

系统将文件组织成包含目录,软连接等存在于物理块设备中的逻辑层

次结构。包含文件系统的设备叫块设备。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实

际上是位于系统第一个IDE硬盘上并已安装VFAT文件系统。在此例中/E表

示系统中第二个IDE控制器上的主IDE硬盘。至于第一个IDE控制器是PCI

控制器和第二个则是控制IDE CDROM的ISA控制器无关紧要。当使用modem

通过PPP网络协议来拨入网络时,可以将Alpha AXP Linux文件系统安装到

/mnt/remote目录下。

文件系统中的文件是数据的集合;包含本章内容的文件是一个名叫

filesystems.tex的ASCII文件。文件系统不仅包含着文件中的数据而且还

有文件系统的结构。所有Linux用户和程序看到的文件、目录、软连接及

文件保护信息等都存储在其中。此外文件系统中必须包含安全信息以便

保持操作系统的基本完整性。没人愿意使用一个动不动就丢失数据和文件

的操作系统。

Linux最早的文件系统是Minix,它受限甚大且性能低下。其文件名最长不

能超过14个字符(虽然比8.3文件名要好)且最大文件大小为64M字节。64M

字节看上去很大,但实际上一个中等的数据库将超过这个尺寸。第一个专

门为Linux设计的文件系统被称为扩展文件系统(Extended File System)

或EXT。它出现于1992年四月,虽然能够解决一些问题但性能依旧不好。

1993年扩展文件系统第二版或EXT2被设计出来并添加到Linux中。它是本

章将详细讨论的文件系统。

将EXT文件系统添加入Linux产生了重大影响。每个实际文件系统从操作系

统和系统服务中分离出来,它们之间通过一个接口层:虚拟文件系统或VFS

来通讯。

VFS使得Linux可以支持多个不同的文件系统,每个表示一个VFS的通用接口。

由于软件将Linux文件系统的所有细节进行了转换,所以Linux核心的其它部

分及系统中运行的程序将看到统一的文件系统。Linux的虚拟文件系统允许

用户同时能透明地安装许多不同的文件系统。

虚拟文件系统的设计目标是为Linux用户提供快速且高效的文件访问服务。

同时它必须保证文件及其数据的正确性。这两个目标相互间可能存在冲突。

当安装一个文件系统并使用时,Linux VFS为其缓存相关信息。此缓存中数

据在创建、写入和删除文件与目录时如果被修改,则必须谨慎地更新文件

系统中对应内容。如果能够在运行核心内看到文件系统的数据结构,那么

就可以看到那些正被文件系统读写的数据块。描叙文件与目录的数据结构

被不断的创建与删除而设备驱动将不停地读取与写入数据。这些缓存中最

重要的是Buffer Cache,它被集成到独立文件系统访问底层块设备的例程

中。当进行块存取时数据块首先将被放入Buffer Cache里并根据其状态保

存在各个队列中。此Buffer Cache不仅缓存数据而且帮助管理块设备驱动

中的异步接口。

9.1 第二代扩展文件系统(EXT2)

第二代扩展文件系统由Rey

Card设计,其目标是为Linux提供一个强大的可扩展文件系统。它同时也

是Linux界中设计最成功的文件系统。

象很多文件系统一样,EXT2建立在数据被保存在数据块中的文件内这个前

提下。这些数据块长度相等且这个长度可以变化,某个EXT2文件系统的块

大小在创建(使用mke2fs)时设置。每个文件的大小和刚好大于它的块大

小正数倍相等。如果块大小为1024字节而一个1025字节长的文件将占据两

个1024字节大小的块。这样你不得不浪费差不多一般的空间。我们通常需

要在CPU的内存利用率和磁盘空间使用上进行折中。而大多数操作系统,包

括Linux在内,为了减少CPU的工作负载而被迫选择相对较低的磁盘空间利

用率。并不是文件中每个块都包含数据,其中有些块被用来包含描叙此文

件系统结构的信息。EXT2通过一个inode结构来描叙文件系统中文件并确定

此文件系统的拓扑结构。inode结构描叙文件中数据占据哪个块以及文件的

存取权限、文件修改时间及文件类型。EXT2文件系统中的每个文件用一个

inode来表示且每个inode有唯一的编号。文件系统中所有的inode都被保存

在inode表中。EXT2目录仅是一个包含指向其目录入口指针的特殊文件

(也用inode表示)。

占用一系列数据块的EXT2文件系统的布局。对文件系统而言文件仅是一

系列可读写的数据块。文件系统并不需要了解数据块应该放置到物理介质

上什么位置,这些都是设备驱动的任务。无论何时只要文件系统需要从包

含它的块设备中读取信息或数据,它将请求底层的设备驱动读取一个基本

块大小整数倍的数据块。EXT2文件系统将它所使用的逻辑分区划分成数据

块组。每个数据块组将那些对文件系统完整性最重要的信息复制出来,同时

将实际文件和目录看作信息与数据块。为了发生灾难性事件时文件系统的

修复,这些复制非常有必要。以下一节将着重描叙每个数据块组的内容。

9.1.1 The EXT2 Inode

在EXT2文件系统中inode是基本块;文件系统中的每个文件与目录由唯一的

inode来描叙。每个数据块组的EXT2inode被保存在inode表中,同时还有一

个位图被系统用来跟踪已分配和未分配的inode。

inode的格式,它包含以下几个域:

mode

它包含两类信息;inode描叙的内容以及用户使用权限。EXT2中的

inode可以表示一个文件、目录、符号连接、块设备、字符设备或FIFO。

Owner Information

表示此文件或目录所有者的用户和组标志符。文件系统根据它可以

进行正确的存取。

Size 以字节计算的文件尺寸。

Timestamps

inode创建及最后一次被修改的时间。

Datablocks

指向此inode描叙的包含数据的块指针。前12个指针指向包含由inode

描叙的物理块,最后三个指针包含多级间接指针。例如两级间接指针

指向一块指针,而这些指针又指向一些数据块。这意味着访问文件尺

寸小于或等于12个数据块的文件将比访问大文件快得多。

EXT2 inode还可以描叙特殊设备文件。虽然它们不是真正的文件,但可以通

过它们访问设备。所有那些位于/dev中的设备文件可用来存取Linux设备。

例如mount程序可把设备文件作为参数。

9.1.2 EXT2 超块

超块中包含了描叙文件系统基本尺寸和形态的信息。文件系统管理器利用

它们来使用和维护文件系统。通常安装文件系统时只读取数据块组0中的超

块,但是为了防止文件系统被破坏,每个数据块组都包含了复制拷贝。超块

包含如下信息:

Magic Number

文件系统安装软件用来检验是否是一个真正的EXT2文件系统超块。当

前EXT2版本中为0xEF53。

Revision Level

这个主从修订版本号让安装代码能判断此文件系统是否支持只存在于

某个特定版本文件系统中的属性。同时它还是特性兼容标志以帮助安

装代码判断此文件系统的新特性是否可以安全使用。

Mount Count and Maximum Mount Count

系统使用它们来决定是否应对此文件系统进行全面检查。每次文件系

统安装时此安装记数将递增,当它等于最大安装记数时系统将显示一

条警告信息“maxumal mount count reached, running e2fsck is recommended”。

Block Group Number

超块的拷贝。

Block Size

以字节记数的文件系统块大小,如1024字节。

Blocks per Group

每个组中块数目。当文件系统创建时此块大小被固定下来。

Free Blocks

文件系统中空闲块数。

Free Inodes

文件系统中空闲Inode数。

First Inode

文件系统中第一个inode号。EXT2根文件系统中第一个inode将是指

向/目录的目录入口。

9.1.3 EXT2 组标志符

每个数据块组都拥有一个描叙它结构。象超块一样,所有数据块组中的组描

叙符被复制到每个数据块组中以防文件系统崩溃。每个组描叙符包含以下信息:

Blocks Bitmap

对应此数据块组的块分配位图的块号。在块分配和回收时使用。

Inode Bitmap

对应此数据块组的inode分配位图的块号。在inode分配和回收时使用。

Inode Table

对应数据块组的inode表的起始块号。每个inode用下面的EXT2

inode结构来表示。

Free blocks count, Free Inodes count, Used directory count

组描叙符放置在一起形成了组描叙符表。每个数据块组在超块拷贝后包含整

个组描叙符表。EXT2文件系统仅使用第一个拷贝(在数据块组0中)。其它拷

贝都象超块拷贝一样用来防止主拷贝被破坏。

9.1.4 EXT2 目录

在EXT2文件系统中目录是用来创建和包含文件系统中文件存取路径的特殊文件。

目录文件是一组目录入口的链表,它们包含以下信息:

inode

对应每个目录入口的inode。它被用来索引储存在数据块组的Inode表中

的inode数组。

name length

以字节记数的目录入口长度。

name

目录入口的名称

每个目录的前两个入口总是"."和".."。它们分别表示当前目录和父目录。

9.1.5 在EXT2文件系统中搜寻文件

Linux文件名的格式与Unix类似,是一系列以"/"隔开的目录名并以文件名结尾。

/home/rusling/.cshrc中/home和/rusling都是目录名而文件名为.cshrc。象

Unix系统一样,Linux并不关心文件名格式本身,它可以由任意可打印字符组

成。为了寻找EXT2文件系统中表示此文件的inode,系统必须将文件名从目录

名中分离出来。

我们所需要的第一个inode是根文件系统的inode,它被存放在文件系统的超

块中。为读取某个EXT2 inode,我们必须在适当数据块组的inode表中进行搜

寻。如果根inode号为42则我们需要数据块组0 inode表的第42个inode。此

根inode对应于一个EXT2目录,即根inode的mode域将它描叙成目录且其数据

块包含EXT2目录入口。home目录是许多目录的入口同时此目录给我们提供了

大量描叙/home目录的inode。我们必须读取此目录以找到rusling目录入口,

此入口又提供了许多描叙/home/rusling目录的inode。最后读取由/home/rusling

目录描叙的inode指向的目录入口以找出.cshrc文件的inode号并从中取得包

含在文件中信息的数据块。

9.1.6 改变EXT2文件系统中文件的大小

文件系统普遍存在的一个问题是碎块化。一个文件所包含的数据块遍布整个

文件系统,这使得对文件数据块的顺序访问越来越慢。EXT2文件系统试图通

过分配一个和当前文件数据块在物理位置上邻接或者至少位于同一个数据块

组中的新块来解决这个问题。只有在这种分配策略失败时才在其它数据块组

中分配空间。

当进程准备写某文件时,

Linux文件系统首先检查数据是否已经超出了文件最后一个被分配的块空间。

如果是则必须为此文件分配一个新数据块。进程将一直等待到此分配完成;

然后将其余数据写入此文件。EXT2块分配例程所作的第一件事是对此文件系

统的EXT2超块加锁。这是因为块分配和回收将导致超块中某些域的改变,

Linux文件系统不能在同一时刻为多个进程进行此类服务。如果另外一个进程

需要分配更多的数据块时它必须等到此进程完成分配操作为止。

在超块上等待的进程将被挂起直到超块的控制权被其当前使用者释放。对超

块的访问遵循先来先服务原则,一旦进程取得了超块的控制则它必须保持到

操作结束为止。如果系统中空闲块不多则此分配的将失败,进程会释放对文

件系统超块的控制。

如果EXT2文件系统被设成预先分配数据块则我们可以从中取得一个。预先分

配块实际上并不存在,它们仅仅包含在已分配块的位图中。我们试图为之分

配新数据块文件所对应的VFS inode包含两个EXT2特殊域:prealloc_block和

prealloc_count,它们分别代表第一个预先分配数据块的块号以及各自的数

目。如果没有使用预先分配块或块预先分配数据块策略,则EXT2文件系统必

须分配一个新块。它首先检查此文件最后一个块后的数据块是否空闲。从逻

辑上来说这是让其顺序访问更快的最有效块分配策略。如果此块已被使用则

它会在理想块周围64个块中选择一个。这个块虽然不是最理想但和此文件的

其它数据块都位于同一个数据块组中。

如果此块还是不空闲则进程将在所有其它数据块组中搜寻,直到找到一空闲

块。块分配代码将在某个数据块组中寻找一个由8个空闲数据块组成的簇。如

果找不到那么它将取更小的尺寸。如果使用了块预先分配则它将更新相应的

prealloc_block和prealloc_count。

找到空闲块后块分配代码将更新数据块组中的位图并在buffer

cache中为它分配一个数据缓存。这个数据缓存由文件系统支撑设备的标志符

以及已分配块的块号来标志。缓存中的数据被置0且缓存被标记成dirty以显

示其内容还没有写入物理磁盘。最后超块也被标记为dirty以表示它已被更新

并解锁了。如果有进程在等待这个超块则队列中的第一个进程将得到运行并

取得对超块的独占控制。如果数据块被填满则进程的数据被写入新数据块中,

以上的整个过程将重复且另一个数据块被分配。

9.2 虚拟文件系统(VFS)

Linux核心中虚拟文件系统和实际文件系统间的关系。此虚拟文

件系统必须能够管理在任何时刻mount到系统的不同文件系统。它通过维护一

个描叙整个虚拟文件系统和实际已安装文件系统的结构来完成这个工作。

容易让人混淆的是VFS使用了和EXT2文件系统类似的方式:超块和inode来描

叙文件系统。象EXT2inode一样 VFSinode描叙系统中的文件和目录以及VFS中

的内容和拓扑结构。从现在开始我将用VFSinode和VFS超块来将它们和

EXT2 inode和超块进行区分。

文件系统初始化时将其自身注册到VFS中。它发生在系统启动和操作系统初

始化时。这些实际文件系统可以构造到核心中也可以设计成可加载模块。

文件系统模块可以在系统需要时进行加载,例如VFAT就被实现成一个核心

模块,当mount VFAT文件系统时它将被加载。mount一个基于块设备且包含

根文件系统的文件系统时,VFS必须读取其超块。每个文件系统类型的超块

读取例程必须了解文件系统的拓扑结构并将这些信息映射到VFS超块结构中。

VFS在系统中保存着一组已安装文件系统的链表及其VFS超块。每个VFS

超块包含一些信息以及一个执行特定功能的函数指针。例如表示一个已安装

EXT2文件系统的超块包含一个指向EXT2相关inode读例程的指针。这个EXT2

inode读例程象所有文件系统相关读例程一样填充了VFS inode中的域。每个

VFS超块包含此文件系统中第一个VFS inode的指针。对于根文件系统此inode

表示的是"/"目录。这种信息映射方式对EXT2文件系统非常有效但是对其它

文件系统要稍差。

系统中进程访问目录和文件时将使用系统调用遍历系统的VFS inode。

例如键入ls或cat命令则会引起虚拟文件系统对表示此文件系统的VFS inode

的搜寻。由于系统中每个文件与目录都使用一个VFS inode来表示,所以许

多inode会被重复访问。这些inode被保存在inode cache中以加快访问速度。

如果某个inode不在inode cache中则必须调用一个文件系统相关例程来读取

此inode。对这个inode的读将把此它放到inode cache中以备下一次访问。

不经常使用的VFS inode将会从cache中移出。

所有Linux文件系统使用一个通用buffer cache来缓冲来自底层设备的数

据以便加速对包含此文件系统的物理设备的存取。

这个buffer

cache与文件系统无关并被集成到Linux核心分配与读写数据缓存的机制中。

让Linux文件系统独立于底层介质和设备驱动好处很多。所有的块结构设备

将其自身注册到Linux核心中并提供基于块的一致性异步接口。象SCSI设备

这种相对复杂的块设备也是如此。当实际文件系统从底层物理磁盘读取数

据时,块设备驱动将从它们所控制的设备中读取物理块。buffer cache也

被集成到了块设备接口中。当文件系统读取数据块时它们将被保存在由?nbsp;

有文件系统和Linux核心共享的全局buffer cache中。这些buffer由其块

号和读取设备的设备号来表示。所以当某个数据块被频繁使用则它很可能

能从buffercache而不是磁盘中读取出来,后者显然将花费更长的时间。有

些设备支持通过预测将下一次可能使用的数据提前读取出来。

VFS还支持一种目录cache以便对经常使用的目录对应的inode进行快速查

找。我们可以做一个这样的实验,首先我们对一个最近没有执行过列目录

操作的目录进行列目录操作。第一次列目录时你可能发现会有较短的停顿

但第二次操作时结果会立刻出现。目录cache不存储目录本身的inode;这

些应该在inodecache中,目录cache 仅仅保存全目录名和其inode号之间的

映射关系。

9.2.1 VFS 超块

每个已安装的文件系统由一个VFS超块表示;它包含如下信息:

Device

表示文件系统所在块设备的设备标志符。例如系统中第一个IDE硬盘的

设备标志符为0x301。

Inode pointers

这个mounted inode指针指向文件系统中第一个inode。而covered

inode指针指向此文件系统安装目录的inode。根文件系统的VFS超块不

包含covered指针。

Blocksize

以字节记数的文件系统块大小,如1024字节。

S

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有