檔案系統與儲存

深入索引節點(inode)

/ inode = IH-node /

當你想到一個檔案,你大概想到的是它的名字,但檔案的名字其實不算是檔案的一部分。真正的檔案——它的大小、權限、時間戳記,以及最關鍵的:它的資料在磁碟上放在哪裡的清單——是由一筆叫做 inode 的獨立紀錄所描述的。名字只是某個目錄裡的一個標籤,靠號碼指向某個 inode。理解 inode,就是理解一個檔案在名字底下到底是什麼。

一個 inode(索引節點)是固定大小的磁碟結構,每個檔案一個,以 inode 號識別。它存放檔案的後設資料:型別(一般檔案、目錄、符號連結、裝置)、權限位元與擁有者/群組 id、連結計數(有多少個目錄項指向這個 inode)、以位元組計的大小,以及時間戳記(修改時間 mtime、存取時間 atime、以及 inode 變更時間 ctime)。它「不」存放檔名。最重要的是它存放從檔案偏移量到磁碟區塊的對應——在經典 Unix 檔案系統裡,是一組直接區塊指標加上單層、雙層、三層的間接指標;在 ext4 或 XFS 等現代系統裡,是一棵小型的 extent 樹。要讀檔案的第 100000 個位元組,核心讀取 inode、循那份對應找到實體區塊、再讀它。

為何重要:把名字與 inode 分開,正是硬連結之所以可能的原因——兩個名字、一個 inode、連結計數為 2——也是檔案在仍被開啟時可以挺過 unlink 的原因(inode 與資料只在連結計數與開啟計數都歸零時才被釋放)。這也是為何即使有空閒磁碟空間,檔案系統仍可能用盡 inode:inode 是從格式化時建立的固定大小表格中配置的,所以數百萬個小檔案可能遠在用盡區塊之前就耗盡 inode。反過來也可能發生。一個常見的誤解是用 rm 刪檔會抹去其資料;rm 只移除一個目錄項並把連結計數減一——inode 與其區塊只在再無任何東西參考它們時才被收回。

$ stat -c 'inode=%i links=%h size=%s mode=%A' report.txt inode=262203 links=2 size=8192 mode=-rw-r--r-- # links=2 表示有兩個名字指向這同一個 inode(存在一個硬連結)

stat 顯示 inode 號、連結計數、大小與權限——這些是 inode 所持有的後設資料(但從不含名字)。

inode 不持有檔名。檔案的名字以目錄項的形式住在它的父目錄裡;inode 只知道有多少個目錄項指向它(連結計數),而不知道它們叫什麼、在哪裡。

又称
index nodefile metadata record索引節點