關(guān)于 Linux 中的索引節(jié)點 Inode,你需要知道的一切
你是否抱怨過你的 Linux 系統(tǒng)沒有剩余空間,而你顯然還有足夠多的空間?
發(fā)生在我的親身經(jīng)歷,我還有很多 GB,但我的 Linux 系統(tǒng)卻抱怨沒有空間了。這是我開始了解索引節(jié)點 inode 的時候。
inode 簡介
Inode 將系統(tǒng)上每個文件的元數(shù)據(jù)存儲在通常位于分區(qū)開頭附近的表狀結(jié)構(gòu)中。它們存儲除文件名和數(shù)據(jù)之外的所有信息。
給定目錄中的每個文件都是一個帶有文件名和 inode 編號的條目。通過引用索引節(jié)點號從索引節(jié)點表中檢索有關(guān)該文件的所有其他信息。
Inode 編號在分區(qū)級別是唯一的。每個分區(qū)都有自己的 inode 表。
如果 inode 用完了,即使給定分區(qū)上還有剩余空間,也無法創(chuàng)建新文件。
Linux 中的 inode 是什么?
inode(Index Node)譯成中文就是索引節(jié)點。雖然歷史上對此不太確定,但這是他們提出的最合乎邏輯、最好的猜測。它曾經(jīng)寫成I-node,但連字符隨著時間的推移丟失了。
如linfo.org上所述:
inode是一種數(shù)據(jù)結(jié)構(gòu)…… …… 它存儲文件的所有信息,除了文件名和實際數(shù)據(jù)。
Inode 存儲有關(guān)它引用的文件的元數(shù)據(jù)。此元數(shù)據(jù)包含有關(guān)所述文件的所有信息。
- 文件大小
- 訪問權(quán)限
- 創(chuàng)建時間
- 修改時間
- 數(shù)據(jù)在磁盤的位置
- 其他信息
每個使用的 inode 引用一個文件。每個文件都有一個 inode。目錄、字符文件和塊設(shè)備都是文件。它們每個都有一個 inode。
對于目錄中的每個文件,都有一個條目,其中包含文件名和與之關(guān)聯(lián)的索引節(jié)點號。
Inode 在分區(qū)級別是唯一的。如果兩個文件位于不同的分區(qū)上,則它們可以具有相同的 inode 編號。Inodes 信息存儲在每個分區(qū)的戰(zhàn)略部分的類似表的結(jié)構(gòu)中,通常在開頭附近找到。
如何在 Linux 中查看 inode?
您可以使用以下命令輕松列出 inode 編號:
下面的圖片顯示了我的根目錄以及相應(yīng)的 inode 編號。
每個文件系統(tǒng)擁有的 inode 數(shù)量是在創(chuàng)建文件系統(tǒng)時決定的。對于大多數(shù)用戶來說,默認的 inode 數(shù)量已經(jīng)足夠了。
創(chuàng)建文件系統(tǒng)時的默認設(shè)置是每 2K 字節(jié)空間創(chuàng)建 1 個索引節(jié)點。這為大多數(shù)系統(tǒng)提供了大量 inode。在用完 inode 之前,您很可能會用完空間。如果需要,您可以在創(chuàng)建文件系統(tǒng)時指定要創(chuàng)建多少 inode。
如果您用完 inode,您將無法創(chuàng)建新文件。您的系統(tǒng)也將無法這樣做。大多數(shù)用戶不會遇到這種情況,但這是可能的。
例如,郵件服務(wù)器會存儲大量非常小的文件。許多這些文件將小于 2K 字節(jié)。它也有望不斷增長。因此,郵件服務(wù)器有可能在空間用完之前用完 inode。
一些文件系統(tǒng),如Btrfs、JFS、 XFS 已經(jīng)實現(xiàn)了動態(tài)索引節(jié)點。如果需要,他們可以增加可用的 inode 數(shù)量。
索引節(jié)點是如何工作的?
創(chuàng)建新文件時,會為其分配一個 inode 編號和文件名。inode 編號是該文件系統(tǒng)中的唯一編號。名稱和 inode 編號都作為條目存儲在目錄中。
當我運行l(wèi)s 命令“ ls -li / ”時,文件名和 inode 編號是存儲在目錄/中的內(nèi)容。使用 inode 編號從 inode 表中檢索剩余信息用戶、組、文件權(quán)限、大小等。
您可以在 Linux 中使用 df 命令列出每個文件系統(tǒng)的 inode 信息:
在 Linux 中列出 inode 信息
索引節(jié)點和軟/硬鏈接
軟鏈接或符號鏈接是 Linux 的一個眾所周知的功能。但是,當您在 Linux 中創(chuàng)建符號鏈接時,Inode 會發(fā)生什么情況?在下一張圖片中,我有一個名為“ dir1 ”的目錄,一個名為“ file1 ”的文件,在“ dir1 ”中我有一個名為“ slink1 ”的軟鏈接,它指向“ ../file1 ”
現(xiàn)在我可以遞歸列出并顯示 inode 信息。
正如預期的那樣,dir1 和 file1 具有不同的 inode 編號。而且軟鏈接也是如此。創(chuàng)建軟鏈接時,您創(chuàng)建了一個新文件。在其元數(shù)據(jù)中,它指向目標。對于您創(chuàng)建的每個軟鏈接,您都使用一個 inode。
使用ln 命令在 dir1 中創(chuàng)建硬鏈接后:
inode 編號列表為我提供了以下信息:
您可以看到“ file1”和“ hlink1 ”具有相同的 inode 編號。說實話,由于索引節(jié)點,硬鏈接成為可能。硬鏈接不會創(chuàng)建新文件。它只是為相同的數(shù)據(jù)提供了一個新名稱。
在舊版本的 Linux 中,可以硬鏈接目錄。甚至可以讓給定的目錄成為它自己的父目錄。由于 inode 實現(xiàn),這成為可能。這現(xiàn)在受到限制,以防止用戶創(chuàng)建非?;靵y的目錄結(jié)構(gòu)。
inode 的其他含義
inode 的工作方式也是不可能在不同文件系統(tǒng)之間創(chuàng)建硬鏈接的原因。允許這樣的任務(wù)將打開 inode 編號沖突的可能性。另一方面,可以跨不同的文件系統(tǒng)創(chuàng)建軟鏈接。
因為硬鏈接和原文件有相同的inode號,你可以刪除原文件,數(shù)據(jù)仍然可以通過硬鏈接訪問。在這種情況下,您所做的只是刪除指向該 inode 編號的名稱之一。鏈接到此 inode 編號的數(shù)據(jù)將保持可用,直到刪除與其關(guān)聯(lián)的所有名稱。
索引節(jié)點也是 Linux 系統(tǒng)無需重啟即可更新的重要原因。這是因為一個進程可以使用庫文件,而另一個進程可以用新版本替換該文件。因此,為新文件創(chuàng)建一個新的 inode。已經(jīng)運行的進程將繼續(xù)使用舊文件,而每次對其進行新調(diào)用都會導致使用新版本。
inode 附帶的另一個有趣的特性是能夠?qū)?shù)據(jù)存儲在 inode 本身中。這稱為內(nèi)聯(lián)。這種存儲方法具有節(jié)省空間的優(yōu)點,因為不需要數(shù)據(jù)塊。它還通過避免更多的磁盤訪問來獲取數(shù)據(jù)來增加查找時間。
某些文件系統(tǒng)(如 ext4)有一個名為 inline_data 的選項。啟用后,它允許操作系統(tǒng)以這種方式存儲數(shù)據(jù)。由于大小限制,內(nèi)聯(lián)僅適用于非常小的文件。ext2 及以后的版本經(jīng)常會這樣存儲軟鏈接信息。也就是說,如果大小不超過 60 字節(jié)。
結(jié)論
Inode 不是您直接與之交互的東西,但它們扮演著重要的角色。如果一個分區(qū)要包含許多非常小的文件,比如郵件服務(wù)器,了解它們是什么以及它們?nèi)绾喂ぷ骺梢詾槟苊夂芏鄦栴}。