虚拟文件系统

虚拟文件系统(VFS)是由 SUN 公司在定义网络文件系统(NFS)时创造的。

虚拟文件系统(VFS)是物理文件系统与服务之间的一个接口层,它对 Linux 的每个文件系统的所有细节进行抽象,使得不同的文件系统在 Linux 核心以及系统中运行的其它进程看来,都是相同的。

img

严格来说,VFS 并不是一种实际的文件系统。它只存在于内存中,不存在于任何外存空间。VFS 在系统启动时建立,在系统关闭时消亡。

文件系统 和 虚拟文件系统

VFS 和具体的文件系统代码都在 linux/fs 目录中,每一种文件系统一个子目录。

在具体实现上,每个文件系统都有自己的文件操作数据结构 file_operations。

VFS 作为 linux 内核中的一个软件层,用于给用户空间提供文件系统接口,同时也提供了内核中的一个抽象功能,允许不同的文件系统很好地共存。

VFS 使 linux 同时安装、支持许多不同类型的文件系统称为可能。

VFS 拥有关于各种特殊文件系统的公共界面,如超级块、inode、文件操作函数入口等。实际文件系统的细节,统一由 VFS 的公共界面来索引,它们对系统核心和用户进程来说是透明的。

img

上图中 VFS 执行的动作:使用 cp(1) 命令从 ext3 文件系统格式的硬盘拷贝数据到 ext2 文件系统格式的可移动磁盘上。两种不同的文件系统,两种不同的介质,连接到同一个 VFS 上。

虚拟

“虚拟”二字的含义

  1. 在同一个目录结构中,可以挂载着若干种不同的文件系统。VFS 隐藏了它们的实现细节,为使用者提供统一的接口。
  2. VFS 不是实际的文件系统,它只存在于内存中。

文件系统注册到虚拟文件系统

用户可以通过两种途径向内核注册文件系统:

  1. 在编译内核时确定可支持的文件系统类型,并在系统初始化时通过内嵌的函数调用在 VFS 中进行注册
  2. 把某个文件系统当作一个模块,利用模块的加载和卸载特征向注册表登记类型或从注册表注销

文件系统类型的注册函数为:int register_filesystem(struct file_system_type *fs)

每个文件系统都有一个初始化例程,文件系统通过它在 VFS 中进行注册,即填写 file_system_type 数据结构。该结构包含了文件系统的名称及一个指向对应 VFS 超级块读取例程的地址。

虚拟文件系统的作用

  1. 对具体的文件系统进行抽象,对上层程序提供统一的文件系统接口
  2. 接收用户层的常规的文件系统调用
  3. 文件系统之间也可以互相访问

虚拟文件系统的实现

虚拟文件系统的实现,主要思想在于引入了一个通用的文件模型,这个模型能够支持所有的文件系统。VFS 采用面向对象的设计思路。

组成:

  1. 超级块对象,和具体的文件系统相比,VFS 也有自己的超级块,不过它这个存放的是系统中已安装的文件系统的相关信息,它是在文件系统安装的时候,建立的一种将磁盘文件系统映射到内存的机制,进而让它的超级块成为虚拟的,而文件系统卸载的时候会自动删除,VFS 的超级块定义在 include/fs/fs.h 里,数据结构 super_block
  2. inode对象,存放具体的文件信息
  3. 目录项对象(dentry),存储的是目录与对应文件进行链接的信息
  4. 文件对象,存放文件与进程交互的有关信息

这 4 个的特点:都是虚的,也就是说它们不真实存在于磁盘中,而是运行期间虚拟的一种存放在内存的虚拟文件系统。

另一种说法:目录项是一个内存缓存;而超级块、索引节点和逻辑块,都是存储在磁盘中的持久化数据。

VFS 接口就是采用链一种数据结构来封装链文件系统,实现了程序对文件的统一操作。

img

参考

Linux 虚拟文件系统(VFS)分析

虚拟文件系统

文件系统与虚拟文件系统

Linux 虚拟文件系统(一)概述

Linux文件系统

Linux 的虚拟文件系统(强烈推荐)

极客时间