一步一步剖析linux之文件表項(i節點)

有句話相信大家都聽爛了,linux中一切皆文件。可見文件的重要性,那麼文件在linux系統中是如何存儲,如何被上層應用程序讀寫的呢?

linux內核共使用三種數據結構來描述打開的文件。

1、每個進程在進程表中都有一個記錄項,這個記錄項中包含有一張打開的文件的描述符表,每個描述符佔用這個描述符表其中的一項。

描述符的數據結構如下,包括描述符標誌和一個指向文件表項的指針。

一步一步剖析linux之文件表項(i節點)

2、內核為每個打開的文件維護一個文件表項,包含以下內容:

1)文件狀態標誌(讀、寫、同步、阻塞...)

2)當前文件偏移量。

3)指向該文件V節點表項的指針。

3、每個打開的文件都有一個V節點(v-node)結構,包含了文件類型以及對該文件進行讀寫操作的函數的指針,以及文件的i節點。這些信息都會在文件打開時讀入內存,可以快速使用。

文件描述符、文件表項、V節點的關係如下:


一步一步剖析linux之文件表項(i節點)

硬鏈接:一般情況下,文件名和inode號碼是"一一對應"關係,每個inode號碼對應一個文件名。但是,Unix/Linux系統允許,多個文件名指向同一個inode號碼。這意味著,可以用不同的文件名訪問同樣的內容;對文件內容進行修改,會影響到所有文件名;但是,刪除一個文件名,不影響另一個文件名的訪問。這種情況就被稱為"硬鏈接"(hard link)。

ln命令可以創建硬鏈接:ln 源文件 目標文件

運行上面這條命令以後,源文件與目標文件的inode號碼相同,都指向同一個inode,inode的鏈接數成員這時就會增加1。反過來,刪除一個文件名,就會使得inode節點中的"鏈接數"減1。當這個值減到0,表明沒有文件名指向這個inode,系統就會回收這個inode號碼,以及其所對應block區域。

軟鏈接:文件A和文件B的inode號碼雖然不一樣,但是文件A的內容是文件B的路徑。讀取文件A時,系統會自動將訪問者導向文件B。因此,無論打開哪一個文件,最終讀取的都是文件B。這時,文件A就稱為文件B的"軟鏈接"(soft link)或者"符號鏈接(symbolic link)。

這意味著,文件A依賴於文件B而存在,如果刪除了文件B,打開文件A就會報錯:“No such file or directory”。

這是軟鏈接與硬鏈接最大的不同:文件A指向文件B的文件名,而不是文件B的inode號碼,文件B的inode"鏈接數"不會因此發生變化。


分享到:


相關文章: