(2)文件系统的基本概念

一. 什么是VFS

Linux内核通过虚拟文件系统(Virtual File System,VFS)管理文件系统。

VFS是Linux内核文件系统的一个极其重要的基础设施,VFS为所有的文件系统提供了统一的接口,对每个具体文件系统的访问要通过VFS定义的接口来实现。同时VFS也是一个极其重要的架构,所有Linux的文件系统必须按照VFS定义的方式来实现。

VFS本身只存在于内存中,它需要将硬盘上的文件系统抽象到内存中,这个工作是通过几个重要的结构实现的。VFS定义了几个重要的结构:dentry、inode这几个对象就可以完成对文件系统的一些操作(当然,在合适的时候,仍然需要将内存的数据写入到硬盘)。

VFS是具体文件系统的抽象,而VFS又是依靠超级块、inode、dentry以及文件这些结构来发挥作用。

二. 超级块 super_block

超级块(super_block)代表了整个文件系统本身。通常,超级块是对应文件系统自身的控制块结构。超级块保存了文件系统设定的文件块大小,超级块的操作函数,而文件系统内所有的inode也都要链接到超级块的链表头。对于一个具体文件系统的控制块可能还含有另外的信息,而通过超级块对象,我们可以找到这些必要的信息。

超级块的内容需要读取具体文件系统在硬盘上的超级块结构获得,所以超级块是具体文件系统超级块的内存抽象。

每个文件系统都有一个超级块结构,每个超级块都要链接到一个超级块链表。而文件系统内的每个文件在打开时都需要在内存分配一个inode结构,这些inode结构都要链接到超级块。

三. 目录项 dentry

对于一个同的文件系统来说,文件和目录一般按树状结构保存。直观来看,目录里保存着文件,而所有目录一层层汇聚,最终到达根目录。目录项(dentry)就是反映了文件系统的这种树状关系。

在VFS里,目录本身也是一个文件,只是有点特殊。每个文件都有一个dentry(可能不止一个),这个dentry链接到上级目录的dentry。根目录有一个dentry结构,而根目录里的文件和目录都链接到这个跟dentry,二级目录里的文件和目录,同样通过dentry链接到二级目录。这样一层层链接,就形成了一颗dentry树。从树顶可以遍历整个文件系统的所有目录和文件。

为了加快对dentry的查找,内核使用了hash表来缓存dentry,称为dentry cache。

四. 索引节点 inode

inode代表一个文件。inode保存了文件的大小、创建时间、文件的块大小等参数,以及对文件的读写函数、文件的读写缓存等信息。一个真实的文件可以有多个dentry,因为指向文件的路径可以有多个(考虑问价你的链接),而inode只有一个。

inode和dentry分别代表了文件通用的两个部分,只不过对某些文件系统而言,inode提供的信息还不够,还需要其他信息。

五. 文件

文件对象的作用是描述进程和文件交互的关系。硬盘上并不存在一个文件结构。进程打开一个文件,内核就动态创建一个文件对象。同一个文件,在不同的进程中有不同的文件对象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章