Blocksize
以字节记数的文件系统块大小,如1024字节。
Superblock operations
指向此文件系统一组超块操纵例程的指针。这些例程被VFS用来读写inode和超块。
File System type
这是一个指向已安装文件系统的file_system_type结构的指针。
File System specific
指向文件系统所需信息的指针。
9.2.2 The VFS Inode
和EXT2文件系统相同,VFS中的每个文件、目录等都用且只用一个VFS inode表示。每个VFS inode中的信息通过文件系统相关例程从底层文件系统中得到。VFS inode仅存在于核心内存并且保存只要对系统有用,它们就会被保存在在VFS inode cache中。每个VFS inode包含下列域:
device
包含此文件或此VFS inode代表的任何东西的设备的设备标志符。
inode number
文件系统中唯一的inode号。在虚拟文件系统中device和inode号的组合是唯一的。
mode
和EXT2中的相同, 表示此VFS inode的存取权限。
user ids
所有者的标志符。
times
VFS inode 创建、修改和写入时间。
block size
以字节计算的文件块大小,如1024字节。
inode operations
指向一组例程地址的指针。这些例程和文件系统相关且对此inode执行操作,如截断此inode表示的文件。
count
使用此VFS inode的系统部件数。一个count为0的inode可以被自由的丢弃或重新使用。
lock
用来对某个VFS inode加锁,如用于读取文件系统时。
dirty
表示这个VFS inode是否已经被写过,如果是则底层文件系统需要更新。
file system specific information
9.2.3 注册文件系统
图9.5 已注册文件系统
当重新建立Linux核心时安装程序会询问是否需要所有可支持的文件系统。核心重建时文件系统启动代码包含了所有那些编入核心的文件系统的初始化例程。
Linux文件系统可构造成模块, 此时它们会仅在需要时加载或者使用insmod来载入。当文件系统模块被加载时, 它将向核心注册并在卸载时撤除注册。每个文件系统的初始化例程还将向虚拟文件系统注册,它用一个包含文件系统名称和指向其VFS超块读例程的指针的file_system_type结构表示。每个file_system_type结构包含下列信息:
Superblock read routine
此例程载文件系统的一个实例被安装时由VFS调用。
File System name
文件系统的名称如ext2。
Device needed
文件系统是否需要设备支持。并不是所有的文件系统都需要设备来保存它。例如/proc文件系统不需要块设备支持。
你可以通过查阅/proc/filesystems可找出已注册的文件系统,如:
ext2
nodev proc
iso9660
9.2.4 安装文件系统
当超级用户试图安装一个文件系统时,Linux核心首先使系统调用中的参数有效化。尽管mount程序会做一些基本的检查, 但是它并不知道核心构造时已经支持那些文件系统,同时那些建议的安装点的确存在。看如下的一个mount命令:
$ mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom
mount命令将传递三个参数给核心:文件系统名,包含文件系统的物理块设备以及此新文件系统要安装到的已存在的目录名。
虚拟文件系统首先必须做的是找到此文件系统。它将通过由链指针file_systems指向的file_system_type结 构来在所有已知文件系统中搜寻。
如果找到了一个相匹配的文件系统名,那么它就知道核心支持此文件系统并可得到读取此文件系统超块相关例程的指针。如果找不到,但文件系统使用了可动态加载核心模块,则操作仍可继续。此时核心将请求核心后台进程加载相应的文件系统模块。
接下来如果由mount传递的物理设备还没有安装, 则必须找到新文件系统将要安装到的那个目录的VFS inode。 这个VFS inode可能在inode cache中也可能在支撑这个安装点所在文件系统的块设备中。一旦找到这个inode则将对它进行检查以确定在此目录中是否已经安装了其它类型的文件系统。多个文件系统不能使用相同目录作为安装点。
此时VFS安装代码必须分配一个VFS超块并将安装信息传递到此文件系统的超块读例程中。系统中所有的VFS 超块都被保存在由super_block结构构成的super_blocks数组中, 并且对应此安装应有一个这种结构。超块读 例程将基于这些从物理设备中读取的信息来填充这些VFS超块域。对于EXT2文件系统此信息的转化过程十分 简便,仅需要读取EXT2超块并填充VFS超块。但其它文件系统如MS-DOS文件系统就不那么容易了。不管哪种文件系统,对VFS超块的填充意味着文件系统必须从支持它的块设备中读取描叙它的所有信息。如果块设备驱动不能从中读取或不包含这种类型文件系统则mount命令会失败。
图9.6 一个已安装的文件系统
每个文件系统用一个vfsmount结构来描叙。如图9.6所示。它们被排入由vfsmntlist指向的的链表中。
另外一个指针:vfsmnttail指向链表的最后一个入口, 同时mru_vfsmnt指针指向最近使用最多的文件系统。 每个vfsmount结构中由以下部分组成:包含此文件系统的块设备的设备号,此文件系统安装的目录以及文件 系统安装时分配的VFS超块指针。VFS超块指向这种类型文件系统和此文件系统根inode的file_system_type结构。一旦此文件系统被加载, 这个inode将一直驻留在VFS inod cache中。
9.2.5 在虚拟文件系统中搜寻文件
为了在虚拟文件系统中找到某个文件的VFS inode,VFS必须依次解析此文件名字中的间接目录直到找到此VFS inode。每次目录查找包括一个对包含在表示父目录VFS inode中的查找函数的调用。由于我们总是让每个文件系统的根可用并且由此系统的VFS 超块指向它,所以这是一个可行方案。每次在实际文件系统中寻找inode 时,文件系统将在目录cache中寻找相应目录。如果在目录cache中无相应入口则文件系统必须从底层文件系统或inode cache中取得此VFS inode。
9.2.6 Creating a File in the Virtual File System
9.2.7 卸载文件系统
如果已安装文件系统中有些文件还在被系统使用则不能卸载此文件系统。例如有进程使用/mnt/cdrom或其子目录时将不能卸载此文件系统。如果将要卸载的文件系统中有些文件还在被使用,那么在VFS inode cache中有与其对应的VFS inode。通过在inode链表中查找此文件系统占用设备的inode来完成此工作。对应此已安装文件系统的VFS超块为dirty,表示它已被修改过所以必须写回到磁盘的文件系统中。一旦写入磁盘,VFS超块占用的内存将归还到核心的空闲内存池中。最后对应的vfsmount结构将从vfsmntlist中释放。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



