Linux文件系统
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命令会失败。 |