我們經常在Linux下可以看到inode,都不知道是什麼東東,那麼我們現在來慢慢瞭解下。 一、inode是什麼? 理解inode,要從文件儲存說起。 文件儲存在硬碟上,硬碟的最小存儲單位叫做"扇區"(Sector)。每個扇區儲存512位元組(相當於0.5KB)。 操作系統讀取硬碟的時候,不會一個個扇區 ...
我們經常在Linux下可以看到inode,都不知道是什麼東東,那麼我們現在來慢慢瞭解下。
一、inode是什麼?
理解inode,要從文件儲存說起。 文件儲存在硬碟上,硬碟的最小存儲單位叫做"扇區"(Sector)。每個扇區儲存512位元組(相當於0.5KB)。操作系統讀取硬碟的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個"塊"(block)。這種由多個扇區組成的"塊",是文件存取的最小單位。"塊"的大小,最常見的是4KB,即連續八個 sector組成一個 block。
文件數據都儲存在"塊"中,那麼很顯然,我們還必須找到一個地方儲存文件的元信息,比如文件的創建者、文件的創建日期、文件的大小等等。這種儲存文件元信息的區域就叫做inode,中文譯名為"索引節點"。
二、inode的內容 inode包含文件的元信息,具體來說有以下內容: * 文件的位元組數 * 文件擁有者的User ID * 文件的Group ID * 文件的讀、寫、執行許可權 * 文件的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指文件內容上一次變動的時間,atime指文件上一次打開的時間。 * 鏈接數,即有多少文件名指向這個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命令可以創建硬鏈接:
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
轉自:
http://www.ruanyifeng.com/blog/2011/12/inode.html
http://blog.s135.com/post/295/
http://hi.baidu.com/leejun_2005/blog/item/d9aa13a53b3af6e99152ee7e.html
完