虛擬檔案系統(virtual file system)
想像一個萬用電源轉接頭,讓任何插頭都能插進任何國家的任何插座。你手上拿著一個熟悉的插頭;在一個標準的面孔背後,轉接頭悄悄做著每個國家配線所需的一切。虛擬檔案系統就是核心裡的那個轉接頭:它對系統其餘部分提供一套單一、統一的檔案操作,同時隱藏「真正的儲存可能是 ext4、NTFS、FAT、網路分享,甚至根本不是磁碟」這件事。
它的運作方式是這樣。當程式呼叫 open、read 或 write,呼叫進入核心後,會落在 VFS 層,而不是任何特定的檔案系統。VFS 定義了一個抽象介面——一組每個檔案系統都必須提供的操作,作用在通用物件上:代表已掛載磁碟區的超級區塊物件、代表檔案的索引節點物件、代表目錄項目的 dentry,以及代表開啟檔案的檔案物件。每一種真實的檔案系統型別都註冊自己對這些操作的實作。所以對 /home(ext4)裡某檔案的 read 會呼叫 ext4 的 read 函式,而對 /mnt/usb(FAT)裡某檔案的 read 會呼叫 FAT 的 read 函式——但程式、以及大部分的核心,永遠只看到共通的 VFS 介面。掛載不過是把某個檔案系統的超級區塊接到統一目錄樹中的一個點上。
這就是為什麼一台 Linux 機器能讓 ext4、一支 NTFS 隨身碟、一片光碟的 ISO9660、以及一個遠端 NFS 分享,全部出現在同一棵無縫的樹裡,全部透過相同的 read 與 write 呼叫存取。這也是為什麼像 /proc 與 /sys 這種偽檔案系統行得通:它們實作 VFS 介面,但即時變出資料,而不是讀磁碟。誠實的代價是每次檔案操作多一層間接,與它換來的彈性相比微不足道。
cp /mnt/usb/photo.jpg /home/ann/ 把一個檔案從 FAT 隨身碟複製到 ext4 磁碟。外殼發出一般的 read 與 write 呼叫;VFS 把每個 read 路由到 FAT 的程式碼、每個 write 路由到 ext4 的程式碼。cp 與使用者都不需要知道這兩邊用的是完全不同的磁碟格式。
在許多檔案系統型別之上提供一個共通介面——同樣的 read 與 write 能觸及其中任何一個。
VFS 標準化的是介面,不是磁碟格式;每個檔案系統仍以自己的方式存資料。這份一致性只存在於核心的邊界,並且每次呼叫付出一層間接。