1、Inode是什么?
要理解inode,要從文件儲存說起。
文件由元數據和數據構成。
文件儲存在硬盤上,最小的存儲單位叫做“扇區(Sector)”。每個扇區存儲512字節。操作系統讀取硬盤時,不會一個扇區一個扇區地讀取,這樣非常低效;而是一次性連續讀取多個扇區,即一次性讀取一個“塊(block)”?!皦K”由多個扇區組成,常見的大小有1K、2K、4K等,其中4K較常見。
文件的數據都存儲在塊(block)中,那么文件的元數據(比如文件的創建者、創建日期、大小等信息)也需要找個空間存儲。存儲文件元數據信息的區域就叫做inode,中文譯作“索引節點”。
在linux系統中,每個文件會分配到一個inode,可以將inode簡單理解為指針,它永遠指向文件的具體存儲位置。系統是通過inode來定位每個文件的。
2、Inode包含的內容
Inode包含下面的信息:
* 文件的字節數
* 文件擁有者的User ID
* 文件的Group ID
* 文件的讀、寫、執行權限
* 文件的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指文件內容上一次變動的時間,atime指文件上一次打開的時間。
* 鏈接數,即有多少文件名指向這個inode
* 文件數據block的位置
3、inode的大小
inode也會消耗硬盤空間,所以硬盤格式化的時候,操作系統自動將硬盤分成兩個區域。一個是數據區,存放文件數據;另一個是inode區(inode table),存放inode所包含的信息。
查看每個硬盤分區的inode總數和已經使用的數量,可以使用df命令。df -i
查看每個inode的大?。篸umpe2fs –h /dev/sda1| grep “Inode size”
4、inode號碼
每個inode都有一個號碼,操作系統用inode號碼來識別不同的文件。
這里值得重復一遍,Unix/Linux系統內部不使用文件名,而使用inode號碼來識別文件。對于系統來說,文件名只是inode號碼便于識別的別稱或者綽號。
表面上,用戶通過文件名,打開文件。實際上,系統內部這個過程分成三步:首先,系統找到這個文件名對應的inode號碼;其次,通過inode號碼,獲取inode信息;最后,根據inode信息,找到文件數據所在的block,讀出數據。
5、目錄文件:
在unix/linux系統中,目錄也是一種文件。目錄由一系列的目錄項(dirent)組成,每個目錄項由兩部分組成:所包含文件的文件名,以及該文件名對應的inode號碼。
簡單來說,目錄是用來關鍵文件名與Inode number的。
6、那么在linux中,文件系統查找文件的過程是怎樣的呢。
以查找/var/log/somefile文件為例:
先查找/對應的inode號——>在對應inode表中找到/對應inode信息,通過該信息找到對應磁盤塊——>在/磁盤塊中找到var的inode號——>再到對應的inode表中找到var對應inode信息,獲知其對應的磁盤塊——>在var對應的磁盤塊中找到log對應的inode號——>根據inode號找到log對應inode信息,找到對應的磁盤——>在log中找到somfile文件對應的inode號——>在inode表中找到somefile文件對應inode信息,查找到對應磁盤塊——>再到somefile文件的磁盤塊上獲取文件的數據內容。至此,文件獲取。
7、復制、移動和刪除文件在inode上的表現
復制文件:分配空閑的inode——>在inode table里創建條目——>在目錄里創建文件和inode的對應關系——>將文件寫入塊
移動文件:文件的移動分為兩種情況。
第一種:源文件和目標文件在同一文件系統/分區上。文件移動的實現方式是:在目標目錄下創建目標文件名與inode的對應關系——>刪除源目錄下的源文件名與inode的對應關系。完成。Ctime會被改寫。在此情況下,數據在磁盤上的位置沒有移動。
第二種:源文件與目標文件在不同的文件系統上。文件移動的實現方式是:
找到空閑的inode——>在inode下創建條目——>在目錄下創建目標文件名和inode的對應關系——>將文件寫入塊——>同時源文件將被刪除。Ctime會被改寫,inode發生變化,數據在磁盤上的位置也相應地移動
刪除文件:
刪除文件的實質是減少inode的鏈接數,當鏈接數為0時,刪除目錄下文件名和inode的對應關系,將inode標記為可用。數據在塊中并沒有被移除,只是該塊也被標記為可用,當有新數據寫入并且需要用到該塊時,該塊上面的數據才會被覆蓋。
8、軟、硬鏈接的區別
8.1 什么是硬鏈接
一般情況下,文件名和inode號碼是"一一對應"關系,每個inode號碼對應一個文件名。
但是,Unix/Linux系統允許多個文件名指向同一個inode號碼。這意味著,可以用不同的文件名訪問同樣的內容;對文件內容進行修改,會影響到所有文件名;但是,刪除一個文件名,不影響另一個文件名的訪問。這種情況就被稱為"硬鏈接"(hard link)。
源文件與目標文件的inode號碼相同,都指向同一個inode。inode信息中有一項叫做"鏈接數",記錄指向該inode的文件名總數,這時就會增加1。反過來,刪除一個文件名,就會使得inode節點中的"鏈接數"減1。當這個值減到0,表明沒有文件名指向這個inode,系統就會回收這個inode號碼,以及其所對應block區域。
這里順便說一下目錄文件的"鏈接數"。創建目錄時,默認會生成兩個目錄項:"."和".."。
前者的inode號碼就是當前目錄的inode號碼,等同于當前目錄的"硬鏈接";后者的inode號碼就是當前目錄的父目錄的inode號碼,等同于父目錄的"硬鏈接"。
所以,任何一個目錄的"硬鏈接"總數,總是等于2加上它的子目錄總數(含隱藏目錄)。
硬鏈接創建方式:ln 源文件 鏈接文件
8.2 什么是軟鏈接
文件A和文件B的inode號碼雖然不一樣,但是文件A的內容是文件B的路徑。讀取文件A時,系統會自動將訪問者導向文件B。因此,無論打開哪一個文件,最終讀取的都是文件B。這時,文件A就稱為文件B的"軟鏈接"(soft link)或者"符號鏈接(symbolic link)。
這意味著,文件A依賴于文件B而存在,如果刪除了文件B,打開文件A就會報錯:"No such file or directory"。
軟連接創建方式:ln –s 源文件 鏈接文件
這是軟鏈接與硬鏈接最大的不同:軟鏈接指向文件的文件名,而不是文件的inode號碼,文件的"鏈接數"不會因此發生變化。
原創文章,作者:M20-1鐘明波,如若轉載,請注明出處:http://www.www58058.com/26632