Contents
  1. 1. 引言
  2. 2. VFS数据结构

引言

linux
中允许众多不同的文件系统,如ext2,ext3,vfat等。通过使用同一套文件I/O系统调用即可对linux中任意文件进行操作而无需考虑其所在具体文件系统格式;更进一步,对文件的操作可以跨文件系统而执行。如图一所示,我们可以使用cp命令从vfat文件系统格式的硬盘拷贝数据到ext3文件系统格式的硬盘;而这样的操作涉及到2个不同的文件系统。

图1.跨文件系统的文件操作

“一切皆是文件”是unix/linux的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、套接字等在unix/linux中都是一文件被对待的;它们虽然类型不同,但是对其提供的却是同一套调用接口。

图2.一切皆是文件

虚拟文件系统正是实现上述两点linux特性的关键所在。虚拟文件系统(Virtual
File System,简称
VFS),是linux内核中的一个软件层。用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。

为了能够支持各种实际文件系统,VFS定义了所有文件系统都支持的基本操作、概念上的借口和数据结构;同时实际文件系统必须实现VFS中所有接口和数据结构。这样,从用户程序的角度来看,所有的文件系统都是一样的。

图3.VFS在内核中与其它内核中模块的协同关系

VFS数据结构

  • 从本质上看,文件系统是特殊的数据分层存储结构,其包含有文件、目录和相关的控制信息。对此,linux中分别引入下面这些基本概念:

    文件:一组在逻辑上具有完整意义的信息项系列,处普通文件,其他诸如目录、设备、套接字等也是文件。
    目录:目录类似文件夹,用来容纳相关文件。由于目录可以包含子目录,所以目录是层层嵌套进而形成路径。在linux中,目录也是以文件形式存储的。
    目录项:在一个文件路径中,路径中的每一部分都被称为目录项;如路径/home/source/node.js中,目录/,home,source和node.js都是一个目录项。
    索引节点:用于存储文件的元数据的一个数据结构。文件的元数据就是描述文件相关的信息,和文件本身是两个概念。它包含的是诸如文件大小、拥有者、创建时间、磁盘位置等和文件相关的信息。
    超级块:用于存储文件系统的控制信息的数据结构。描述文件系统的状态、文件系统类型、大小、区块数、索引节点等,存放于磁盘的特定扇区中。

上述概念在磁盘中的位置关系如下

图4.磁盘与文件系统

关于文件系统的三个容易混淆的概念:

  • 创建:以某种方式格式化磁盘的过程,在其上创建一个文件系统。创建文件系统时,会在磁盘特定的位置上写入关于该文件系统的控制信息
  • 注册:向内核报告,申明自己被内核支持。一般是在编译内核的时候注册;也可以加载模块的方式手动注册。注册过程实际上是把表示各实际文件系统的数据结构struct
    file_system实例化
  • 安装:也就是我们熟悉的mount操作,将文件系统加入到linux的根文件系统的目录树结构上,这样文件系统才能被访问
Contents
  1. 1. 引言
  2. 2. VFS数据结构