文档介绍:第七章文件系统
Linux 操作系统支持许多不同类型的文件系统。本章介绍虚拟文件系统和高速缓存的概念,并讨论在 Linux 中最常见的/proc、Ext2和Ext3文件系统。
虚拟文件系统
文件系统是Unix系统最基本的资源。文件系统的作用就是在应用概念的文件和存储设备之间提供一个中间层,以使多个文件驻留在一个存储设备上,由文件系统来管理所有文件的存储。文件系统将每个存储设备化为一系列目录,每个目录含有若干文件。
为了在不同文件系统之间可以方便地交换数据和管理,并支持可任意地挂装不同文件系统,现代的操作系统大多都在系统内核和文件系统之间提供一个叫做虚拟文件系统(Virtual File System,VFS)的标准接口。Linux 虚拟文件系统维护描述整个虚拟文件系统以及实际已挂装的文件系统的数据结构。对于内核其他子系统来说,所有的文件系统都是一样的。因此,一个逻辑文件系统要想被 Linux 支持,就必须按照这个接口来编写自己的操作函数,从而将自己的细节对其他子系统隐藏起来。对于逻辑文件系统来说,VFS 是一个管理者,而对于内核的其他部分,则是一个统一的接口。 是虚拟文件系统和实际文件之间的关系示意图。
每个文件系统在初始化时,首先在 VFS 中进行注册。如果文件系统内建于内核中,则在系统引导时初始化;如果文件系统作为内核可装载的模块,则在挂装某个文件系统时进行初始化。在挂装某种基于块设备的文件系统(包括 root 文件系统)时,VFS 必须读取其超块。不同类型的文件系统所对应的超块读取例程必须能够理解实际文件系统的拓扑结构,并且能够将实际的超块结构映射为 VFS 超块结构。每个 VFS 超块包含了文件系统信息,并且还包含一些完成特定功能的函数指针。例如,某个超块代表一个已挂装的 Ext2 文件系统,则超块中包含有专门读取 Ext2 文件系统索引节点的函数地址。每个 VFS 超块中包含指向实际文件系统第一个 VFS 索引节点的指针。对于 root 文件系统来说,第一个索引节点就是代表“/”目录的节点。对 Ext2 文件系统来说,这种映射关系非常高效。
基本对象与方法
虚拟文件系统的接口由一组对象及其由这些对象调用的一组方法所构成的。这些基本的对象是 files(文件),file-systems(文件系统),inodes (索引节点)以及 names for inodes(索引节点名字),下面对这些对象进行简单的介绍:
基本对象与方法
1. 文件
文件(files)是一个可读可写的对象,它也可以映射到内存中,这和 Unix 中文件描述符的概念很接近。文件在 Linux 中使用一个"struct file"结构来实现,并且该结构有一组操作函数,保存在结构"struct file_operations"中。
基本对象与方法
2. 索引节点
索引节点(inodes)是文件系统中的基本对象。它可以是一个正常文件,一个目录,一个符号链接,或者是其他什么东西。VFS 并不明显地区分这些对象,而把它们留给真正的文件系统,让它们自己实现适宜的行为。从而使内核的高层子系统对于不同的对象区别对待。
每一个索引节点都由一个"struct inode"结构表现,它的一组方法保存在结构"struct inode_operations"中。
一个符号链接有索引节点,但却没有文件。但有些文件(如管道文件和套接字文件)却没有索引节点。
基本对象与方法
3. 文件系统
文件系统(file_systems)就是索引节点的集合,其中有一个节点被称为根节点(root)。其他的索引节点以 root 为起始点进行访问,并且通过文件名来查找其他的索引节点。
每一种文件系统有一组唯一的特征,应用于本文件系统内的所有索引节点之上。其中有一些是标志,如只读标志READ-ONLY。另一个重要的特征是块的尺寸(blocksize)。
每一个文件系统都通过一个结构"struct super_block"来表现,而针对超级块的一组方法则存储在结构"struct super_operations"之中。在 Linux 中,超级块(super-blocks)和设备号(device number)之间有紧密的联系。每一个文件系统必须有一个唯一的设备号,该文件系统即建立在此设备之上。有一些文件系统(如 nfs 和/proc 文件系统)不需要真实的设备。因此,对于这些文件系统,将会自动地分配以主设备号(major number)为0的匿名设备。
在Linux V