Linux文件系統基礎之inode和dentry

inode(節點)和dentry(目錄項)在VFS和實體的文件系統(ext2、ext3等)中都是比較重要的概念。首先看一下虛擬文件系統的標準定義:虛擬文件系統(英語:virtual file system,縮寫爲VFS),又稱虛擬文件切換系統(virtual filesystem switch),是操作系統的文件系統虛擬層,在其下是實體的文件系統。虛擬文件系統的主要功用在於讓上層的軟件,能夠用單一的方式,來跟底層不同的文件系統溝通。在操作系統與之下的各種文件系統之間,虛擬文件系統提供了標準的操作接口,讓操作系統能夠很快的支持新的文件系統。

 

VFS在Linux系統中的結構爲:

在教科書上面,一般是這樣描述inode的:inode是內核文件對象的元數據。inode中不包括文件的數據和文件名字信息。inode中只包含數據塊的位置信息,數據結構相對穩定,其中沒有數據和文件名等變長數據,可以固定其大小,進而可以實現將整個文件系統中的inode按照一定的組織方式來集中存儲在硬盤起始的一個,文件系統加載時,可以方便查找即可。

inode僅僅只是保存了文件對象的屬性信息,包括:權限、屬組、數據塊的位置、時間戳等信息。但是並沒有包含文件名,文件在文件系統的目錄樹中所處的位置信息。那麼內核又是怎麼管理文件系統的目錄樹呢?

dentry在內核中起到了連接不同的文件對象inode的作用,進而起到了維護文件系統目錄樹的作用。dentry是一個純粹的內存結構,由文件系統在提供文件訪問的過程中在內存中直接建立。dentry中包含了文件名,文件的inode號等信息。

對於POSIX標準定義了文件系統的inode。VFS接口即是符合POSIX標準的,實體文件系統只要能對接上VFS,即可符合POSIX標準。因此,一般而言我們研究VFS文件系統即可瞭解大部分文件系統的結構。而在VFS中,定義了規範化的inode結構和dentry。

在讀取一個文件時,總是從根目錄開始讀取,每一個目錄或者文件,在VFS中,都是一個文件對象,每一個文件對象都有唯一的一個inode與之對應。根目錄的inode號爲0,在superblock裏,可以很快根據inode號索引到具體的inode,因此讀取到的第一個inode就是根目錄的。讀取到了該目錄後,內核對象會爲該文件對象建立一個dentry,並將其緩存起來,方便下一次讀取時直接從內存中取。而目錄本身也是一個文件,目錄文件的內容即是該目錄下的文件的名字與inode號,目錄文件的內容就像一張表,記錄的文件名與其inode no.之間的映射關係。根據路徑即可找到當前需要讀取的下一級文件的名字和inode,同時繼續爲該文件建立dentry,dentry結構是一種含有指向父節點和子節點指針的雙向結構,多個這樣的雙向結構構成一個內存裏面的樹狀結構,也就是文件系統的目錄結構在內存中的緩存了。有了這個緩存,我們在訪問文件系統時,通常都非常快捷。

有了inode和dentry,也就非常容易理解文件的連接了。我們知道軟連接,是一個特殊的文件,該文件通過內容指向目標文件。因此軟連接有自己的inode,有自己的內容。其內容記錄的是目標文件的inode號和自身的名字。軟連接是一種特殊的文件。而硬鏈接則不一樣,硬鏈接是文件的別名,硬鏈接不是一個完整的文件對象,硬鏈接只是將自己的名字寫在上級目錄的內容(文件名與inode no.的映射表)中。而其inode號即是目標文件的inode。這樣硬連接與目標文件一起共用一個inode,使用引用計數來管理硬連接。

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