欢迎光临散文网 会员登陆 & 注册

一文讲解虚拟文件系统(Virtual File System,VFS)

2022-09-11 14:50 作者:补给站Linux内核  | 我要投稿

Linux虚拟文件系统

Linux包含一个通用的、强有力的文件处理机制,该机制利用虚拟文件系统(Virtual File System,VFS)来支持大量的文件管理系统和文件结构。


VFS向用户进程提供了一个简单的,统一的文件系统接口。

VFS定义了一个能代表任何可想到的文件系统的通用特征和行为的通用文件模型。

VFS认为文件是计算机大容量存储器上的对象。这些计算机大容量存储器具有共同的特征,这与目标文件系统或底层的处理器硬件无关。

文件有一个符号名,以便在一个文件系统的特定目录下能唯一地标识该文件。

同时文件有一个所有者、对未授权的访问或修改的保护和其他一系列属性。

文件可以被创建、从中读、向它写或删除。

对于任何特定文件系统,需要一个映射模块来转换实际文件系统的特征到虚拟文件系统所期望的特征。

图12.17展示了Linux文件系统策略的关键组成成分。


用户进程通过使用VFS文件方案来发起文件系统调用。

VFS通过特定文件系统的一个映射函数转换该系统调用到内部的一个特定文件系统的功能调用(例如IBM的JFS)。

在很多情况下,映射函数仅仅是一个方案的文件系统功能调用到另一个方案的文件系统功能调用的映射。

在某些情况下,映射函数会比较复杂。例如,一些文件系统使用存储目录树中每个文件位置的文件分配表。在这些文件系统中,目录并不是文件。这些文件系统的映射函数必要时必须能动态创建与目录相对应的文件。在任何情况下,原来用户的文件系统调用必须转换成目标文件系统的调用。这样就调用了目标文件系统的相应功能去完成在文件或目录上的相应请求,该操作的结果以类似的方式返回给用户进程。




VFS在 Linux内核中所起的作用如图12.18所示。当进程发起一个面向文件的系统调用时,内核调用VFS 中的一个函数。该函数处理完与具体文件系统无关的操作后,调用目标文件系统中的相应函数。这个调用通过一个转换VFS的调用到目标文件系统调用的映射函数来实现。VFS独立于任何具体文件系统。因此映射函数的实现是文件系统在Linux上的实现的一部分。目标文件系统转换文件系统请求到面向设备的指令。



VFS是一个面向对象的方案。因为VFS不是用支持面向对象的语言(如C++和 Java)来实现的,而是使用C语言来实现的,因此VFS的对象可以简单地实现为C语言的结构。每一个对象包含数据和函数指针。这些函数指针指向操作这些数据的文件系统的实现函数。VFS主要的四个对象如下:


超级块对象:代表一个特定的已挂接的文件系统。

索引节点对象:代表一个特定的文件。

目录对象:代表一个特定的目录项。

文件对象:代表一个与进程相关的打开的文件。

这个方案是基于UNIX文件系统中所使用的概念的。


UNIX文件系统的关键概念如下。一个文件系统由层次目录组成。目录的概念和许多非UNIX平台中的文件夹是一样的,可以包含文件和其他目录。由于一个目录可能包含其他目录,因此就形成了一个树结构。在树结构中从根开始的路径由一系列目录项组成,最后以目录项或文件名结束。在UNIX中,目录是用一个列出了该目录所包含的文件名和目录的文件来实现的。因此,文件操作能同时应用于文件或目录。


【文章福利】小编推荐自己的Linux内核技术交流群:【891587639】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)  

超级块对象

超级块存储了描述特定文件系统的信息。通常,超级块对象对应了位于磁盘上特定扇区的文件系统超级块或文件系统控制块。


超级块对象由许多数据项组成,如下所示:


该文件系统所挂接的设备。

文件系统的基本块大小。

脏标志,表示超级块已经修改过,但还没有写回到磁盘。

文件系统类型。

标志,如只读标志。

指向文件系统根目录的指针。

打开文件列表。

控制访问该文件系统的信号量。

操作超级块的函数指针数组的指针。

上面列出的最后一项是一个包含在超级块对象中的操作对象。该操作对象定义了内核可在超级块对象上调用的对象方法(函数)。为超级块对象定义的方法包括:


read_inode:从一个已挂接的文件系统上读一个特定的索引节点。

wrie_inode:把给定的索引节点写回到磁盘。

put_inode:释放索引节点。

delete_inode:从磁盘上删除索引节点。

notify _inode:当索引节点的属性发生变化时调用。

putauper:当VFS卸载一个给定的超级块时调用。

write_super:当VFS决定把超级块写回到磁盘时调用。

statfs:获取文件系统的统计信息。

remount_fa:当文件系统重新挂接时调用。

clear_inode:释放索引节点,同时清除任何包含相关数据的页。

索引节点对象

一个索引节点与一个文件相关联。索引节点对象包含一个命名文件的除了该文件的文件名和该文件的实际数据内容外的所有信息。索引节点中包含由所有者、组、权限、文件的访问时间、数据长度和链接数等信息。


索引节点对象包含一个描述VFS 能在该索引节点上调用的文件系统的实现函数的索引节点操作对象。索引节点操作对象中定义了如下的函数:


create:为与某一目录下的目录项对象相关联的普通文件创建一个新的索引节点。

lookup:为对应于一个文件名的索引节点查找一个目录。

mkdir:为与某一目录下的目录项对象相关联的目录创建一个新的索引节点。

目录项对象

目录项(directory entry,dentry)对象是一个路径上的一个特定的组成。该组成或者是一个目录名或文件名。目录对象为访问文件和目录提供了方便。目录项对象包括一个指向索引节点的指针和超级块。它还包括一个指向父目录的指针和指向子目录的指针。


文件对象

文件对象代表一个进程所打开的一个文件。文件对象在系统调用open()时创建,在系统调用close()时销毁。文件对象包含如下一些数据项:


与该文件相关联的目录对象。

包含该文件的文件系统。

文件对象使用计数。

用户ID。

用户组ID。

文件指针,指向下–个文件操作所要作用到的位置。

文件对象包含一个描述VFS能在该文件对象上调用的文件系统的实现函数的文件操作对象。该对象包含的函数有read、write、open、release和lock。


原文作者:rsh_whu





一文讲解虚拟文件系统(Virtual File System,VFS)的评论 (共 条)

分享到微博请遵守国家法律