參考資料:http://www.cnblogs.com/itech/archive/2012/05/15/2502284.htmlhtml
操做環境:Centos六、VM虛擬機node
一、inode是什麼 緩存
1.1.理解inode,要從文件存儲提及,文件儲存在硬盤上,硬盤的最小存儲單位叫作扇區。計算機最小存儲計量單位是:bit(位),計算機最基本存儲計量單位是:Bytes(字節),Bit和Bytes的關係:8Bit=1Bytes,1K=1Kb=1024b=8*1024 Bit;
操做系統讀取硬盤時,不會一個一個扇區讀取,這樣效率過低,而是一次性讀取多個扇區,即一次性讀取一個塊(最多見的大小是4KB),這種由多個扇區組成的塊,是文件存取的最小單位;
文件數據都儲存在塊中,儲存這些文件的元信息(如文件的建立者、文件的建立日期、文件的大小等等)的區域就叫作inode,中午譯名爲索引節點。硬盤格式化時,操做系統會自動將硬盤分紅兩個區域,一個是數據區,一個是inode區。服務器
inode包含文件的元信息,具體來講有如下內容:操作系統
* 文件的字節數htm
* 文件擁有者的User IDblog
* 文件的Group ID索引
* 文件的讀、寫、執行權限內存
* 文件的時間戳,共有三個:ctime指inode上一次變更的時間,mtime指文件內容上一次變更的時間,atime指文件上一次打開的時間。虛擬機
* 連接數,即有多少文件名指向這個inode
* 文件數據block的位置
1.2.能夠用stat filename查看某文件的信息,除了文件名之外的全部文件信息都存在inode之中——Unix/Linux系統內部不使用文件名,而使用inode號碼來識別文件,表面上,用戶經過文件名,打開文件。實際上,系統內部這個過程分紅三步:首先,系統找到這個文件名對應的inode號碼;其次,經過inode號碼,獲取inode信息;最後,根據inode信息,找到文件數據所在的block,讀出數據。這也就是爲何說stat查看信息時沒有文件名的緣由。
每一個inode節點的大小,通常是128字節或256字節,inode節點的總數,在格式化時就給定,通常是每1KB或2KB就設置一個inode。查看每一個硬盤分區的inode總數和已經使用的數量,可使用df -i命令。
因爲每一個文件都必須有一個inode,所以有可能發生inode已經用光,可是硬盤還未存滿的狀況,這時就沒法在硬盤上建立新文件。
1.3.硬連接:
通常狀況下,文件名和inode號碼是一一對應關係,每一個inode號碼對應一個文件名,但Unix/Linux系統容許,多個文件名指向同一個inode號碼。這意味着,能夠用不一樣的文件名訪問一樣的內容;對文件內容進行修改,會影響到全部文件名;可是,刪除一個文件名,不影響另外一個文件名的訪問。這種狀況就被稱爲"硬連接"(hard link)。
ln命令能夠建立硬連接:
ln 源文件 目標文件
運行上面這條命令之後,源文件與目標文件的inode號碼相同,都指向同一個inode。inode信息中有一項叫作"連接數",記錄指向該inode的文件名總數,這時就會增長1。反過來,刪除一個文件名,就會使得inode節點中的"連接數"減1。當這個值減到0,代表沒有文件名指向這個inode,系統就會回收這個inode號碼,以及其所對應block區域。
此外,建立目錄時,默認會生成兩個目錄項:"."和".."。前者的inode號碼就是當前目錄的inode號碼,等同於當前目錄的"硬連接";後者的inode號碼就是當前目錄的父目錄的inode號碼,等同於父目錄的"硬連接"。
1.4.軟連接:
ln -s 源文文件或目錄 目標文件或目錄
文件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"連接數"不會所以發生變化。
1.5.inode的特殊做用:
因爲inode號碼與文件名分離,這種機制致使了一些Unix/Linux系統特有的現象。
1.5.1 有時,文件名包含特殊字符,沒法正常刪除。這時,直接刪除inode節點,就能起到刪除文件的做用。
1.5.2. 移動文件或重命名文件,只是改變文件名,不影響inode號碼。
1.5.3. 打開一個文件之後,系統就以inode號碼來識別這個文件,再也不考慮文件名。所以,一般來講,系統沒法從inode號碼得知文件名。
第3點使得軟件更新變得簡單,能夠在不關閉軟件的狀況下進行更新,不須要重啓。由於系統經過inode號碼,識別運行中的文件,不經過文件名。更新的時候,新版文件以一樣的文件名,生成一個新的inode,不會影響到運行中的文件。等到下一次運行這個軟件的時候,文件名就自動指向新版文件,舊版文件的inode則被回收。
實際案例:
在一臺配置較低的Linux服務器(內存、硬盤比較小)的/data分區內建立文件時,系統提示磁盤空間不足,用df -h命令查看了一下磁盤使用狀況,發現/data分區只使用了66%,還有12G的剩餘空間,按理說不會出現這種問題。 後來用df -i查看了一下/data分區的索引節點(inode),發現已經用滿(IUsed=100%),致使系統沒法建立新目錄和文件。
查找緣由:
/data/cache目錄中存在數量很是多的小字節緩存文件,佔用的Block很少,可是佔用了大量的inode。
解決方案: 一、刪除/data/cache目錄中的部分文件,釋放出/data分區的一部分inode。 二、用軟鏈接將空閒分區/opt中的newcache目錄鏈接到/data/cache,使用/opt分區的inode來緩解/data分區inode不足的問題: ln -s /opt/newcache /data/cache