虚拟文件系统

虚拟文件系统为用户空间程序提供了文件系统接口。系统中所有文件系统不但依赖 VFS 共存,而且也依靠 VFS 系统协同工作。通过虚拟文件系统我们可以利用标准的 UNIX 文件 系统调用对不同介质上的不同文件系统进行读写操作 4[4] 。 虚拟文件系统的目的是为了屏蔽各种各样不同文件系统的相异操作形式,使得异构的文 件系统可以在统一的形式下,以标准化的方法访问、操作。实现虚拟文件系统利用的主要思 想是引入一个通用文件模型——该模型抽象出了文件系统的所有基本操作(该通用模型源于 Unix 风格的文件系统),比如读、写操作等。同时实际文件系统如果希望利用虚拟文件系统, 既被虚拟文件系统支持,也必须将自身的诸如,“打开文件”、“读写文件”等操作行为以及“什么是文件”,“什么是目录”等概念“修饰”成虚拟文件系统所要求的(定义的)形式,这样才 能够被虚拟文件系统支持和使用。 我们可以借用面向对象的一些思想来理解虚拟文件系统,虚拟文件系统好比一个抽象类 或接口,它定义(但不实现)了文件系统最常见的操作行为。而具体文件系统好比是具体类, 它们是特定文件系统的实例。具体文件系统和虚拟文件系统的关系类似具体类继承抽象类或 实现接口。而在用户看到或操作的都是抽象类或接口,但实际行为却发生在具体文件系统实 例上。至于如何将对虚拟文件系统的操作转化到对具体文件系统的实例,就要通过注册具体 文件系统到系统,然后再安装具体文件系统才能实现转化,这点可以想象成面向对象中的多 态概念。 我们个实举例来说明具体文件系统如何通过虚拟文件系统协同工作。 例如:假设一个用户输入以下 shell 命令: $ cp /hda/test1 /removable/test2 其中 /removable 是 MS-DOS 磁盘的一个安装点,而 /hda 是一个标准的第二扩展文件 系统( Ext2)的目录。cp 命令不用了解 test1 或 test2 的具体文件系统,它所看到和操作的 对象是 VFS。cp 首先要从 ext3 文件系统读出 test1 文件,然后写入 MS-DOS 文件系统中的 test2。VFS 会将找到 ext3 文件系统实例的读方法,对 test1 文件进行读取操作;然后找到 MS-DOS(在 Linux 中称 VFAT)文件系统实例的写方法,对 test2 文件进行写入操作。可以 看到 VFS 是读写操作的统一界面,只要具体文件系统符合 VFS 所要求的接口,那么就可以 毫无障碍地透明通讯了。 下图给出 Linux 系统中 VFS 文件体统和具体文件系统能的层次示意图