真正理解linux的inode?


linux 在整個架構上可以看作是三層:
1.底層代碼, (引導層strip) 跟硬件溝通的那一層的代碼(可能是匯編+c), 驅動底層的;
strain: n./v. 拉緊, 張力, 氣質, 風格, 樂曲(這個詞的意思很多): 

  1. 中間層代碼, OS層,用來管理文件系統,內存,作業調度等. 里面的實現包括很多文件,或 各種各樣的數據結構, 數據庫等等,
    (數據庫也是由分散的文件構成的吧), 其中inode等等就是在這里支撐用戶接觸層的東東

  2. 表現層代碼, 就是我們所看到的, 我們所接觸的那些東西, 包括目錄結構, 文件等等.


linux內核用 數字 管理文件系統, 內存, 進程等等, 是為了 方便, 簡潔. 因為文件名稱, 進程名稱是很長很多 很占字節的東西, 讓內核
去接觸這些東西, 很累! 通過這些 實體的編號, id來管理它們就 撇脫 多了.

進程 通過 pid 來管理, 進程名稱是pid的別名;
文件 通過 inode來管理, 文件名稱是inode的別名;


inode的讀法:
i-node : [ai ' n2ud]: i: 可以認為是id, identifier , 所以讀成: [ai] , node是節點, 代表着對應文件的實體.


參考這篇關於inode的文章

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<dirent.h>
結構體說明
編輯
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是父目錄對其的“硬鏈接”和當前目錄下的".硬鏈接“。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM