linux虚拟文件系统

VFS虚拟文件系统基本概念

  • VFS: Virtual File System ( Virtual Filesystem Switch)概念:
    • 逻辑文件系统(实际文件系统) 如EXT2、MINIX、MSDOS等.
    • VFS为逻辑文件系统提供统一的接口屏蔽实际文件系统的实现细节.
    • VFS的所有数据结构在系统运行以后建立,并在卸载时删除
    • VFS必须与实际的文件系统相接合,才能实现文件管理功能。
  • VFS的功能:
    • 对逻辑文件系统的数据结构进行抽象
    • 接受用户系统调用 如open, write等;
    • 支持多种逻辑文件系统之间相互访问;
    • 接受内核其他子系统的操作请求,特别是内存管理子系统。
  • linux文件系统逻辑关系:

Unix文件系统

  • Unix文件系统采用统一命名空间,所有安装的文件系统都作为根文件系统树的枝叶出现在系统中。
  • 文件通过目录组织起来,VFS将目录视为文件,可以对其进行文件的操作。
    • 目录是一种特殊的文件。它用于创建、保持对文件系统中文件的访问路径。
  • 索引节点(inode)
    • 文件的相关信息,被称为文件的元数据,被存储在一个单独的数据结构中,该结构被称为索引结点
    • Inode中存放描述文件的详细信息,如文件在外存的地址等。
    • 在访问装配的文件系统时,这些文件系统的inode 节点被不断的读出/写入。
    • VFS文件系统维护一个inode节点的缓存,以加速对所有装配的文件系统的访问。
  • 超级块
    • 文件系统的控制信息存储在超级块中,超级块是一种包含文件系统信息的数据结构。

VFS对象及其数据结构

  • VFS使用面向对象 的设计思路,使用一组数据结构来表示通用文件对象。
  • 每个主要类型中都包含一个操作对象,这个操作对象描述针对给主要对象的方法。
  • VFS中四个主要的对象类型:
    1. 超级块对象:代表一个具体的已安装的文件系统。
      1. 操作对象:super_operations对象,其中描述了内核针对特定文件系统所能调用的方法。
      2. 各种文件系统都必须实现超级块对象,超级块对象由super_block结构体表示,存储在<linux/fs.h>中。
    2. 索引节点对象:代表一个具体文件。
      1. 操作对象:inode_operations对象,其中描述了内核针对特定文件所能调用的方法。
      2. 索引节点对象不一定在文件系统中实现,索引节点在文件被访问时才在内存中创建
      3. 一个索引节点对象代表内存中的一个文件,也可以是设备或者管道这样的特殊文件。
      4. 索引节点由inode结构体表示,它定义在文件<linux/fs.h>中。
    3. 目录项对象:代表一个目录项,是路径的一个组成部分。(目录项不是目录,目录是另一种形式的文件)。
      1. 操作对象:dentry_operations对象,描述内核针对特定目录所能调用的方法。
      2. 在路径中,**每一个部分(包括普通文件)**都是一个目录项对象。如:/bin/vi中,/,bin,vi都属于目录项对象。
      3. 与超级块和索引节点对象不同,目录项对象没有对应的磁盘数据结构,VFS在执行目录操作时在现场根据字符串形式的路径名创建目录项对象。
      4. 目录项对象由dentry结构体表示,它定义在文件<linux/dentry.h>中。
    4. 文件对象:代表由进程已打开的文件。
      1. 操作对象:file_operations对象,描述进程针对已打开文件所能调用的方法。
      2. 进程直接处理的是文件,而不是超级块,目录项或者索引节点。
      3. 多个进程可以同时操作同一个文件,一个文件可以同时有多个文件对象。
      4. 类似于目录项对象,文件对象没有实际的磁盘数据结构
      5. 文件对象由file结构体表示,定义在文件<linux/fs.h>中。

和文件系统相关的数据结构

  • 除了以上4种VFS基础对象之外,内核还使用一些标准数据结构来管理文件系统的其它相关数据。
  • file_system_type:用来描述各种特定文件系统类型,如ext3,ext4或UDF;
    • 因为linux支持各种不同的文件系统,所以需要一个数据结构来描述各种文件系统的功能和行为。
    • file_system_type结构体被定义在文件<linux/fs.h>中。
    • 每个文件系统对应一个file_system_type结构。
  • vfsmount:用来描述一个安装文件系统的实例;

和进程有关的数据结构

  • 每一个进程都有自己的一组打开的文件。通过三个数据结构将VFS层和进程精密连接在了一起。这三个数据结构是file_struct,fs_struct,namespace.