(2)文件系統的基本概念

一. 什麼是VFS

Linux內核通過虛擬文件系統(Virtual File System,VFS)管理文件系統。

VFS是Linux內核文件系統的一個極其重要的基礎設施,VFS爲所有的文件系統提供了統一的接口,對每個具體文件系統的訪問要通過VFS定義的接口來實現。同時VFS也是一個極其重要的架構,所有Linux的文件系統必須按照VFS定義的方式來實現。

VFS本身只存在於內存中,它需要將硬盤上的文件系統抽象到內存中,這個工作是通過幾個重要的結構實現的。VFS定義了幾個重要的結構:dentry、inode這幾個對象就可以完成對文件系統的一些操作(當然,在合適的時候,仍然需要將內存的數據寫入到硬盤)。

VFS是具體文件系統的抽象,而VFS又是依靠超級塊、inode、dentry以及文件這些結構來發揮作用。

二. 超級塊 super_block

超級塊(super_block)代表了整個文件系統本身。通常,超級塊是對應文件系統自身的控制塊結構。超級塊保存了文件系統設定的文件塊大小,超級塊的操作函數,而文件系統內所有的inode也都要鏈接到超級塊的鏈表頭。對於一個具體文件系統的控制塊可能還含有另外的信息,而通過超級塊對象,我們可以找到這些必要的信息。

超級塊的內容需要讀取具體文件系統在硬盤上的超級塊結構獲得,所以超級塊是具體文件系統超級塊的內存抽象。

每個文件系統都有一個超級塊結構,每個超級塊都要鏈接到一個超級塊鏈表。而文件系統內的每個文件在打開時都需要在內存分配一個inode結構,這些inode結構都要鏈接到超級塊。

三. 目錄項 dentry

對於一個同的文件系統來說,文件和目錄一般按樹狀結構保存。直觀來看,目錄裏保存着文件,而所有目錄一層層匯聚,最終到達根目錄。目錄項(dentry)就是反映了文件系統的這種樹狀關係。

在VFS裏,目錄本身也是一個文件,只是有點特殊。每個文件都有一個dentry(可能不止一個),這個dentry鏈接到上級目錄的dentry。根目錄有一個dentry結構,而根目錄裏的文件和目錄都鏈接到這個跟dentry,二級目錄裏的文件和目錄,同樣通過dentry鏈接到二級目錄。這樣一層層鏈接,就形成了一顆dentry樹。從樹頂可以遍歷整個文件系統的所有目錄和文件。

爲了加快對dentry的查找,內核使用了hash表來緩存dentry,稱爲dentry cache。

四. 索引節點 inode

inode代表一個文件。inode保存了文件的大小、創建時間、文件的塊大小等參數,以及對文件的讀寫函數、文件的讀寫緩存等信息。一個真實的文件可以有多個dentry,因爲指向文件的路徑可以有多個(考慮問價你的鏈接),而inode只有一個。

inode和dentry分別代表了文件通用的兩個部分,只不過對某些文件系統而言,inode提供的信息還不夠,還需要其他信息。

五. 文件

文件對象的作用是描述進程和文件交互的關係。硬盤上並不存在一個文件結構。進程打開一個文件,內核就動態創建一個文件對象。同一個文件,在不同的進程中有不同的文件對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章