「An inode stores all the information about a regular file, directory, or other file system object, except its data and name. 」
每一個文件都對應一個 i 節點,i 節點存儲了除文件名和文件內容以外的全部信息。node
瞭解一下文件系統如何存取文件的:
一、根據文件名,經過Directory裏的對應關係,找到文件對應的Inode number
二、再根據Inode number讀取到文件的Inode table
三、再根據Inode table中的Pointer讀取到相應的Blocks緩存
文件夾也是一種文件,建立的時候須要佔用一個inode,而對應的data block則存目錄的內容,內容則是該目錄下全部文件(文件夾)的名字和對應的inode number。函數
unlink 和 rm 的關係.net
執行unlink()函數並不必定會真正的刪除文件,它先會檢查文件系統中此文件的鏈接數是否爲1,若是不是1說明此文件還有其餘連接對象,所以只對此文件的鏈接數進行減1操做。若鏈接數爲1,而且在此時沒有任何進程打開該文件,此內容纔會真正地被刪除掉。在有進程打開此文件的狀況下,則暫時不會刪除,直到全部打開該文件的進程都結束時文件就會被刪除。指針
在讀取一個文件時,老是從根目錄開始讀取,每個目錄或者文件,在VFS中,都是一個文件對象,每個文件對象都有惟一的一個inode與之對應。根目錄的inode號爲0,在superblock裏,能夠很快根據inode號索引到具體的inode,所以讀取到的第一個inode就是根目錄的。讀取到了該目錄後,內核對象會爲該文件對象創建一個dentry,並將其緩存起來,方便下一次讀取時直接從內存中取。而目錄自己也是一個文件,目錄文件的內容便是該目錄下的文件的名字與inode號,目錄文件的內容就像一張表,記錄的文件名與其inode no.之間的映射關係。根據路徑便可找到當前須要讀取的下一級文件的名字和inode,同時繼續爲該文件創建dentry,dentry結構是一種含有指向父節點和子節點指針的雙向結構,多個這樣的雙向結構構成一個內存裏面的樹狀結構,也就是文件系統的目錄結構在內存中的緩存了。有了這個緩存,咱們在訪問文件系統時,一般都很是快捷。code
link 和 cp 的關係
拷貝文件(cp)會從新建立一個文件而且複製相同的內容,佔用新的空間,新的inode,這是兩個文件
。
而硬連接其實是增長了原來文件的count,並建立了一個鏈接
,當你刪除一個源文件或者一個硬連接後,count減1,到0後刪除文件。orm
cp對inode的影響:對象
1. 當複製行爲發生的時候,系統會找到一個空inode number,而後將數據寫入到inode table 2. 而且會新增一個目錄,把文件的檔案名稱對應到inode number 3. 當inode number和inode table處理好了以後,系統纔會將文件內容複製到新增的文件中
mv對inode的影響:blog
前提:使用mv命令搬移的文件目的地跟原文件在同一文件系統內索引
1. 系統會新建一個目錄項,將新檔案名稱對應到inode number 2. 刪除舊檔案 (搬移檔案的行爲對inode table沒有任何影響,也不會將檔案搬移到其餘的block)
rm對inode的影響:
1. 系統會減去文件的link count數字,而後將對應的inode number標記爲可以使用 2. 而文件所佔用的block也會打上可使用的「標籤」 3. 最後移除文件名稱和目錄項 ============================================ PS: 當咱們使用rm命令的時候,系統並不會真正刪除這個資料。除非有檔案非要將資料存儲在原來檔案的這些block中。這 樣原來的block就會被新檔案給覆蓋掉。 =============================================