分类: LINUX
2012-12-12 18:24:57
1 引言
VFS的全称是Virtual FileSystem(即虚拟文件系统)。VFS是一个异构文件系统之上的软件粘合层(注:有时也把VFS称为可堆叠的文件系统(Stackable Filesystem),因为VFS可以无缝地使用多个不同类型的文件系统,就像把多个文件系统堆叠在一起一样,故而得名)。通过VFS,可以为访问文件系统的系统调用提供一个统一的抽象接口。VFS最早由Sun公司提出以实现NFS(Network FileSystem,网络文件系统)。但是现在很多Unix系统都采用了VFS(包括Linux、FreeBSD、Solaris等)。本文在参考相关资料的情况下,对FreeBSD和Linux两种操作系统上的VFS接口进行了简要的分析与对比。
2 FreeBSD下的VFS
在4.3BSD中,对本地文件系统的引用是通过inode来实现的。当系统中只有一个单独的文件系统的时候,使用inode来描述文件系统结构就已经足够了。但是,如果系统中存在多种类型的文件系统,尤其是如果需要从运行其它操作系统的机器上导入其它类型的文件系统,那就必须对文件系统的工作机制进行相应的修改。
一种修改方式是把多个文件系统以不同的文件系统类型导入到系统当中。但是,这种方法将导致文件系统接口不统一,比如对于本地FFS(Fast FileSystem,快速文件系统)和NFS文件系统,就必须采用不同的访问方式;其次,这也需要对系统现有的构架进行大量的重新构建(因为早期的BSD系列操作系统采用inode来引用文件系统)。
另一种方法则是在底层的文件系统类型与上层接口之间加入一个新的层。这个新加的层就是VFS层。在FreeBSD中,VFS是通过vnode(virtual node)来实现的。这样,文件系统仍然保持了统一性,即所有访问文件系统的操作都将通过vnode来完成。而在VFS层之下则是具体的文件系统所在的层,比如本地文件系统使用的inode或者NFS文件系统使用的nfsnode,以及特殊文件(比如设备文件、socket、FIFO等)。层次关系如图1所示。
VFS | |||
NFS | UFS | special devices,etc | |
FFS | LFS | ||
图1 FreeBSD中VFS的层次关系
通过struct mount,可以找到系统中已挂载的文件系统,然后即可通过struct vnode来选择具体的文件系统结构,对于UFS本地文件系统,是struct inode结构,访问的是本地存储设备(比如硬盘);对于NFS网络文件系统,则是struct nfsnode结构,访问的是网络上的其它计算机上的文件系统。
通过这样一个附加的中间层,VFS屏蔽了底层异构类型的文件系统的差异,也屏蔽了基础设施的差异(比如:是访问本地设备还是访问网络)。从而给上层的应用程序访问文件系统提供了统一的接口。
3 Linux下的VFS
VFS的作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统。VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。在古老的DOS操作系统中,要访问本地文件系统之外的文件系统需要使用特殊的工具才能进行。而在Linux下,通过VFS,一个抽象的通用访问接口屏蔽了底层文件系统和物理介质的差异性。
每一种类型的文件系统代码都隐藏了实现的细节。因此,对于VFS层和内核的其它部分而言,每一种类型的文件系统看起来都是一样的。
传统的Unix系统中采用inode来保存与文件相关的信息,比如访问权限、文件大小、创建时间等,这些信息被称为文件的元数据(metadata)。inode这个数据结构和文件本身是分开存放的。
在Linux中,VFS采用的是面向对象的编程方法,尽管Linux内核采用的是不具有直接面向对象功能的C语言。但是VFS子系统通过把VFS对象的属性和相应的操作函数(即面向对象概念中的方法)都封装到了结构体中,因此可以是真正意义上的对象。
VFS中的四个主要对象类型如表1所示。
表1 VFS中主要的对象类型
对 象 | 说 明 |
superblock对象 | 表示一个具体的可挂装的文件系统 |
inode对象 | 表示一个具体的文件 |
dentry对象 | 表示一个目录条目,或路径中的一个分量 |
file对象 | 表示一个与进程相关联的已打开的文件 |
和FreeBSD中不同的是,Linux的VFS实现不是在vnode中完成的,而是通过与文件系统无关的inode结构来实现的。因此Linux中的inode和FreeBSD中的vnode的功能是相同的。需要说明的是:FreeBSD中也有inode结构,但是和Linux的inode结构完全不同。
4 FreeBSD与Linux的VFS对比
下面对FreeBSD与Linux中VFS的特点作一个简单的对比:
相同点:
1、 都作为一个抽象的粘合层位于实际的文件系统实现之上;
2、 都采用了面向对象技术;
3、 都实现了对不同物理介质上不同类型文件系统的统一访问接口。
不同点:
1、 FreeBSD中VFS的基本结构是vnode;而Linux中是通过四个主要对象来实现的;
2、 FreeBSD中对特殊文件(如设备文件、socket、FIFO)做特殊处理;Linux不作区分;
3、 FreeBSD中vnode不仅包含一般的文件信息,也包含指向文件系统特定的信息的指针;而Linux中与文件系统无关的数据结构是inode,和FreeBSD的vnode类似(需要注意的是:FreeBSD也有inode,但是与Linux的inode不同,FreeBSD中的inode是依赖于文件系统的)。
4、 Linux采用了两个不同的结构,一个用于操作文件,一个用于操作inode;而FreeBSD中所有操作都通过vnode完成。