VFS是Linux和UNIX文件系统中采用的一种技术机制,旨在一个操作系统中支持多个不同类型的文件系统。VFS是操作系统内核中这样一组数据结构与子程序的集合,它位于操作系统系统调用界面与具体类型文件系统之间,负责
记录操作系统中可以支持和已经安装有哪些文件系统类型,
将相关系统调用转换为对具体类型文件系统的调用,
负责不同类型文件系统间的协同工作(例如跨FS复制),
实现对不同类型文件系统的动态装卸和可扩充性等。
例如,假设一个用户输入以下shell命令:
$ cp /floppy/TEST /tmp/test
其中/floppy是MS-DOS磁盘的一个安装点,而/tmp是一个标准的第二扩展文件系统(second Extended Filesystom, Ext2)的目录。正如图(a)所示,VFS是用户的应用程序与文件系统实现之间的抽象层。因此,cp程序并不需要知道/floppy/TEST 和 /tmp/test是什么文件系统类型。相反,cp程序直接与VFS交互,这是通过Unix程序设计人员都熟悉的普通系统调用来进行的。cp的执行代码如图(b)所示:
它的主要设计思想有以下3点:
(1)应用层:VFS模型源于UNIX文件系统,使得用户可以直接使用标准UNIX文件系统调用来操作文件,无需考虑具体文件系统特性和物理存储介质,通过VFS访问文件系统,才使得不同文件系统之间的协作性和通用性成为可能。
(2)虚拟层:在对所有具体文件系统的共同特性进行抽象的基础上,形成一个与具体文件系统实现无关的虚拟层,并在此层次上定义与用户的一致性接口;
(3)实现层:该层使用类似开关表技术进行具体文件系统转接,实现各种文件系统的物理操作细节,每个文件系统是自包含的,包含文件系统实现的各种设施,如超级块、节点区、数据区以及各种数据结构和文件类的操作函数。
一般地说,VFS提供以下功能:
记录可用的文件系统类型;
把文件系统与对应的存储设备联系起来;
处理面向文件的通用操作;
涉及具体文件系统的操作时,把它们映射到相关的具体文件系统。
VFS抽象层之所以能衔接各种不同的文件系统,是因为它定义了所有文件系统都支持的基本抽象接口和数据结构,同时具体的文件系统也将自己的诸如“文件如何打开”、“目录如何定义”等概念在形式上与VFS的定义保持一致。对于像FAT和NTFS这类非UNIX风格文件系统,必须经过封装,提供符合VFS概念的接口。比如,一个文件系统不支持inode概念,它也必须在内存中装配inode结构体,就像它本身包含inode一样。这些装配和转换需要在使用现场引入特别处理,使得非UNIX文件系统能够兼容UNIX文件系统的使用规则和满足VFS的需求,这样一来,非UNIX文件系统便可与VFS一道工作,只是性能上会有少许影响。
VFS支持的文件系统可以划分为三种主要类型:
磁盘文件系统
这些文件系统管理在本地磁盘分区中可用的存储空间或者其他可以起到磁盘作用的设备(比如说一个USB闪存)。VFS支持的基于磁盘的某些著名文件系统还有:
Linux使用的文件系统,如广泛使用的第二扩展文件系统(Ext2),新近的第三扩展文件系统(Third Extended Filesystem,Ext3)及Reiser文件系统(ReiserFS)
Unix家族的文件系统,如sysv文件系统(System V、Coherent、Xenix)、UFS(BSD、Solaris、NEXTSTEP),MINIX文件系统及VERITAS VxFS(SCO UnixWare)。
微软公司的文件系统,如MS-DOS、VFAT(Windows 95及随后的版本)及NTFS(Windows NT以及随后的版本)。
IS09660 CD-ROM文件系统(以前的High Sierra文件系统)和通用磁盘格式(UDF)的DVD文件系统。
其他有专利权的文件系统,如HPFS(IBM公司的OS/2)、HFS(苹果公司的Macintosh)、AFFS(Amiga公司的快速文件系统)以及ADFS(Acorn 公司的磁盘文件归档系统)。
起源于非Linux系统的其他日志文件系统,如IBM的JFS和SGI的XFS。
网络文件系统
这些文件系统允许轻易地访问属于其他网络计算机的文件系统所包含的文件。虚拟文件系统所支持的一些著名的网络文件系统有:NFS、Coda、AFS(Andrew文件系统)、CIFS(用于Microsoft Windows的通用网络文件系统)以及NCP(Novell公司的NetWare Core Protocol)。
特殊文件系统
这些文件系统不管理本地或者远程磁盘空间。/proc、/sys、/dev等文件系统是特殊文件系统的一个典型范例。
Unix的目录建立了一棵根目录为“/”的树。根目录包含在根文件系统(root filesystem)中,在Linux中这个根文件系统通常就是Ext2或Ext3类型。其他所有的文件系统都可以被“安装”在根文件系统的子目中。当一个文件系统被安装在某一个目录上时,在父文件系统中的目录内容不再是可访问的了,因为任何路径(包括安装点),都将引用已安装的文件系统。但是,当被安装文件系统卸载时,原目录的内容又可再现。
所以,Unix文件系统的一个重要特点就是可以由系统管理员用来隐藏文件,他们只需把一个文件系统安装在要隐藏文件的目录中即可。
基于磁盘的文件系统通常存放在块设备中,如硬盘、软盘或者CD-ROM。Linux VFS的一个有用特点是能够处理如/dev/loop0这样的虚拟块设备,这种设备可以用来安装普通文件所在的文件系统。作为一种可能的应用,用户可以保护自己的私有文件系统,因为可以通过把自己文件系统的加密版本存放在一个普通文件中来实现。
第一个虚拟文件系统包含在1986年由Sun公司发布的SunOS操作系统中。从那时起,多数UNIX文件系统都包含VFS。然而,Linux的VFS支持最广泛的文件系统。