linux 在整個架構上可以看作是三層: 1.底層代碼, (引導層strip) 跟硬體溝通的那一層的代碼(可能是彙編+c), 驅動底層的; strain: n./v. 拉緊, 張力, 氣質, 風格, 樂曲(這個詞的意思很多): 中間層代碼, OS層,用來管理文件系統,記憶體,作業調度等. 裡面的實現包 ...
linux 在整個架構上可以看作是三層: 1.底層代碼, (引導層strip) 跟硬體溝通的那一層的代碼(可能是彙編+c), 驅動底層的; strain: n./v. 拉緊, 張力, 氣質, 風格, 樂曲(這個詞的意思很多):
-
中間層代碼, OS層,用來管理文件系統,記憶體,作業調度等. 裡面的實現包括很多文件,或 各種各樣的數據結構, 資料庫等等, (資料庫也是由分散的文件構成的吧), 其中inode等等就是在這裡支撐用戶接觸層的東東
-
表現層代碼, 就是我們所看到的, 我們所接觸的那些東西, 包括目錄結構, 文件等等.
linux內核用 數字 管理文件系統, 記憶體, 進程等等, 是為了 方便, 簡潔. 因為文件名稱, 進程名稱是很長很多 很占位元組的東西, 讓內核 去接觸這些東西, 很累! 通過這些 實體的編號, id來管理它們就 撇脫 多了.
進程 通過 pid 來管理, 進程名稱是pid的別名; 文件 通過 inode來管理, 文件名稱是inode的別名;
inode的讀法: i-node : [ai ' n2ud]: i: 可以認為是id, identifier , 所以讀成: [ai] , node是節點, 代表著對應文件的實體.
linux上的inode編號是索引節點的編號。理解inode,要從文件儲存說起。
文件儲存在硬碟上,硬碟的最小存儲單位叫做"扇區"(Sector)。每個扇區儲存512位元組(相當於0.5KB)。 ** (如果把硬碟當作 一把稱, 就是說, 它的最小刻度, 最小能夠稱出的重量 , 最大精度, 最多能夠稱出的, "只能打得起...多重?")
這種由多個扇區組成的"塊",是文件存取的最小單位。所以 即使文件內容只有1個byte
操作系統讀取硬碟的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個"塊"(block)。這種由多個扇區組成的"塊",是文件存取的最小單位。"塊"的大小,(需要折中, 在效率和磁碟利用率的矛盾上折中!) 最常見的是4KB,即連續八個 sector組成一個 block。
文件數據都儲存在"塊"中,那麼很顯然,還必須找到一個地方儲存文件的元信息(metadata, 就是文件的"屬性, 描述信息"!) ,比如文件的創建者、文件的創建日期、文件的大小等等。這種儲存文件元信息的區域就叫做inode,中文譯名為"索引節點"。
每個inode都有一個號碼,操作系統用inode號碼來識別不同的文件。(區域叫inode, 區域的編號叫inode 編號, inode號碼)!
這裡值得重覆一遍,Unix/Linux系統內部不使用文件名,而使用inode號碼來識別文件。 對於系統來說,文件名只是inode號碼便於識別的別稱或者綽號。錶面上,用戶通過文件名,打開文件。實際上,系統內部這個過程分成三步:
首先,系統找到這個文件名對應的inode號碼;(對應的文件或資料庫表: 比如叫做: "文件名-inode表") 其次,通過inode號碼,獲取inode信息; 最後,根據inode信息,找到文件數據所在的block,讀出數據。
文件數據都儲存在"塊"中,那麼很顯然,我們還必須找到一個地方儲存文件的元信息,比如文件的創建者、文件的創建日期、文件的大小等等。這種儲存文件元信息的區域就叫做inode,中文譯名為"索引節點"。
二、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已經用光,但是硬碟還未存滿的情況。這時,就無法在硬碟上創建新文件。
使用ls -i命令,可以看到文件名對應的inode號碼: ls -i example.txt
----------------------------------------- 什麼叫dirent? LINUX系統下的一個頭文件,在這個目錄下/usr/include 為了獲取某文件夾目錄內容,所使用的結構體。 引用頭文件#include結構體說明 編輯 struct dirent { long d_ino; /* inode number 索引節點號 / inode: 表示區域, inode number才是節點號. off_t d_off; / offset to this dirent 在目錄文件中的偏移 / unsigned short d_reclen; / length of this d_name 文件名長 / unsigned char d_type; / the type of d_name 文件類型 / char d_name [NAME_MAX+1]; / file name (null-terminated) 文件名,最長256字元 */ }
五、目錄文件
Unix/Linux系統中,目錄(directory)也是一種文件。打開目錄,實際上就是打開目錄文件。
目錄文件的結構非常簡單,就是一系列目錄項(dirent)的列表。每個目錄項,由兩部分組成:所包含文件的文件名,以及該文件名對應的inode號碼。
ls命令只列出目錄文件中的所有文件名:
代碼如下:
ls /etc
ls -i命令列出整個目錄文件,即文件名和inode號碼:
代碼如下:
ls -i /etc
如果要查看文件的詳細信息,就必鬚根據inode號碼,訪問inode節點,讀取信息。ls -l命令列出文件的詳細信息。
代碼如下:
ls -l /etc
----------------------------------- 軟鏈接和硬鏈接? 目的: 都是為了使用的方便. (如同一個人, 可以有多個名字, 父母叫的乳名, 長輩叫的小名, 同事叫的書名, 下屬叫的尊稱等等)
表現: 都是多個名字對應著同一個inode. inode: 文件名 = 1:N 是1對多的關係!
語法: ln 源文件 目標文件. ln -s 源文件或目錄名 目標文件或目錄
<< 根據 源和目標, 就可以確定 哪個是依賴, 那個是被依賴.. "源文件" 是最開始最根本被依賴的東西!)
源文件就是 原始 文件>>
區別: 硬鏈接, 各個文件的內容都相同! 都是真正的file data! 彼此之間的地位是相同的, 沒有依賴性, 刪除一個, 不影響另一個! 硬鏈接的主要目的是: 為了防止對重要文件的"誤刪". 有些 : "類似" 複製備份, 但是不是複製 備份! 硬鏈接的限制: 只能對文件, 不能對目錄 ! 創建硬鏈接; 只能在同一分區內創建...
軟鏈接, 兩個文件的內容不同. ln -s A B, 就是 A文件是源文件, B依賴A, A是源, B是目標文件,
A是包含真正的內容, B的內容是A的路徑, 對B的訪問將跳轉到對A的訪問.
也叫軟連接。軟鏈接文件有類似於Windows的快捷方式。它實際上是一個特殊的文件。在符號連接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息。 這就允許符號鏈接(經常簡寫為symlinks)指向位於其他分區、甚至是其他網路硬碟上的某個文件
----------------------------------------------------------軟鏈接和硬鏈接? (完)
八、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
,任何一個目錄的"硬鏈接"總數,總是等於2加上它的子目錄總數(含隱藏目錄),這裡的2是父目錄對其的“硬鏈接”和當前目錄下的".硬鏈接“。