你有没有想过一个问题:Linux能挂载ext4,能挂载XFS,能挂载NFS网络文件系统,甚至能挂载Windows的NTFS,这些文件系统的底层实现完全不同,有的存在本地磁盘,有的在网络另一端,有的甚至根本没有物理存储(比如/proc),但是你用open()、read()、write()、close()这套API,都能操作它们。为什么?
答案藏在Linux内核的一个精妙设计里——VFS(Virtual File System,虚拟文件系统)。
这篇文章,我们就来彻底搞懂VFS,看完之后你会明白:Linux不是"支持很多文件系统",而是设计了一套让任何文件系统都能接入的框架,这个设计思想对做架构的程序员极有启发,因为它展示了如何用C语言实现面向对象的设计模式,如何通过接口抽象屏蔽底层差异,如何用缓存和预读机制大幅提升性能。
一、从一个现象说起:文件系统的"方言"问题
先看一个事实。
ext4把文件数据存在磁盘上,用extent tree来管理块地址,每个extent描述一段连续的物理块,通过B+树组织,查找效率是O(log n)。XFS也存磁盘,但它用一种叫做allocation group的分组策略,把磁盘划分成多个独立管理的区域,每个区域有自己的inode表和空闲空间管理,这种设计让XFS在超大文件系统上表现出色,可以轻松管理几百TB甚至PB级的存储。
NFS呢?数据在远程服务器,通过RPC协议访问,走的是TCP/IP网络栈,一个文件读取可能要跨越几千公里的光纤,客户端和服务端之间通过NFS协