Linux 支援 ext4、xfs、btrfs、vfat、ntfs、procfs、sysfs、nfs 等數十種文件系統,應用程式却只需使用同一套系統調用(open/read/write/close/mmap...)即可透明操作。這得益於 VFS(Virtual File System Switch,虛擬文件系統開關)——一個核心中介層,向上提供統一 POSIX 接口,向下適配具體文件系統驅動。本文梳理 VFS 設計哲學、管理範圍、四大核心對象與「一切皆文件」的體現。
open("mnt/data.txt") 無需知道底層是 ext4 還是 nfs。| 對象 | 對應實體 | 核心結構體 | 生命週期 |
|---|---|---|---|
| 超級塊對象 | 一個已掛載的文件系統 | struct super_block | 掛載時創建,卸載時銷毀 |
| 索引節點對象 | 一個具體文件/目錄/設備 | struct inode | 文件被訪問時創建,無引用時回收 |
| 目錄項對象 | 路徑中的每一個分量 | struct dentry | 路徑查找時創建,dcache 緩存 |
| 文件對象 | 進程打開的文件實例 | struct file | open() 創建,close() 最後引用釋放銷毀 |
VFS 將目錄視為「包含其他文件名→inode 映射的特殊文件」,因此不存在目錄對象,目錄操作同樣走 file_operations(如 iterate/readdir)。
open("/mnt/data.txt", O_RDONLY)。fs_struct 取得根目錄/工作目錄 dentry。/ → mnt → data.txt,每層在 dcache 中查找 dentry,未命中則調用底層文件系統 inode_operations->lookup 從磁盤讀取 inode 並構建 dentry。dentry(含 d_inode 指針)。inode_operations->permission)。struct file,初始化 f_inode、f_pos=0、f_flags、f_op = inode->i_fop。f_op->open(inode, file)(底層文件系統具體實現)。file* 放入進程 files_struct fd 表,返回 fd 給用戶。struct file_system_type(含 mount、kill_sb、fs_flags)。mount -t ext4 /dev/sda1 /mnt 觸發系統調用 sys_mount → VFS 呼叫 ext4_mount → 讀取磁盤超級塊 → 構建 super_block → 掛入全局鏈表 → 返回掛載點 dentry。VFS 是 Linux 存儲棧的「通用翻譯官」:
向上——統一 POSIX 語義,屏蔽底層差異;
向下——定義 super_operations、inode_operations、dentry_operations、file_operations 四大操作介面,文件系統驅動填充實現。
四大對象(超級塊、索引節點、目錄項、文件)以引用計數、鏈表、哈希表、操作函數表精密協作,構建出高效、可擴展、統一的文件系統虛擬化層。