文件系统技术内幕:大数据时代海量数据存储之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1 Linux文件系统整体架构简介

文件系统是Linux内核四大子系统(进程管理、内存管理、文件系统和网络栈)之一,文件系统的地位可见不一般。为了便于理解具体的文件系统,下面先介绍一下Linux文件系统的整体架构,如图3-1所示,在具体文件系统(如Ext2、Ext4和XFS等)与应用程序之间有一层抽象层,称为虚拟文件系统(Virtual File System,VFS)。

由图3-1可以看出,该架构的核心是VFS。VFS提供了一个文件系统框架,本地文件系统可以基于VFS实现,其主要做了如下几方面的工作。

(1)VFS作为抽象层为应用层提供了统一的接口(read、write和chmod等)。

(2)在VFS中实现了一些公共的功能,如inode缓存(Inode Cache)和页缓存(Page Cache)等。

(3)规范了具体文件系统应该实现的接口。

图3-1 Linux文件系统的整体架构

基于上述设定,其他具体的文件系统只需要按照VFS的约定实现相应的接口及内部逻辑,并注册在系统中,就可以完成文件系统的功能了。

在Linux中,在格式化磁盘后需要通过mount命令将其挂载到系统目录树的某个目录下面,这个目录被称为挂载点(mount point)。完成挂载后,我们就可以使用基于该文件系统格式化的磁盘空间了。在Linux中,挂载点几乎可以是任意目录,但为了规范化,挂载点通常是mnt目录下的子目录。

图3-2所示为一个相对比较复杂的Linux目录树。在该Linux目录树中,根文件系统为Ext3文件系统,而在mnt目录下又有ext4_test和xfs_test两个子目录,并且分别挂载了Ext4文件系统和XFS文件系统。

图3-2 Linux目录树

在Linux目录树中,多个文件系统的关系是由内核中的一些数据结构表示的。在进行文件系统挂载时会建立文件系统之间的关系,并且注册具体文件系统的API。当用户态调用打开文件的API时,会找到对应的文件系统API,并关联到文件相关的结构体(如file和inode等)。

上面的描述比较抽象,大家可能还是有点不太明白。不要着急,在后面的章节中,我们会结合代码更加详细地介绍VFS及如何实现对多种文件系统的支持。