文件系统和虚拟文件系统
虚拟文件系统
虚拟文件系统(VFS)是由 SUN 公司在定义网络文件系统(NFS)时创造的。
虚拟文件系统(VFS)是物理文件系统与服务之间的一个接口层,它对 Linux 的每个文件系统的所有细节进行抽象,使得不同的文件系统在 Linux 核心以及系统中运行的其它进程看来,都是相同的。
严格来说,VFS 并不是一种实际的文件系统。它只存在于内存中,不存在于任何外存空间。VFS 在系统启动时建立,在系统关闭时消亡。
文件系统 和 虚拟文件系统
VFS 和具体的文件系统代码都在 linux/fs 目录中,每一种文件系统一个子目录。
在具体实现上,每个文件系统都有自己的文件操作数据结构 file_operations。
VFS 作为 linux 内核中的一个软件层,用于给用户空间提供文件系统接口,同时也提供了内核中的一个抽象功能,允许不同的文件系统很好地共存。
VFS 使 linux 同时安装、支持许多不同类型的文件系统称为可能。
VFS 拥有关于各种特殊文件系统的公共界面,如超级块、inode、文件操作函数入口等。实际文件系统的细节,统一由 VFS 的公共界面来索引,它们对系统核心和用户进程来说是透明的。
上图中 VFS 执行的动作:使用 cp(1) 命令从 ext3 文件系统格式的硬盘拷贝数据到 ext2 文件系统格式的可移动磁盘上。两种不同的文件系统,两种不同的介质,连接到同一个 VFS 上。
虚拟
“虚拟”二字的含义
- 在同一个目录结构中,可以挂载着若干种不同的文件系统。VFS 隐藏了它们的实现细节,为使用者提供统一的接口。
- VFS 不是实际的文件系统,它只存在于内存中。
文件系统注册到虚拟文件系统
用户可以通过两种途径向内核注册文件系统:
- 在编译内核时确定可支持的文件系统类型,并在系统初始化时通过内嵌的函数调用在 VFS 中进行注册
- 把某个文件系统当作一个模块,利用模块的加载和卸载特征向注册表登记类型或从注册表注销
文件系统类型的注册函数为:int register_filesystem(struct file_system_type *fs)
每个文件系统都有一个初始化例程,文件系统通过它在 VFS 中进行注册,即填写 file_system_type 数据结构。该结构包含了文件系统的名称及一个指向对应 VFS 超级块读取例程的地址。
虚拟文件系统的作用
- 对具体的文件系统进行抽象,对上层程序提供统一的文件系统接口
- 接收用户层的常规的文件系统调用
- 文件系统之间也可以互相访问
虚拟文件系统的实现
虚拟文件系统的实现,主要思想在于引入了一个通用的文件模型,这个模型能够支持所有的文件系统。VFS 采用面向对象的设计思路。
组成:
- 超级块对象,和具体的文件系统相比,VFS 也有自己的超级块,不过它这个存放的是系统中已安装的文件系统的相关信息,它是在文件系统安装的时候,建立的一种将磁盘文件系统映射到内存的机制,进而让它的超级块成为虚拟的,而文件系统卸载的时候会自动删除,VFS 的超级块定义在 include/fs/fs.h 里,数据结构 super_block
- inode对象,存放具体的文件信息
- 目录项对象(dentry),存储的是目录与对应文件进行链接的信息
- 文件对象,存放文件与进程交互的有关信息
这 4 个的特点:都是虚的,也就是说它们不真实存在于磁盘中,而是运行期间虚拟的一种存放在内存的虚拟文件系统。
另一种说法:目录项是一个内存缓存;而超级块、索引节点和逻辑块,都是存储在磁盘中的持久化数据。
VFS 接口就是采用链一种数据结构来封装链文件系统,实现了程序对文件的统一操作。
参考
极客时间