關于 Linux 中的索引節點 Inode,你需要知道的一切
你是否抱怨過你的 Linux 系統沒有剩余空間,而你顯然還有足夠多的空間?
發生在我的親身經歷,我還有很多 GB,但我的 Linux 系統卻抱怨沒有空間了。這是我開始了解索引節點 inode 的時候。

inode 簡介
Inode 將系統上每個文件的元數據存儲在通常位于分區開頭附近的表狀結構中。它們存儲除文件名和數據之外的所有信息。
給定目錄中的每個文件都是一個帶有文件名和 inode 編號的條目。通過引用索引節點號從索引節點表中檢索有關該文件的所有其他信息。
Inode 編號在分區級別是唯一的。每個分區都有自己的 inode 表。
如果 inode 用完了,即使給定分區上還有剩余空間,也無法創建新文件。
Linux 中的 inode 是什么?
inode(Index Node)譯成中文就是索引節點。雖然歷史上對此不太確定,但這是他們提出的最合乎邏輯、最好的猜測。它曾經寫成I-node,但連字符隨著時間的推移丟失了。
如linfo.org上所述:
inode是一種數據結構…… …… 它存儲文件的所有信息,除了文件名和實際數據。
Inode 存儲有關它引用的文件的元數據。此元數據包含有關所述文件的所有信息。
- 文件大小
- 訪問權限
- 創建時間
- 修改時間
- 數據在磁盤的位置
- 其他信息
每個使用的 inode 引用一個文件。每個文件都有一個 inode。目錄、字符文件和塊設備都是文件。它們每個都有一個 inode。
對于目錄中的每個文件,都有一個條目,其中包含文件名和與之關聯的索引節點號。
Inode 在分區級別是唯一的。如果兩個文件位于不同的分區上,則它們可以具有相同的 inode 編號。Inodes 信息存儲在每個分區的戰略部分的類似表的結構中,通常在開頭附近找到。
如何在 Linux 中查看 inode?
您可以使用以下命令輕松列出 inode 編號:
下面的圖片顯示了我的根目錄以及相應的 inode 編號。

每個文件系統擁有的 inode 數量是在創建文件系統時決定的。對于大多數用戶來說,默認的 inode 數量已經足夠了。
創建文件系統時的默認設置是每 2K 字節空間創建 1 個索引節點。這為大多數系統提供了大量 inode。在用完 inode 之前,您很可能會用完空間。如果需要,您可以在創建文件系統時指定要創建多少 inode。
如果您用完 inode,您將無法創建新文件。您的系統也將無法這樣做。大多數用戶不會遇到這種情況,但這是可能的。
例如,郵件服務器會存儲大量非常小的文件。許多這些文件將小于 2K 字節。它也有望不斷增長。因此,郵件服務器有可能在空間用完之前用完 inode。
一些文件系統,如Btrfs、JFS、 XFS 已經實現了動態索引節點。如果需要,他們可以增加可用的 inode 數量。
索引節點是如何工作的?
創建新文件時,會為其分配一個 inode 編號和文件名。inode 編號是該文件系統中的唯一編號。名稱和 inode 編號都作為條目存儲在目錄中。
當我運行ls 命令“ ls -li / ”時,文件名和 inode 編號是存儲在目錄/中的內容。使用 inode 編號從 inode 表中檢索剩余信息用戶、組、文件權限、大小等。
您可以在 Linux 中使用 df 命令列出每個文件系統的 inode 信息:

在 Linux 中列出 inode 信息
索引節點和軟/硬鏈接
軟鏈接或符號鏈接是 Linux 的一個眾所周知的功能。但是,當您在 Linux 中創建符號鏈接時,Inode 會發生什么情況?在下一張圖片中,我有一個名為“ dir1 ”的目錄,一個名為“ file1 ”的文件,在“ dir1 ”中我有一個名為“ slink1 ”的軟鏈接,它指向“ ../file1 ”

現在我可以遞歸列出并顯示 inode 信息。

正如預期的那樣,dir1 和 file1 具有不同的 inode 編號。而且軟鏈接也是如此。創建軟鏈接時,您創建了一個新文件。在其元數據中,它指向目標。對于您創建的每個軟鏈接,您都使用一個 inode。
使用ln 命令在 dir1 中創建硬鏈接后:
inode 編號列表為我提供了以下信息:

您可以看到“ file1”和“ hlink1 ”具有相同的 inode 編號。說實話,由于索引節點,硬鏈接成為可能。硬鏈接不會創建新文件。它只是為相同的數據提供了一個新名稱。
在舊版本的 Linux 中,可以硬鏈接目錄。甚至可以讓給定的目錄成為它自己的父目錄。由于 inode 實現,這成為可能。這現在受到限制,以防止用戶創建非常混亂的目錄結構。
inode 的其他含義
inode 的工作方式也是不可能在不同文件系統之間創建硬鏈接的原因。允許這樣的任務將打開 inode 編號沖突的可能性。另一方面,可以跨不同的文件系統創建軟鏈接。
因為硬鏈接和原文件有相同的inode號,你可以刪除原文件,數據仍然可以通過硬鏈接訪問。在這種情況下,您所做的只是刪除指向該 inode 編號的名稱之一。鏈接到此 inode 編號的數據將保持可用,直到刪除與其關聯的所有名稱。
索引節點也是 Linux 系統無需重啟即可更新的重要原因。這是因為一個進程可以使用庫文件,而另一個進程可以用新版本替換該文件。因此,為新文件創建一個新的 inode。已經運行的進程將繼續使用舊文件,而每次對其進行新調用都會導致使用新版本。
inode 附帶的另一個有趣的特性是能夠將數據存儲在 inode 本身中。這稱為內聯。這種存儲方法具有節省空間的優點,因為不需要數據塊。它還通過避免更多的磁盤訪問來獲取數據來增加查找時間。
某些文件系統(如 ext4)有一個名為 inline_data 的選項。啟用后,它允許操作系統以這種方式存儲數據。由于大小限制,內聯僅適用于非常小的文件。ext2 及以后的版本經常會這樣存儲軟鏈接信息。也就是說,如果大小不超過 60 字節。
結論
Inode 不是您直接與之交互的東西,但它們扮演著重要的角色。如果一個分區要包含許多非常小的文件,比如郵件服務器,了解它們是什么以及它們如何工作可以為您避免很多問題。






























