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