虚拟文件系统(VFS)是内核的一个子系统,为用户提供通用的系统调用,而无需考虑具体文件系统和介质。VFS抽象层定义了所有文件系统都支持的、基本的、概念上的接口和数据结构。
图1
![](https://i-blog.csdnimg.cn/blog_migrate/3f8fcacbed83e1e9206d680c194e6652.png)
如图1所示内核通过VFS把不同类型的文件系统连接在一起,给用户提供一个通用的接口(如read/write等)。不同的文件系统所提供的接口不同,从而对文件的操作也不一样。通过VFS就能实现从ext2到ext3的文件拷贝等操作,而无需复杂的操作。例如:以写ext2文件操作流程是这样的:
![](https://i-blog.csdnimg.cn/blog_migrate/64d80d18921f4bbbc1e49ea770cc00d6.png)
如果没有VFS,则用户在对不同的文件系统进行读写时可能需要调用不同的接口。
VFS中主要抽象了4种对象,分别是:
超级块 ——代表一个具体的已安装文件系统。结构体为super_block,包含设备标识符、块大小、文件系统类型、超级块方法、目录挂载点等信息,主要是和文件系统相关。
目录项 ——是路径的一部分,与目录有所区别,目录属于文件的一种。结构体为dentry,主要是为了方便文件路径查找,包含目录项名称、使用记数、目录项标识、关联的索引结点等信息。
文件 ——代表一个打开的文件。结构体体为file,指的就是我们常见的文件内容,包含文件操作方法、文件对象链表、使用计数、访问模式、文件指针偏移量等信息。
索
引节点 ——代表一个具体的文件。结构体为inode,包含文件大小、引用计数、硬链接数、修改时间、访问权限等信息,主要是和具体文件相关。
此外,内核还使用了一些标准的数据结构来管理文件系统的其他相关数据。分别是:
file_system_type ——用来描述特定的文件系统类型,如ext2、ext4、UDF
vfsmount ——描述一个安装文件系统的实例,即代表一个安装点
系统中的每一个进程都有自己的一组打开的文件 ,以下3个数据结构将VFS和系统的进程紧密联系在一起。
file_struct ——由进程描述符中的files目录项指向,所有与单个进程相关的信息(如打开的文件描述符)都包含在其中。
fs_struct ——由进程描述符中的fs域指向,包含文件系统和进程相关的信息。
namespace ——由进程描述符中的mmt_namespace域指向,它使第一个进程在系统中都看到唯一的安装文件系统。默认情况下,所有进程共享同样的命名空间。只有在clone()时使用CLONE_NEWSjf ,才会给进程一个唯一的命名空间的拷贝。