Linux 核心--10.文件系统( 二 )



虚拟文件系统的设计目标是为Linux用户提供快速且高效的文件访问服务 。同时它必须保证文件及其数据的正确性 。这两个目标相互间可能存在冲突 。当安装一个文件系统并使用时, Linux VFS为其缓存相关信息 。此缓存中数据在创建、写入和删除文件与目录时如果被修改,则必须谨慎地更新文件系统中对应内容 。如果能够在运行核心内看到文件系统的数据结构, 那么就可以看到那些正被文件系统读写的数据块 。描叙文件与目录的数据结构被不断的创建与删除而设备驱动将不停地读取与写入数据 。这些缓存中最重要的是Buffer Cache,它被集成到独立文件系统访问底层块设备的例程中 。当进行块存取时数据块首先将被放入Buffer Cache里并根据其状态保存在各个队列中 。此Buffer Cache不仅缓存数据而且帮助管理块设备驱动中的异步接口 。


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



图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表示) 。

图9.1给出了占用一系列数据块的EXT2文件系统的布局 。对文件系统而言文件仅是一系列可读写的数据块 。文件系统并不需要了解数据块应该放置到物理介质上什么位置,这些都是设备驱动的任务 。无论何时只要文件系统需要从包含它的块设备中读取信息或数据,它将请求底层的设备驱动读取一个基本块大小整数倍的数据块 。EXT2文件系统将它所使用的逻辑分区划分成数据块组 。每个数据块组将那些对文件系统完整性最重要的信息复制出来, 同时将实际文件和目录看作信息与数据块 。为了发生灾难性事件时文件系统的修复,这些复制非常有必要 。以下一节将着重描叙每个数据块组的内容 。


9.1.1The EXT2 Inode





图9.2 EXT2 Inode

在EXT2文件系统中inode是基本块;文件系统中的每个文件与目录由唯一的inode来描叙 。每个数据块组的EXT2 inode被保存在inode表中, 同时还有一个位图被系统用来跟踪已分配和未分配的inode 。图 9.2给出了EXT2 inode的格式,它包含以下几个域:


mode
它包含两类信息;inode描叙的内容以及用户使用权限 。EXT2中的inode可以表示一个文件、目录、符号连接、块设备、字符设备或FIFO 。
Owner Information
表示此文件或目录所有者的用户和组标志符 。文件系统根据它可以进行正确的存取 。
Size
以字节计算的文件尺寸 。

推荐阅读