浅谈 Linux 虚拟文件系统(VFS):让文件操作无处不在
学习 Linux 必须了解什么是虚拟文件系统,因为它的地位极其重要,你在系统中的所有操作基本上都离不开它,今天小编带大家简单了解下~咱们在 Linux 系统中各种操作,几乎都离不开文件操作。但是你停下手头想过没,咱们在访问硬盘、U盘,甚至网络文件系统时,Linux 是如何让它们都表现得像操作普通文件一样的呢?答案就是虚拟文件系统。VFS 是 Linux 内核中的一层抽象,它位于用户空间和实际文件系统(如 ext4、xfs、nfs 等)之间。- 把不同文件系统的操作抽象成统一的“文件操作”模型;
简单理解,VFS 就像一个 "文件操作的翻译官",把应用程序的读写请求翻译成底层文件系统能理解的操作。虚拟文件系统支持的三类文件系统:- 磁盘文件系统:存储在本地磁盘、U 盘、CDROM 等物理存储设备上的文件系统,包含多种不同格式,例如 Windows 的 NTFS、VFAT,BSD 的 UFS,光盘的 CD-ROM 等。
- 网络文件系统:数据存储在网络中的其他主机上,需通过网络进行访问,典型代表为 NFS。
- 特殊文件系统:属于内存的映射,不存储实际物理数据,例如 /proc 文件系统。
咱们举个例子,执行一个文件操作(比如 cat file.txt)时,流程大致如下:- 应用程序发起系统调用(open, read, write 等);
- VFS 接收到调用,查找对应的 inode 和 dentry;
虚拟文件系统包含四个核心对象类型,分别承担不同功能:- Superblock(超级块):表示一个已挂载的特定文件系统
- Dentry(目录项):表示一个目录项,是路径的组成部分
超级块对象由各类文件系统自行实现,用于存储文件系统的核心信息,对应文件系统的超级块或控制块,会存储在磁盘的特定扇区。非磁盘类文件系统会在内存中临时生成并保存超级块。索引节点对象包含内核操作文件或目录时所需的全部信息。对于 Unix 文件系统,这类信息可直接从磁盘索引节点读取;若文件系统本身无索引节点,内核会从其磁盘存储结构中提取对应信息。为提升文件查找效率,虚拟文件系统引入目录项概念,每个 Dentry 代表路径中的一个特定部分。例如路径 /bin/ls 中,"/"、"bin"、"ls" 均为目录项对象,其中前两个是目录,最后一个是普通文件,路径中包含普通文件在内的每一段内容,都是目录项对象。文件对象是虚拟文件系统的最后一个核心对象,代表进程已打开的文件。从用户空间视角来看,进程直接操作的是文件,而非超级块、索引节点或目录项。文件对象包含访问模式、当前偏移量等常用信息,其操作逻辑与 read ()、write () 等系统调用高度契合,是已打开文件在内存中的表示。该对象由 open () 系统调用创建,close () 系统调用销毁,所有文件相关调用,本质上都是文件操作表中定义的方法。- 统一接口:无论文件系统是 ext4、xfs 还是网络文件系统,程序操作方式一致;
- 支持多文件系统:可以同时挂载本地磁盘、网络存储甚至虚拟文件系统如 /proc、/sys;
- 简化开发:咱们搞开发的只需实现具体文件系统操作,而应用程序中就无需关心底层细节。
/proc:提供系统信息接口,实际上不是磁盘上的真实文件;咱们弄明白 VFS,在 Linux 系统中不同类型的文件系统在咱们面前就像普通文件一样。