當前位置: 妍妍網 > 碼農

面試問過好多Linux中inode包含什麽?好多人不知道這些!

2024-05-14碼農

關註上方 浩道Linux ,回復 資料 ,即可獲取海量 L inux Python 網路通訊、網路安全 等學習資料!

前言

大家好,這裏是 浩道Linux ,主要給大家分享 L inux P ython 網路通訊、網路安全等 相關的IT知識平台。

今天浩道跟大家分享一道常見的Linux運維面試題。關於Linux中inode包含什麽內容?不少夥伴也是經常被問到,但是卻無法回答到技術點上,一起看看!

文章來源:https://blog.csdn.net/fuming0210sc/article/details/78699050

inode 是一個重要概念

是理解 Unix/Linux 檔案系統和硬碟儲存的基礎。

理解inode,要從檔儲存說起。

檔儲存在硬碟上,硬碟的最小儲存單位叫做"磁區"(Sector)。每個磁區儲存512字節(相當於0.5KB)。

作業系統讀取硬碟的時候,不會一個個磁區地讀取,這樣效率太低,而是一次性連續讀取多個磁區,即一次性讀取一個"塊"(block)。這種由多個磁區組成的"塊",是檔存取的最小單位。"塊"的大小,最常見的是4KB,即連續八個 sector組成一個 block。

檔數據都儲存在"塊"中,那麽很顯然,我們還必須找到一個地方儲存檔的元資訊,比如檔的建立者、檔的建立日期、檔的大小等等。這種儲存檔元資訊的區域就叫做inode,中文譯名為"索引節點"。

inode包含檔的元資訊,具體來說有以下內容:

* 檔的字節數

* 檔擁有者的User ID

* 檔的Group ID

* 檔的讀、寫、執行許可權

* 檔的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指檔內容上一次變動的時間,atime指檔上一次開啟的時間。

* 連結數,即有多少檔名指向這個inode

* 檔數據block的位置

可以用stat命令,檢視某個檔的inode資訊:

stat example.txt

總之,除了檔名以外的所有檔資訊,都存在inode之中。至於為什麽沒有檔名,下文會有詳細解釋。

inode也會消耗硬碟空間,所以硬碟格式化的時候,作業系統自動將硬碟分成兩個區域。一個是數據區,存放檔數據;另一個是inode區(inode table),存放inode所包含的資訊。

每個inode節點的大小,一般是128字節或256字節。inode節點的總數,在格式化時就給定,一般是每1KB或每2KB就設定一個inode。假定在一塊1GB的硬碟中,每個inode節點的大小為128字節,每1KB就設定一個inode,那麽inode table的大小就會達到128MB,占整塊硬碟的12.8%。

檢視每個硬碟分區的inode總數和已經使用的數量,可以使用df命令。

df -i

檢視每個inode節點的大小,可以用如下命令:

sudo dumpe2fs -h /dev/hda | grep "Inode size"

由於每個檔都必須有一個inode,因此有可能發生inode已經用光,但是硬碟還未存滿的情況。這時,就無法在硬碟上建立新檔。

每個inode都有一個號碼,作業系統用inode號碼來辨識不同的檔。

這裏值得重復一遍,Unix/Linux系統內部不使用檔名,而使用inode號碼來辨識檔。對於系統來說,檔名只是inode號碼便於辨識的別稱或者綽號。表面上,使用者透過檔名,開啟檔。實際上,系統內部這個過程分成三步:首先,系統找到這個檔名對應的inode號碼;其次,透過inode號碼,獲取inode資訊;最後,根據inode資訊,找到檔數據所在的block,讀出數據。

使用ls -i命令,可以看到檔名對應的inode號碼:

ls -i example.txt

Unix/Linux系統中,目錄(directory)也是一種檔。開啟目錄,實際上就是開啟目錄檔。

目錄檔的結構非常簡單,就是一系列目錄項(dirent)的列表。每個目錄項,由兩部份組成:所包含檔的檔名,以及該檔名對應的inode號碼。

ls命令只列出目錄檔中的所有檔名:

ls /etc

ls -i命令列出整個目錄檔,即檔名和inode號碼:

ls -i /etc

如果要檢視檔的詳細資訊,就必須根據inode號碼,存取inode節點,讀取資訊。ls -l命令列出檔的詳細資訊。

ls -l /etc

一般情況下,檔名和inode號碼是"一一對應"關系,每個inode號碼對應一個檔名。但是,Unix/Linux系統允許,多個檔名指向同一個inode號碼。這意味著,可以用不同的檔名存取同樣的內容;對檔內容進行修改,會影響到所有檔名;但是,刪除一個檔名,不影響另一個檔名的存取。這種情況就被稱為"硬連結"(hard link)。

ln命令可以建立硬連結:

ln 原始檔 目的檔

執行上面這條命令以後,原始檔與目的檔的inode號碼相同,都指向同一個inode。inode資訊中有一項叫做"連結數",記錄指向該inode的檔名總數,這時就會增加1。反過來,刪除一個檔名,就會使得inode節點中的"連結數"減1。當這個值減到0,表明沒有檔名指向這個inode,系統就會回收這個inode號碼,以及其所對應block區域。

這裏順便說一下目錄檔的"連結數"。建立目錄時,預設會生成兩個目錄項:"."和".."。前者的inode號碼就是當前目錄的inode號碼,等同於當前目錄的"硬連結";後者的inode號碼就是當前目錄的父目錄的inode號碼,等同於父目錄的"硬連結"。所以,任何一個目錄的"硬連結"總數,總是等於2加上它的子目錄總數(含隱藏目錄),這裏的2是父目錄對其的「硬連結」和當前目錄下的".硬連結「。

除了硬連結以外,還有一種特殊情況。檔A和檔B的inode號碼雖然不一樣,但是檔A的內容是檔B的路徑。讀取檔A時,系統會自動將存取者導向檔B。因此,無論開啟哪一個檔,最終讀取的都是檔B。這時,檔A就稱為檔B的"軟連結"(soft link)或者"符號連結(symbolic link)。

這意味著,檔A依賴於檔B而存在,如果刪除了檔B,開啟檔A就會報錯:"No such file or directory"。這是軟連結與硬連結最大的不同:檔A指向檔B的檔名,而不是檔B的inode號碼,檔B的inode"連結數"不會因此發生變化。

ln -s命令可以建立軟連結。

ln -s 源文檔或目錄 目的檔或目錄

由於inode號碼與檔名分離,這種機制導致了一些Unix/Linux系統特有的現象。

1. 有時,檔名包含特殊字元,無法正常刪除。這時,直接刪除inode節點,就能起到刪除檔的作用。

2. 移動檔或重新命名檔,只是改變檔名,不影響inode號碼。

3. 開啟一個檔以後,系統就以inode號碼來辨識這個檔,不再考慮檔名。因此,通常來說,系統無法從inode號碼得知檔名。

第3點使得軟體更新變得簡單,可以在不關閉軟體的情況下進行更新,不需要重新開機。因為系統透過inode號碼,辨識執行中的檔,不透過檔名。更新的時候,新版檔以同樣的檔名,生成一個新的inode,不會影響到執行中的檔。等到下一次執行這個軟體的時候,檔名就自動指向新版檔,舊版檔的inode則被回收。

在一台配置較低的Linux伺服器(記憶體、硬碟比較小)的/data分區內建立檔時,系統提示磁盤空間不足,用df -h命令檢視了一下磁盤使用情況,發現/data分區只使用了66%,還有12G的剩余空間,按理說不會出現這種問題。 後來用df -i檢視了一下/data分區的索引節點(inode),發現已經用滿(IUsed=100%),導致系統無法建立新目錄和檔。

尋找原因:

/data/cache目錄中存在數量非常多的小字節緩存檔,占用的Block不多,但是占用了大量的inode。

解決方案:

1、刪除/data/cache目錄中的部份檔,釋放出/data分區的一部份inode。
2、用軟連線將空閑分區/opt中的newcache目錄連線到/data/cache,使用/opt分區的inode來緩解/data分區inode不足的問題:

ln -s /opt/newcache /data/cache

更多精彩

關註公眾號 浩道Linux

浩道Linux ,專註於 Linux系統 的相關知識、 網路通訊 網路安全 Python相關 知識以及涵蓋IT行業相關技能的學習, 理論與實戰結合,真正讓你在學習工作中真正去用到所學。同時也會分享一些面試經驗,助你找到高薪offer,讓我們一起去學習,一起去進步,一起去漲薪!期待您的加入~~~ 關註回復「資料」可 免費獲取學習資料 (含有電子書籍、視訊等)。

喜歡的話,記得 點「贊」 「在看」