虚拟文件系统
虚拟文件系统 为什么需要虚拟文件系统 虚拟文件系统 超级块,superblock inode 为什么需要虚拟文件系统 在 Linux 系统中一切皆文件,除了普通文件之外,目录、字符设备、块设备、套接字、进程、线程、管道等都是“文件”。 用户程序需要一个统一的操作接口屏蔽不同文件系统(ext2/3/4,xfs,vfat,socket)的差异和操作细节 在Linux中对文件的 操作可以跨文件系统而执行。如下图所示,我们可以使用 cp 命令从 fat 文件系统格式的硬盘拷贝数据到 ext2 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件系统. 上层应用几乎不用关注底层的实现细节。我们只需要使用VFS暴露出来的标准的read、write等接口就可以了 通过VFS系统,Linux提供了通用的系统调用,可以跨越不同文件系统和介质之间执行,极大简化了用户访问不同文件系统的过程。 “一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。 虚拟文件系统, Virtual File System,VFS VFS 是 Linux 内核中的一个软件层,是内核的子系统之一,为用户空间的程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节 借助 VFS 可以直接使用open()、read()、write() 这样的系统调用操作文件,而无须考虑具体的文件系统和实际的存储介质。 通过 VFS,Linux 提供了通用的系统调用,可以跨越不同文件系统和介质之间执行,极大简化了用户访问不同文件系统的过程。另一方面,新的文件系统、新类型的存储介质,可以无须编译的情况下,动态加载到Linux中。 “一切皆文件"是Linux的基本哲学之一,不仅是普通的文件,包括目录、字符设备、块设备、套接字等,都可以以文件的方式被对待。实现这一行为的基础,正是Linux的虚拟文件系统机制。 VFS原理 VFS之所以能够衔接各种各样的文件系统,是因为它抽象了一个通用的文件系统模型,定义了通用文件系统都支持的、概念上的接口。新的文件系统只要支持并实现这些接口,并注册到Linux内核中,即可安装和使用。 虚拟文件系统组成部分 Linux为了实现这种VFS系统,采用面向对象的设计思路,主要抽象了四种对象类型: 超级块对象:代表一个已安装的文件系统。 索引节点对象:代表具体的文件。 目录项对象:代表一个目录项,是文件路径的一个组成部分。 文件对象:代表进程打开的文件。 每个对象都包含一组操作方法,用于操作相应的文件系统。 备注:Linux将目录当做文件对象来处理,是另一种形式的文件,它里面包含了一个或多个目录项。而目录项是单独抽象的对象,主要包括文件名和索引节点号。因为目录是可以层层嵌套,以形成文件路径,而路径中的每一部分,其实就是目录项。 接下来介绍一下各个对象的作用以及相关操作。 超级块, superblock 存储一个已安装的文件系统的控制信息(文件系统的状态、类型、大小、区块数、索引节点数等),代表一个已安装的文件系统;每次一个实际的文件系统被安装时, 内核会从磁盘的特定位置读取一些控制信息来填充内存中的超级块对象。一个安装实例和一个超级块对象一一对应。 超级块通过其结构中的一个域s_type记录它所属的文件系统类型。 superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等; Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了. ...