Linux系统传承了Unix系统“一切皆文件”的哲学理念,把每个硬件也都当做文件,应用程序对相应的设备文件读写实现对硬件设备的访问。Linux系统中的存储子系统是内核中负责管理系统数据存储的核心框架,同时将物理存储设备抽象为统一的接口,最后提供给上层的应用程序使用。
Linux存储系统框架

从框架图,大致可以看出Linux系统读/写数据的大致流程:
应用程序/系统调用→ VFS → 具体文件系统(ext3/NFS/proc)→ 页缓存/块缓存→ 块层→ 设备驱动→ 物理设备
1.VFS(Virtual File System)虚拟文件系统
VFS 是Linux 内核的一个抽象层,是整个存储系统的“统一接口”。它为用户空间提供了一套标准的、统一的系统调用接口(如 open()/read()/write()),屏蔽了底层不同文件系统的差异。对应用程序来说,不管访问的是本地磁盘的 ext3、网络的 NFS,还是内核虚拟文件系统 /proc都使用同一套API,无需关心底层实现。
2.真实文件系统
这一层是VFS 的实现层,每个文件系统(ext3、ext4、xfs、proc等)都向VFS注册了自己的操作函数集(如 read/write/mkdir 等),VFS 会根据文件所属的文件系统,调用对应的函数。
3.Cache(缓存层)
Linux存储系统的缓存主要分为页缓存和块缓存两类。其中页缓存(Page Cache)是文件数据在内存中的缓存,是读写文件的主要缓存;块缓存(Buffer Cache)主要缓存文件系统的元数据(如inode、目录项),但现在已经整合到页缓存中。核心作用主要是当应用读取文件时,内核会先从Cache中查找,如果命中就直接返回,避免访问慢速的物理磁盘;当应用写文件时,写入的数据会先写到Cache,内核在后台异步刷盘(writeback),大幅提升写入性能。
VFS文件系统在读写文件时,会优先操作Cache,Cache与块层之间通过块IO进行同步,是性能优化的关键模块。
4.Block Layer(块层)
Linux内核中专门处理块设备IO的核心层,位于文件系统和设备驱动之间。块层的核心作用主要是:
IO 调度:对文件系统下发的IO 请求进行排序、合并(比如电梯算法NOOP/Deadline/CFQ),减少磁盘寻道时间,提升IO 性能。
请求封装:将文件系统的逻辑IO请求,转换为块设备能理解的物理块请求(如读写某个扇区)。
多设备抽象:支持软RAID、LVM、dm-crypt等逻辑卷管理,对上层文件系统屏蔽底层物理设备的细节。
5.Device Drivers(设备驱动层)
这是硬件设备的驱动程序,是内核与存储硬件之间的接口,比如SATA磁盘驱动、SAS 控制器驱动、NVMe 驱动、USB 存储驱动等。驱动层实现块层定义的标准接口,接收块层下发的IO请求转换为硬件指令,控制磁盘控制器完成读写操作,并处理硬件中断、错误上报等底层操作;其中包含时间软件raid(multi-device)和支持逻辑卷(lvm)、快照、加密DM等。
6.Physical Devices(物理设备)
存储硬件本身,比如光盘CD、机械硬盘(HDD)、固态硬盘(SSD)、NVMe 盘、RAID 卡连接的磁盘阵列等。也是数据的最终存储载体,接收驱动下发的读写指令,完成物理介质上的数据读写。
Linux系统对存储进行读写的大概流程
以读取一个 ext4 文件为例:
1. 应用程序调用 read() 系统调用,进入内核态的VFS 层。2. VFS 根据文件描述符,找到对应的ext4文件系统的操作函数。3. Ext4 文件系统先在页缓存cache中查找数据,如果命中,直接返回给用户。4. 如果缓存未命中,ext4文件系统向块层下发IO 请求,请求读取磁盘上的对应块。5. 块层对IO 请求进行调度、合并,然后下发给磁盘驱动程序。6.驱动程序向磁盘控制器发送读写指令,磁盘完成数据读取,通过中断通知驱动。7.驱动将数据返回给块层,块层再交给 ext4文件系统,写入页缓存。8.最终数据通过VFS 返回给用户空间的应用程序。9.后续如有相同的数据读取,即可从页缓存层中读取,提升效率。为什么需要VFS
如果没有VFS,应用程序要访问不同类型的文件系统,会面临很多问题,比如访问 ext3 本地文件,需要调用 ext3_open() / ext3_read();访问 NFS 网络文件,需要调用 nfs_open() / nfs_read();访问 /proc 内核信息,又得用一套完全不同的接口;新增一个文件系统(比如 xfs / btrfs),所有应用都要改代码才能支持。这会导致每个应用都要适配所有文件系统的接口,代码极度臃肿;换个文件系统应用程序就跑不起来,可移植性差;新增文件系统需要修改所有依赖它的上层代码等。
VFS解决了Linux系统存储架构中如何让应用程序用一套统一的方式访问千差万别的存储和数据资源。
总结
VFS统一了Linux存储系统的接口,应用无需关心存储底层差异,Cache 层大幅减少了磁盘IO 次数,是提升Linux 存储性能的关键;块层和驱动层解耦,块层处理通用IO逻辑,驱动专注于硬件交互,便于扩展新的硬件和文件系统。
当你在Linux系统中使用“mount -t xfs /dev/sda1 /test”等挂载命令的时候,是VFS在起作用,并不是你在真正操作ext4、xfs等具体的文件系统。