檔案系統實作

索引節點(inode)

/ EYE-node /

想像一座圖書館,每本書都有一張索引卡。卡片上沒有故事內容;它記錄誰寫的、何時入庫、誰可以借閱,以及它的各章節究竟放在哪幾個書架。書背上的書名是分開的——它存在於目錄抽屜裡。在 Unix 風格的檔案系統中,那張索引卡就是索引節點:每個檔案一份的小結構,存放關於這個檔案的一切,但「除了」它的名字和它真正的資料。

具體來說,索引節點儲存檔案的中繼資料:型別(一般檔案、目錄、符號連結、裝置)、擁有者與群組、權限位元(例如 rwxr-xr-x)、以位元組計的大小、各種時間戳記、連結計數(有多少目錄名稱指向它),以及最核心的——指出「哪些實體磁碟區塊存放此檔案資料」的指標。索引節點不存檔案的名字;取而代之,一個目錄項目只是一個(名稱, 索引節點號碼)配對,而好幾個名稱可以指向同一個索引節點(這正是硬連結)。要開啟 report.txt,核心會在目錄裡查名稱得到索引節點號碼,讀進那個索引節點,檢查權限,再順著它裡面的區塊指標找到資料。

一個關鍵後果:因為名稱和索引節點是分開的,一個檔案其實是靠它的索引節點存活,而不是靠名字。檔案的資料只有在「連結計數降到零」而且「沒有任何行程還開著它」時才會被釋放。這就是為什麼刪掉好幾個硬連結中的一個並不會摧毀檔案,也是為什麼程式可以繼續讀一個你已經從所有目錄裡移除的檔案。索引節點的總數通常在磁碟區格式化時就固定了,所以磁碟可能在「還有空閒空間」時就用光索引節點(大量極小的檔案),反之亦然。

ls -li 顯示:1048577 -rw-r--r-- 2 ann staff 2048 report.txt。第一個數字 1048577 是索引節點號碼;那個 2 是連結計數,表示有兩個目錄名稱指向這同一個索引節點。移除一個名稱,檔案仍以另一個名稱存活;兩個都移除(且各處都關閉它)之後,它的資料區塊才會被釋放。

索引節點才是檔案本身;名稱只是目錄裡指向它的一個標籤。

索引節點裡並不含檔案名稱。初學者常以為有——但名稱住在目錄項目裡,這正是硬連結與「已刪名稱卻仍開著」的檔案得以存在的原因。

又稱
index nodefile control blockFCBi-node檔案控制區塊