Linux文件系统与案例详解及源码导读Word格式文档下载.docx

上传人:b****3 文档编号:18440864 上传时间:2022-12-16 格式:DOCX 页数:16 大小:34.16KB
下载 相关 举报
Linux文件系统与案例详解及源码导读Word格式文档下载.docx_第1页
第1页 / 共16页
Linux文件系统与案例详解及源码导读Word格式文档下载.docx_第2页
第2页 / 共16页
Linux文件系统与案例详解及源码导读Word格式文档下载.docx_第3页
第3页 / 共16页
Linux文件系统与案例详解及源码导读Word格式文档下载.docx_第4页
第4页 / 共16页
Linux文件系统与案例详解及源码导读Word格式文档下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

Linux文件系统与案例详解及源码导读Word格式文档下载.docx

《Linux文件系统与案例详解及源码导读Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Linux文件系统与案例详解及源码导读Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。

Linux文件系统与案例详解及源码导读Word格式文档下载.docx

相关文件系统的read_super函数负责填充super_block结构。

--------------------------------------------------------------------------------

源码导读

*Linux如何维护它支持的文件系统中的文件

*描述了虚拟文件系统(VirtualFileSystemVFS)

*解释了Linux核心中真实的文件系统如何被支持

Linux的一个最重要的特点之一使它可以支持许多不同的文件系统。

这让它非常灵活,可以和许多其他操作系统共存。

在写作本章的时候,Linux可一直支持15种文件系统:

ext、ext2、xia、minix、umsdos、msdos、vfat、proc、smb、ncp、iso9660、sysv、hpfs、affs和ufs,而且不容置疑,随着时间流逝,会加入更多的文件系统。

在Linux中,象Unix一样,系统可以使用的不同的文件系统不是通过设备标识符(例如驱动器编号或设备名称)访问,而是连接成一个单一的树型的结构,用一个统一的单个实体表示文件系统。

Linux在文件系统安装的时候把它加到这个单一的文件系统树上。

所有的文件系统,不管什么类型,都安装在一个目录,安装的文件系统的文件掩盖了这个目录原来存在的内容。

这个目录叫做安装目录或安装点。

当这个文件系统卸载的时候,安装目录自己的文件又可以显现出来。

当磁盘初始化的时候(比如用fdisk),利用一个分区结构把物理磁盘划分成一组逻辑分区。

每一个分区可以放一个文件系统,例如一个EXT2文件系统。

文件系统在物理设备的块上通过目录、软链接等把文件组织成逻辑的树型结构。

可以包括文件系统的设备是块设备。

系统中的第一个IDE磁盘驱动器的第一个分区,IDE磁盘分区/dev/hda1,是一个块设备。

Linux文件系统把这些块设备看成简单的线性的块的组合,不知道也不去关心底层的物理磁盘的尺寸。

把对设备的特定的块的读的请求映射到对于设备有意义的术语:

这个块保存在硬盘上的磁道、扇区和柱面,这是每一个块设备驱动程序的任务。

一个文件系统不管它保存在什么设备上,都应该用同样的方式工作,有同样的观感。

另外,使用Linux的文件系统

,是否这些不同的文件系统在不同的硬件控制器的控制下的不同的物理介质上都是无关紧要的(至少对于系统用户是这样)。

文件系统甚至可能不在本地系统上,它可能是通过网络连接远程安装的。

考虑以下的例子,一个Linux系统的根文件系统在一个SCSI磁盘上。

AEbootetclibopttmpusr

CFcdromfdprocrootvarsbin

Dbindevhomemntlost+found

不管是操作这些文件的用户还是程序都不需要知道/C实际上是在系统的第一个IDE磁盘上的一个安装的VFAT文件系统。

本例中(实际是我家中的Linux系统),/E是次IDE控制器上的masterIDE磁盘。

第一个IDE控制器是PCI控制器,而第二个是ISA控制器,也控制着IDECDROM,这些也都无关紧要。

我可以用一个modem和PPP网络协议拨号到我工作的网络,这时,我可以远程安装

我的AlphaAXPLinux系统的文件系统到/mnt/remote。

文件系统中的文件包含了数据的集合:

包含本章源的文件是一个ASCII文件,叫做filesystems.tex。

一个文件系统不仅保存它包括的文件的数据,也保存文件系统的结构。

它保存了Linux用户和进程看到的所有的信息,例如文件、目录、软链接、文件保护信息等等。

另外,它必须安全地保存这些信息,操作系统的基本的一致性依赖于它的文件系统。

没有人可以使用一个随机丢失数据和文件的操作系统(不知道是否有,虽然我曾经被拥有的律师比Linux开发者还多的操作系统伤害过)。

Minix是Linux的第一个文件系统,有相当的局限,性能比较差。

它的文件名不能长于14个字符(这仍然比8.3文件名要好),最大的文集大小是64M字节。

第一眼看去,64M字节好像足够大,但是设置中等的数据库需要更大的文件大小。

第一个专为Linux设计的文件系统,扩展文件系统或EXT(ExtendFileSystem),在1992年4月引入,解决了许多问题,但是仍然感到性能低。

所以,1993年,增加了扩展文件系统第二版,或EXT2。

这种文件系统在本章稍后详细描述。

当EXT文件系统增加到Linux的时候进行了一个重要的开发。

真实的文件系统通过一个接口层从操作系统和系统服务中分离出来,这个接口叫做虚拟文件系统或VFS。

VFS允许Linux支持许多(通常是不同的)文件系统,每一个都向VFS表现一个通用的软件接口。

Linux文件系统的所有细节都通过软件进行转换,所以所有的文件系统对于Linux核心的其余部分和系统中运行的程序显得一样。

Linux的虚拟文件系统层允许你同时透明地安装许多不同的文件系统。

Linux虚拟文件系统的实现使得对于它的文件的访问尽可能的快速和有效。

它也必须保证文件和文件数据正确地存放。

这两个要求相互可能不平等。

LinuxVFS在安装和使用每一个文件系统的时候都在内存中高速缓存信息。

在文件和目录创建、写和删除的时候这些高速缓存的数据被改动,必须非常小心才能正确地更新文件系统。

如果你能看到运行的核心中的文件系统的数据结构,你就能够看到文件系统读写数据块,描述正在访问的文件和目录的数据结构会被创建和破坏,同时设备驱动程序会不停地运转,获取和保存数据。

这些高速缓存中最重要的是BufferCache,在文件系统访问它们底层的块设备的时候结合进来。

当块被访问的时候它们被放到BufferCache,根据它们的状态放在不同的队列中。

BufferCache不仅缓存数据缓冲区,它也帮助管理块设备驱动程序的异步接口。

TheSecondExtendedFileSystem(EXT2)

EXT2被发明(RemyCard)作为Linux一个可扩展和强大的文件系统。

它至少在Linux社区中是最成功的文件系统,是所有当前的Linux发布版的基础。

EXT2文件系统,象所有多数文件系统一样,建立在文件的数据存放在数据块中的前提下。

这些数据块都是相同长度,虽然不同的EXT2文件系统的块长度可以不同,但是对于一个特定的EXT2文件系统,它的块长度在创建的时候就确定了(使用

mke2fs)。

每一个文件的长度都按照块取整。

如果块大小是1024字节,一个1025字节的文件会占用两个1024字节的块。

不幸的是这一意味着平均你每一个文件浪费半个块。

通常计算中你会用磁盘利用来交换CPU对于内存的使用,这种情况下,Linux象大多数操作系统一样,为了较少CPU的负载,使用相对低效率的磁盘利用率来交换。

不是文件系统中所有的块都包含数据,一些块必须用于放置描述文件系统结构的信息。

EXT2用一个inode数据结构描述系统中的每一个文件,定义了系统的拓扑结构。

一个inode描述了一个文件中的数据占用了哪些块以及文件的访问权限、文件的修改时间和文件的类型。

EXT2文件系统中的每一个文件都用一个inode描述,而每一个inode都用一个独一无二的数字标识。

文件

系统的inode都放在一起,在inode表中。

EXT2的目录是简单的特殊文件(它们也使用inode描述),包括它们目录条目的inode的指针。

只要提到文件系统,块设备都可以看作一系列能够读写的块。

文件系统不需要关心自身要放在物理介质的哪一个块上,这是设备驱动程序的工作。

当一个文件系统需要从包括它的块设备上读取信息或数据的时候,它请求对它支撑的设备驱动程序读取整数数目的块。

EXT2文件系统把它占用的逻辑分区划分成块组(BlockGroup)。

每一个组除了当作信息和数据块来存放真实的文件和目录之外,还复制对于文件系统一致性至关重要的信息。

这种复制的信息对于发生灾难,文件系统需要恢复的时候是必要的。

下面对于每一个块组的内容进行了详细的描述。

TheEXT2Inode(EXT2I节点)

在EXT2文件系统中,I节点是建设的基石:

文件系统中的每一个文件和目录都用一个且只用一个inode描述。

每一个块组的EXT2的inode都放在inode表中,还有一个BITMap,让系统跟踪分配和未分配的I节点。

显示了一个EXT2inode的格式,在其他信息中,它包括一些域:

参见include/linux/ext2_fs_i.h

mode包括两组信息:

这个inode描述了什么和用户对于它的权限。

对于EXT2,一个inode可以描述一个文件、目录、符号链接、块设备、字符设备或FIFO。

OwnerInformation这个文件或目录的数据的用户和组标识符。

这允许文件系统正确地进行文件访问权限控制

Size文件的大小(字节)

Timestamps这个inode创建的时间和它上次被修改的时间。

Datablocks指向这个inode描述的数据的块的指针。

最初的12个是指向这个inode描述的数据的物理块,最后的3个指针包括更多级的间接的数据块。

例如,两级的间接块指针指向一个指向数据块的块指针的块指针。

的这意味着小于或等于12数据块大小的文件比更大的文件的访问更快。

你应该注意EXT2inode可以描述特殊设备文件。

这些不是真正的文件,程序可以用于访问设备。

/dev下所有的设备文件都是为了允许程序访问Linux的设备。

例如mount程序用它希望安装的设备文件作为参数。

TheEXT2Superblock(EXT2超级块)

超级块包括这个文件系统基本大小和形状的描述。

它里面的信息允许文件系统管理程序用于维护文件系统。

通常文件系统安装时只有块组0中的超级块被读取,但是每一个块组中都包含一个复制的拷贝,用于系统崩溃的时候。

除了其他一些信息,它包括:

参见include/linux/ext2_fs_sb.h

MagicNumber允许安装软件检查这是否是一个EXT2文件系统的超级块。

对于当前版本的EXT2是0xEF53。

RevisionLevelmajor和minor修订级别允许安装代码确定这个文件系统是否支持只有在这种文件系统特定修订下才有的特性。

这也是特性兼容域,帮助安装代码确定哪些新的特征可以安全地使用在这个文件系统上。

MountCountandMaximumMountCount这些一起允许系统确定这个文件系统是否需要完全检查。

每一次文件系统安装的时候mountcount增加,当它等于maximummountcount的时候,会显示告警信息“maximalmountcountreached,runninge2fsckisrecommended”。

BlockGroupNumber存放这个超级块拷贝的块组编号。

BlockSize这个文件系统的块的字节大小,例如1024字节。

BlocksperGroup组中的块数目。

象块大小一样,这是文件系统创建的时候确定的。

FreeBlocks文件系统中空闲块的数目

FreeInodes文件系统中空闲的inode

FirstInode这是系统中第一个inode的编号。

一个EXT2根文件系统中的第一个inode是‘/’目录的目录条目

TheEXT2GroupDescriptor(EXT2组描述符)

每一个块组都有一个数据结构描述。

象超级块,所有得亏组的组描述符在每一块组都进行复制。

每一个组描述符包括以下信息:

参见include/linux/ext2_fs.hext2_group_desc

BlocksBitmap这个块组的块分配位图的块编号,用在块的分配和回收过程中

InodeBitmap这个块组的inode位图的块编号。

用在inode的分配和回收过程中。

InodeTable这个块组的inodetable的起始块的块编号。

每一个EXT2inode数据结构表示的inode在下面描述

Freeblockscount,FreeInodescount,Useddirectorycount

组描述符依次排列,它们一起组成了组描述符表(groupdescriptor

table)。

每一个块组包括块组描述符表和它的超级块的完整拷贝。

只有第一个拷贝(在块组0)实际被EXT2文件系统使用。

其他拷贝,象超级块的其他拷贝一样,只有在主拷贝损坏的时候才使用。

EXT2Directories(EXT2目录)

在EXT2文件系统中,目录是特殊文件,用来创建和存放对于文件系统中的文件的访问路径。

图9.3显示了内存中一个目录条目的布局。

一个目录文件,是一个目录条目的列表,每一个目录条目包括以下信息:

参见include/linux/ext2_fs.hext2_dir_entry

这个目录条目的inode。

这是个放在块组的inode表中的inode数组的索引。

Namelength这个目录条目的字节长度

Name这个目录条目的名字

每一个目录中的前两个条目总是标准的“.”和“..”,分别表示“本目录”和“父目录”。

9.1.5FindingaFileinaEXT2FileSystem(在一个EXT2文件系统中查找一个文件)

Linux的文件名和所有的Unix文件名的格式一样。

它是一系列目录名,用“/”分隔,以文件名结尾。

一个文件名称的例子是/home/rusling/.cshrc,其中/home和/rusling是目录名,文件名是.cshrc。

象其它Unix系统一样,Linux不关心文件名本身的格式:

它可以任意长度,由可打印字符组成。

为了在EXT2文件系统中找到代表这个文件的inode,系统必须逐个解析目录中的文件

名直到得到这个文件。

我们需要的第一个inode是这个文件系统的根的inode。

我们通过文件系统的超级块找到它的编号。

为了读取一个EXT2inode我们必须在适当的块组中的inode表中查找。

举例,如果根的inode编号是42,那么我们需要块组0中的inode表中的第42个inode。

Rootinode是一个EXT2目录,换句话说rootinode的模式描述它是一个目录,它的数据块包括EXT2目录条目。

Home是这些目录条目之一,这个目录条目给了我们描述/home目录的inode编号。

我们必须读取这个目录(首先读取它的inode,然后读取从这个inode描述的数据块读取目录条目),查找rusling条目,给出描述/home/rusling目录的inode编号。

最后,我们读取描述/home/rusling目录的inode指向的目录条目,找到.cshrc文件的inode编号,这样,我们得到了包括文件里信息的

数据块。

ChangingthesizeofaFileinanEXT2FileSystem(在EXT2文件系统中改变一个文件的大小)

文件系统的一个常见问题是它趋于更多碎片。

包含文件数据的块分布在整个文件系统,数据块越分散,对于文件数据块的顺序访问越没有效率。

EXT2文件系统试图克服这种情况,它分配给一个文件的新块物理上和它的当前数据块接近或者至少和它的当前数据块在一个块组里面。

只有这个失败了它才分配其它块组中的数据块。

无论何时一个进程试图象一个文件写入数据,Linux文件系统检查数据是否会超出文件最后分配块的结尾。

如果是,它必须为这个文件分配一个新的数据块。

直到这个分配完成,该进程无法运行,它必须等待文件系统分配新的数据块并把剩下的数据写入,然后才能继续。

EXT2块分配例程所要做的第一个事情是锁定这个文件系统的EXT2超级块。

分配和释放块需要改变超级块中的域,Linux文件系统不能允许多于一个进程同一时间都进行改变。

如果另一个进程需要分配更多的数据块,它必须等待,直到这个进程完成。

等待超级块的进程被挂起,不能运行,直到超级块的控制权被它的当前用户释放。

对于超级块的访问的授权基于一个先来先服务的基础(firstcomefirstserve),一旦一个进程拥有了超级块的控制,它一直维持控制权到它完成。

锁定超级块之后,进程检查文件系统是否有足够的空闲块。

如果没有足够的空闲块,分配更多的尝试会失败,进程交出这个文件系统超级块的控制权。

如果文件系统中有足够的空闲块,进程会试图分配一块。

如果这个EXT2文件系统已经建立了预分配的数据块,我们就可以取用。

预分配的块实际上并不存在,它们只是分配块的位图中的保留块。

VFSinode用两个EXT2特有的域表示我们试图分配新数据块的文件:

prealloc_blockandprealloc_count,分别是预分配块中第一块的编号和预分配块的数目。

如果没有预分配块或者预分配被禁止,EXT2文件系统必须分配一个新的数据块。

EXT2文件系统首先查看文件最后一个数据块之后数据块是否空闲。

逻辑上,这是可分配的效率最高的块,因为可以让顺序访问更快。

如果这个块不是空闲,继续查找,在随后的64块中找理想的数据块。

这个块,虽然不是最理想,但是至少和文件的其它数据块相当接近,在一个块组中。

参见fs/ext2/balloc.cext2_new_block()

如果这些块都没有空闲的,进程开始顺序查看所有其它块组直到它找到空闲的块。

块分配代码在这些块组中查找8个空闲数据块的簇。

如果无法一次找到8个,它会降低要求。

如果希望进行块预分配,并允许,它会相应地更新prealloc_block和prealloc_count。

不管在哪里找到了空闲的数据块,块分配代码会更新块组的块位图,并从buffercache中分配一个数据缓冲区。

这个数据缓冲区使用支撑文件系统的设备标识符和分配块的块编号来唯一标识。

缓冲区中的数据被置为0,缓冲区标记为“dirty”表示它的内容还没有写到物理磁盘上。

最后,超级块本身也标记位“dirty”,显示它进行了改动,然后它的锁被释放。

如果有进程在等待超级块,那么队列中第一个进程就允许运行,得到超级块的排它控制权,进行它的文件操作。

进程的数据写到新的数据块,如果数据块填满,整个过程重复进行,再分配其它数据块

TheVirtualFileSystem(虚拟文件系统VFS)

Linux核心的虚拟文件系统和它的真实的文件系统之间的关系。

虚拟文件系统必须管理任何时间安装的所有的不同的文件系统。

为此它管理描述整个文件系统(虚拟)和各个真实的、安装的文件系统的数据结构。

相当混乱的是,VFS也使用术语超级块和inode来描述系统的文件,和EXT2文件系统使用的超级块和inode的方式非常相似。

象EXT2的inode,VFS的inode描述系统中的文件和目录:

虚拟文件系统的内容和拓扑结构。

从现在开始,为了避免混淆,我会用VFSinode和VFS超级块以便同EXT2的inode和超级块区分开来。

参见fs/*

当每一个文件系统初始化的时候,它自身向VFS登记。

这发生在系统启动操作系统初始化自身的时候。

真实的文件系统自身建立在内核中或者是作为可加载的模块。

文件系统模块在系统需要的时候加载,所以,如果VFAT文件系统用核心模块的方式实现,那么它只有在一个VFAT文件系统安装的时候才加载。

当一个块设备文件系统安装的时候,(包括root文件系统),VFS必须读取它的超级块。

每一个文件系统类型的超级块的读取例程必须找出这个文件系统的拓扑结构,并把这些信息映射到一个VFS超级块的数据结构上。

VFS保存系统中安装的文件系统的列表和它们的VFS超级块列表。

每一个VFS超级块包括了文件系统的信息和完成特定功能的例程的指针。

例如,表示一个安装的EXT2文件系统的超级块包括一个EXT2相关的inode的读取例程的指针。

这个EXT2inode读取例程,象所有

的和文件系统相关的inode读取例程一样,填充VFSinode的域。

每一个VFS超级块包括文件系统中的一个VFSinode的指针。

对于root文件系统,这是表示“/”目录的inode。

这种信息映射对于EXT2文件系统相当高效,但是对于其他文件系统相对效率较低。

当系统的进程访问目录和文件的时候,调用系统例程,游历系统中的VFSinode。

例如再一个目录中输入ls或者cat一个文件,让VFS查找代表这个文件系统的VFSinode。

映为系统中的每一个文件和目录都用一个VFSinode代表,所以一些inode会被重复访问。

这些inode保存在inodecache,这让对它们的访问更快。

如果一个inode不在in

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

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

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