天天看點

Linux/Unix檔案系統索引節點淺析

索引節點,其英文為 Inode,是 Index Node 的縮寫。索引節點是整個 Linux 檔案系統的基礎。存儲于檔案系統上的任何檔案都可以用索引節點來表示。舉一個例子來說,假設有一個老圖書館裡面有一本登記簿,上面記錄着館内的書名及存放 位置,比如在哪一間的第幾排存放着哪一本書,以及書的作者是誰。在這裡,記錄着一本書的那一行就是索引節點。索引節點以同樣的方式來存儲對象,我們會在下 面學習。

在 Linux 系統中,檔案系統主要分為兩部分,一部分為中繼資料(metadata),另一部分為資料本身。中繼資料,換句話說,就是“包含了與資料有關資訊的資料”。索引節點就管理着檔案系統中中繼資料的部分。

索引節點基礎知識

如上所述,檔案系統中的任何一個檔案或目錄都與一個索引節點相對應。每個索引節點都是一個資料結構,存儲着目标資料的如下資訊:

檔案大小(以位元組為機關)

(存放檔案的)裝置辨別符

(檔案所有者的)使用者辨別符

使用者組辨別符

檔案模式(所有者、使用者組及其他人對于檔案的讀取有怎樣的權限)

擴充屬性(如 ACL)

檔案讀取或修改的時間戳

連結數量(指向該檔案的硬連結數,記住,軟連結不計算在内)

指向存儲該内容的磁盤區塊的指針

檔案分類(是普通檔案、目錄還是特殊區塊裝置)

檔案占用的區塊數量

Linux 檔案系統從來不存儲檔案建立時間,許多人都不清楚這一點。

一個典型的索引資料看起來會是像下面這樣:

# stat 01

Size:923383Blocks:1816IO Block:4096regular file

Device:803h/2051dInode:12684895Links:1

Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root)

Access:2012-09-0701:46:54.000000000-0500

Modify:2012-04-2706:22:02.000000000-0500

Change:2012-04-2706:22:02.000000000-0500

索引節點是在何時并以怎樣的方式建立的?

索引節點的建立與正在使用的檔案系統有關。一些檔案系統在建立時就建立了索引節點,故其索引節點的數量有限。而一些如 JFS 和 XFS 等系統也在檔案系統建立時建立索引節點,但使用動态節點配置設定,并按需擴大索引節點的數量,是以可以避免所有索引節點用完的情況。

當讀取檔案時都發生了什麼?

當使用者試圖讀取檔案或與該檔案相關的資訊時,他會使用檔案名稱。但是,實質上這個檔案名稱首先映射為存儲于目錄表中的索引點節号碼。通過該索引節點号碼又讀取到相對應的索引節點。索引節點号碼及相對應的索引節點存放于映射表(Inode table)中。

索引節點指針結構

上面已經解釋過,索引節點隻存儲中繼資料資訊,其中包括真正的資料存儲的區塊的資訊。下面就來解釋一下索引節點指針結構。

如這篇維基百科上面的文章解釋的那樣,這個結構可能會有 11 到 13 個指針,但大多數檔案系統會以 15 個指針的形式來存儲資料結構。這 15 個指針包括:

直接指向檔案資料區塊的 12 個指針,稱為直接指針(direct pointer)。

一個單獨非直接指針(singly indirect pointer),指向一個由多個指針構成的區塊,後者的指針又指向檔案資料區塊。

一個雙重非直接指針(doubly indirect pointer),指向一個由多個指針構成的區塊,後者的指針又指向一個由多個指針構成的區塊,這一區塊的指針又指向檔案資料的區塊。

一個三重非直接指針(triply indirect pointer),指向一個由多個指針構成的區塊,後者的指針又指向一個由多個指針構成的區塊,其指針又指向另一個由多個指針構成的區塊,這一區塊的指針又指向檔案資料的區塊。

常見問題集解

問:請用一句話來說明一下索引節點是什麼?

答:索引節點是傳統類 Unix 檔案系統上的資料結構,儲存了正常檔案、目錄或其他檔案系統目标的基本資訊。

問:如何檢視檔案或目錄的索引節點号碼?

答:可使用“stat”指令來檢視該資訊,也可以使用“ls”指令加上其“-i”參數來檢視一檔案的索引節點号碼。

問:如何檢視檔案系統上的索引節點的總數和已用數?

答:“df -i”指令會顯示索引節點總數、已用數和未使用數的統計資料。

問:為什麼索引節點資訊不包含檔案名稱?

答:索引節點會儲存對于其自身唯一的資訊。對于一個硬連結,一個索引節點可能會含有指向同一索引節點的兩個不同的檔案名。故檔案名稱沒有存儲于索引節點之内。

問:如果索引節點不包含連結會怎麼樣?

答:不包含連結的索引節點就會從檔案系統上移除,并且其資源就會釋放出來供重新配置設定。但直到所有打開它的程序對它讀取完成後才可以删除它。

問:在移動檔案時索引節點會發生變化嗎?

答:即使将檔案從一處移動到另一處,索引節點号碼還是會保持不變,但前提是在同一檔案系統之下。如果在不同的檔案系統之間移動,索引節點号碼就會發生變化。

問:在建立新檔案或目錄時會建立新的索引節點嗎?

答:不會。當建立新檔案或目錄時,它隻會使用一個已經建立的索引節點的空間并更新其資訊,但不會建立新的索引節點。索引節點隻會在檔案系統建立時建立(有一些檔案系統存在例外,上面已解釋)。

問:可以通過索引節點号碼找到檔案嗎?

答:可以。使用如下指令(其中 inode-number 為索引節點号碼):

# find / -inum inode-number -exec ls -l {} \;

将上面的一行指令中的“ls”換為“rm”,也可以根據索引節點号碼删除檔案。

# find / -inum inode-number -exec rm -f {} \;

更多精彩linux視訊教程,盡在51CTO學院: http://edu.51cto.com/course/courseList/id-48.html

Linux/Unix檔案系統索引節點淺析

繼續閱讀