LINUX 關於inode的一些理解

2021-08-11 06:07:30 字數 3639 閱讀 6151

**:

一、inode是什麼?

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

檔案儲存在硬碟上,硬碟的最小儲存單位叫做"扇區"(sector)。每個扇區儲存512位元組(相當於0.5kb)。

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

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

二、inode的內容

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

* 檔案的位元組數

* 檔案擁有者的user id

* 檔案的group id

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

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

* 檔案資料block的位置

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

stat example.txt

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

三、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都有乙個號碼,作業系統用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 原始檔 目標檔案

執行上面這條命令以後,原始檔與目標檔案的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的特殊作用

由於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一些基本命令 inode定義 軟硬鏈結

1.建立普通檔案命令 touch 命令 2.建立目錄檔案命令 mkdir 命令 3.刪除普通檔案命令 rm 命令 4.刪除目錄檔案命令 rmdir 命令 5.給普通檔案寫東西命令 vim 命令 6.檢視檔案內容前三行 後三行命令 head命令 7.拷貝複製命令 cp 命令 8.剪貼 移動檔案命令 m...

關於 linux 的一些發音

作業系統相關 unix ju niks 發音 yew nicks 尤里克斯 gnu g nju 發音 guh noo 葛扭linux li n ks 裡那克斯 gnome g no m 發音 guh nome 葛擩呣debian debi n 發音 deb e un ubuntu b nt 發音 o...

一些關於Linux 的認識

1.linux的歷史 linux是乙個開源的作業系統,它最初是芬蘭的helsinki大學的一位年輕的學生linux torvalds作為愛好開發的。linus對minix 乙個小型的unix系統 很感興趣,並且決定開發乙個比minix更好的系統。他在1991年開始開發並且當年發布0.02版本,他堅持...