參考文獻:
《Linux核心設計與實現》
http://www.ibm.com/developerworks/cn/linux/l-cn-vfs/
http://www.ibm.com/developerworks/cn/linux/l-linux-filesystem/
http://www.ibm.com/developerworks/cn/linux/l-cn-read/index.html
1. 重要概念
“一切皆是檔案”是 Unix/Linux 的基本哲學之一。不僅普通的檔案,目錄、字元裝置、塊裝置、通訊端等在 Unix/Linux 中都是以檔案被對待;它們雖然類型不同,但是對其提供的卻是同一套操作介面。另外所謂的塊裝置:是指支援隨機訪問的存放裝置;與此相對應的是字元裝置,它只支援順序訪問。另外Linux將檔案的相關資訊和檔案本身這兩個概念加以區分,這兩者在磁碟上都需要儲存,前者經常又被稱為inode節點,後者才是實際的檔案內容,但必須通過前者才能找到該檔案實際存放的磁碟位置,及操作方法。
VFS使得可以通過使用同一套檔案 I/O 系統調用即可對 Linux 中的任意檔案進行操作而無需考慮其所在的具體檔案系統格式;更進一步,對檔案的操作可以跨檔案系統而執行。如我們可以使用 cp 命令從 vfat 檔案系統格式的硬碟拷貝資料到 ext3 檔案系統格式的硬碟;而這樣的操作涉及到兩個不同的檔案系統。不同的檔案系統塊大小可能不一樣(在超級塊中定義),一般大多數檔案系統使用512B。VFS即虛擬檔案系統是Linux檔案系統中的一個抽象軟體層;因為它的支援,眾多不同的實際檔案系統才能在Linux中共存,跨檔案系統操作才能實現。VFS藉助它四個主要的資料結構即超級塊、索引節點、目錄項和檔案對象以及一些輔助的資料結構,向Linux中不管是普通的檔案還是目錄、裝置、通訊端等都提供同樣的操作介面,如開啟、讀寫、關閉等。只有當把控制權傳給實際的檔案系統時,實際的檔案系統才會做出區分,對不同的檔案類型執行不同的操作。由此可見,正是有了VFS的存在,跨檔案系統操作才能執行,Unix/Linux中的“一切皆是檔案”的口號才能夠得以實現。
圖VFS在核心中與其他的核心模組的協同關係
檔案系統的三個操作過程:
註冊: 向核心報到聲明自己能被核心支援。一般在編譯核心的時侯註冊;也可以載入模組的方式手動註冊。註冊過程實際上是將表示各實際檔案系統的資料結構struct file_system_type 執行個體化。
建立: 以某種方式格式化磁碟的過程就是在其之上建立一個檔案系統的過程。建立文現系統時,會在磁碟的特定位置寫入關於該檔案系統的控制資訊,即向磁碟寫超級塊。
安裝: 也就是我們熟悉的mount操作,將檔案系統加入到Linux的根檔案系統的分類樹結構上;這樣檔案系統才能被訪問,通過目錄來尋找。