問:說說inode到底是什么?

答:inode(即index node,索引節(jié)點(diǎn))是類Unix OS中保存文件系統(tǒng)中的對象元數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。全文完,謝謝食用。

……開玩笑的,下面稍微深入地談?wù)刬node,以及與它相關(guān)的一些小知識。

所謂“文件系統(tǒng)中的對象”,是個非常廣義的概念,畢竟Linux中幾乎一切都是文件,包括普通文件、目錄、設(shè)備、管道、Socket等等。inode就用來保存這些東西的元數(shù)據(jù),不包括具體的數(shù)據(jù),也不包含文件名。具體來講,inode中主要存儲以下這些元數(shù)據(jù):

  • inode編號
  • 文件大小
  • 占用的塊數(shù)目與塊大小
  • 文件類型(普通文件、目錄、管道,etc.)
  • 存儲該文件的設(shè)備號
  • 鏈接數(shù)目
  • 讀、寫、執(zhí)行權(quán)限
  • 擁有者的用戶ID和組ID
  • 文件的最近訪問、數(shù)據(jù)最近修改時間
  • inode最近修改時間

其中,inode編號相當(dāng)于這個結(jié)構(gòu)中的“主鍵”,也就是說操作系統(tǒng)用inode編號唯一標(biāo)識一個文件。利用stat命令可以查看元數(shù)據(jù)信息,如下圖所示。通過ls -i也可以僅查看一個或一批文件的inode編號。

inode存儲的元數(shù)據(jù)也是要占用文件系統(tǒng)空間的,每個inode的大小一般是128B或者256B,這可以通過查詢superblock信息的dumpe2fs命令查到。

inode size一項(xiàng)即是,圖中為256B

Linux在格式化硬盤分區(qū)(即初始化文件系統(tǒng))時,就會將inode的區(qū)域(稱為inode table)與文件數(shù)據(jù)的區(qū)域分開,一般每1KB或2KB數(shù)據(jù)分配一個inode編號。也就是說,每個分區(qū)的inode總數(shù)從格式化之后就固定了,因此有可能會出現(xiàn)存儲空間沒有占滿,但因?yàn)樾∥募喽谋M了inode的情況。

利用df -i命令可以查看inode數(shù)量方面的信息,如下圖所示。

下面我們來看看Linux系統(tǒng)中最常見的幾種文件操作是如何體現(xiàn)inode的。

復(fù)制

當(dāng)復(fù)制一個文件時,會創(chuàng)建一個包含新inode的新文件。

移動

當(dāng)移動一個文件時,僅僅是inode指向的位置發(fā)生變化,inode編號與實(shí)際數(shù)據(jù)存儲的塊的位置都不會變化。

硬鏈接(hard link)

Linux系統(tǒng)允許同一個inode號代表的文件有多個文件名,即可以用不同的文件名訪問同一份數(shù)據(jù),這叫做硬鏈接。對一個文件創(chuàng)建硬鏈接,其inode編號都相同,并且鏈接數(shù)會增加。

特別地,目錄中默認(rèn)包含的兩個項(xiàng)...實(shí)際上就是對當(dāng)前目錄和父目錄的硬鏈接,inode編號也對應(yīng)。

但是Linux系統(tǒng)不允許用戶對目錄創(chuàng)建硬鏈接,因?yàn)長inux的目錄結(jié)構(gòu)是無環(huán)圖,隨意創(chuàng)建硬鏈接之后會產(chǎn)生環(huán)。

軟鏈接(soft link)

軟鏈接的本質(zhì)也是一個文件,其存儲的內(nèi)容是對另一個文件的指針。所以對一個文件創(chuàng)建軟鏈接,inode編號會不同,被指向文件的鏈接數(shù)不會增加。并且可以對目錄與不存在的文件創(chuàng)建軟鏈接。

刪除

當(dāng)刪除文件時,會先檢查inode中的鏈接數(shù)。如果鏈接數(shù)大于1,就只會刪掉一個硬鏈接,不影響數(shù)據(jù)。如果鏈接數(shù)等于1,那么這個inode就會被釋放掉,對應(yīng)的塊也會被標(biāo)記為空閑的。

由上圖可以看出,如果把上述profile_copy文件刪掉,那么原先創(chuàng)建的兩個hardlink文件就變?yōu)榱藘蓚€不同的文件(其中一個文件會繼承原來的inode編號),其鏈接數(shù)為1,并且仍然可以正常訪問。相對地,softlink文件就變成了懸掛鏈接(dangling link),不能正常訪問了。

利用inode還可以刪除一些文件名中有轉(zhuǎn)義字符或控制字符的文件,最典型的就是開頭為減號-的文件。這種無法直接用rm命令來搞,就可以先查出它們的inode編號再刪除:

find ./ -inum 10086 -exec rm {} \:

全文完,謝謝食用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容