在了解了什么物理文件系统的实现原理以后,可以进一步了解一下Linux内核是如何将不同的物理文件系统集成在一起的?Linux抽象了一个虚拟文件系统VFS,所有的文件系统要想支持linux系统都需要实现VFS的标准接口。
3 Linux虚拟文件系统的原理和实现
我认为,Linux文件系统是由物理文件系统和虚拟文件系统共同组成的,尽管很多书籍都只讲了虚拟文件系统。无疑,虚拟文件系统是Linux文件系统的核心,物理文件系统只是持久化在磁盘上的一个数据结构,它为文件系统的功能提供了基础支撑,但它是静态的,虚拟文件系统实现了访问文件的整个过程,是动态的,有点类似程序和进程的关系。下面将详细介绍linux虚拟文件系统的架构和实现过程。
3.1 用户视角看待windows和linux文件系统的区别
使用windows的人对磁盘和文件系统的感受是这样的:比如你有一台windows的笔记本,硬盘1T,分了4个逻辑分区,分别是:C盘、D盘、E盘、F盘,当然,你还可以给每个盘起一个名字C盘(system),D盘(program)、E盘(work)、F盘(data),4个逻辑分区都是NTFS格式。在使用windows系统时,你有多少个逻辑分区,每个分区是什么格式(物理文件系统的类型),你是非常清楚的,这是使用windows系统的人的直观感受。
对于使用linux的人感受是这样的:比如你有一台linux虚拟机,你在宿主机上虚拟了一块硬盘,大小为20G,在创建系统的时候,会自动将硬盘划分成多个逻辑分区,这可以通过df -i命令来查看,如下:
这里列出的devtmpfs、tmpfs、/dev/sda3都是文件系统,但是,在用户视角来看,你并不能直观的看到这些分区,永远看到的都是一个虚拟目录树,所谓虚拟目录树就是以根结点/为开始,/usr、/root、/etc等文件夹组成的一颗树。如下图:
这就是windows系统和linxu系统从用户视角看到的最大区别:windows系统可以直观的看到每个逻辑分区,而linux系统只能看到一颗虚拟目录树,而具体的文件系统是挂载(mount on)到虚拟目录树的某个路径上,只能够通过df命令进行查看。
3.2 虚拟文件系统VFS架构
虚拟目录树只是linux虚拟文件系统的一个直观感受,虚拟目录树下面是虚拟文件系统的一系列复杂实现。先看一下VFS的架构,如下图:
VFS由四大部分构成,分别是:
- 对应用程序提供的统一的文件系统API访问接口,这是一组接口,没有实现,但它同时是一个标准,所有的文件系统都要实现这个标准才能接入被应用程序访问。这一层接口类似java的interface,所有文件系统都要实现这个interface集合,应用程序在调用文件系统功能的时候,比如,应用程序调用open函数打开一个文件,虚拟文件系统会调用具体文件系统的open函数,调用是通过接口形式实现的,对于虚拟文件系统来讲,它不需要知道具体的文件系统是如何open这个文件的,这些细节都由具体的文件系统来实现,这一层标准的API定义可以参考如下一段linux源码截图,
通过上面源码的截图可以看到,基于文件的很多操作都在API里面有定义,但是却没有具体实现。
- 各种物理文件系统对于虚拟文件系统的API的具体实现,如ext2系统的实现,ext4系统的实现;
- 物理文件系统的元数据的缓存:虚拟文件系统缓存了目录项、inode等数据,提高文件的访问速度,
- 页缓存:通过页缓存 (page cache)优化I/O速度
3.3 页缓存(PageCache)
PageCache是文件系统访问磁盘数据的一种优化策略,由于访问磁盘的速度很慢,为了提升访问速度,可以考虑把从磁盘访问拿到的数据在PageCache中做缓存,这样,第一次访问这的时候由于要从磁盘中获取数据,所以速度很慢,但是第二次访问的时候,由于数据在PageCache中已经存在,就可以直接获取到数据,而不用再访问磁盘,大大提升了访问速度。这有点像应用开发中数据库的速度慢,引入redis做缓存来提升访问速度,是同样的思路。
但是, //TODO