VFS简介
VFS的理念是使用统一的数据结构在内核中保存不同类型文件系统的信息(含操作)。
VFS是一个介于用户程序和文件系统实现之间的一个抽象层,VFS既给了不同类型的文件系统支持Linux系统的公共接口,也给用户程序提供了一个统一的调用接口。
VFS背后的核心idea是引入了通用文件模型(common file model),该模型其实就是Unix原生文件系统的一个镜像(这样可以在Unix原生文件系统了具有最小的开销,最高的性能)。其他非原生文件系统(比如FAT、MS-DOS filesystem)则需要做一些转换,从而支持该通用文件模型
通用文件模型(common file model)
通用文件模型由superblock、inode、dentry、file四种数据结构构成,这四种数据结构都是保存在内核空间中的。
- superblock数据结构存储了挂载的文件系统的元信息,对于基于磁盘的文件系统,通常在磁盘上有一个对应的superblock(比如ext2的superblock)。
- inode数据结构用于保存文件的元信息,一个文件对应一个inode,每个inode都有一个inode number唯一标识。inode通常对应磁盘上保存的文件控制块(file control block)
- dentry数据结构用于将inode(表示文件)和目录项(表示文件路径)关联起来。inode中是没有文件路径的,所以需要dentry来讲文件路径和文件关联起来。不同的磁盘文件系统使用各自的方式来存储dentry
- file数据结构用于存储进程和打开的文件之间交互的信息,这个信息只会存在于内核空间中,在磁盘上没有对应的信息。
下面将分别介绍这4种数据结构,所列举的信息使用的是2.6内核的数据。
superblock数据结构
superblock是文件系统的metadata,保存了文件系统的各种信息以及可以对其执行的操作。
包含的域(仅列举部分):
类型 | 域名 | 描述 |
---|---|---|
int | s_type | 文件系统类型 |
unsigned long | s_blocksize | 块大小(block size) |
struct dentry * | s_root | 指向文件系统根目录对应的dentry |
struct list_head | s_inodes | 文件系统中所有文件的inode(使用list_head双向链表存储) |
void |