什么是inode?
在Linux磁盤存儲文件系統中,我們以塊劃分磁盤為兩部分:超級塊(superblock)和數據塊(data block);同時劃分單文件為用戶數據(user data)和元數據(meta data)兩個部分。
-
用戶數據記錄的是文件的真實內容。比如你的血液、骨骼和各器官等等。
-
元數據這是附加于文件的屬性信息。比如身高、體重、血型和年齡等等。通常包含了文件的大小、訪問模式、歸屬(主和組)、權限、時間戳等等。
為了快速查找分別存儲于超級塊和數據塊的文件,我們引進了索引節點inode(index node)。我們可以理解為元數據+數據塊指針=inode。每個inode大小固定為128bytes,每個文件占用一個inode。但是有一個問題,需要記錄的文件屬性特別多,而且一個文件可能有很多很多block,而inode又太小(記錄一個block要用4byte),怎么辦?linux的解決辦法是:將inode記錄block號碼的區域定義為12個直接、一個間接、一個雙間接與一個三間接記錄區??偣部捎涗浀腷lock數量為:12+256+256*256+256*256*256(K)=16G這只符合block大小為1K時的情況。
為了方便理解,我繪制的示例如下圖:
Linux是如何查找文件的?
文件的文件名是不包含在inode結構里的,用戶通過文件名來引用一個文件,文件名只是為了方便用戶識別文件的。
每個inode都有一個編號,我們稱為索引編號(inumber),兩者雖然極為相似,并且互相關聯,但他們卻是兩個不同的概念。 inode 指的是數據結構;而inumber實際上是 inode 的標識編號,因此也稱其為 inode 編號 或者索引編號。索引編號只是文件相關信息中一項重要的內容。Linux的內核內存是通過索引編號定位inode,再從inode里的指針,定位到data block,從而找到文件的。
值得注意的是,目錄也是文件,不過目錄的 data block 里的數據是目錄下的文件名(子目錄)和它的inode 號之間的映射構成的。
現在我們通過示圖來展示 Linux 查找文件
1.假設有文件目錄結構如下圖:
系統需要查找/testdir/A/b.txt文件,查找過程是
linux如何創建、刪除、移動文件?
創建
當我們直接創建(或通過復制創建)一個普通文件/PATH/file時,系統會分配一個空閑的inode,在inode表中生成inumber,同時父目錄/PATH的data block里添加file《═》inumber。這樣一個新文件創建成功了。
rm刪除
鏈接數遞減,從而釋放的inode 號可以被重用,
把數據塊放在空閑列表中
刪除父目錄里的映射項
數據實際上不會馬上被刪除,但當另一個文件使用數據塊
時將被覆蓋。
mv移動
1. 如果mv 命令的目標和源在相同的文件系統,作為mv 命令
用新的文件名創建對應新的目錄項
刪除舊目錄條目對應的舊的文件名
不影響inode 表(除時間戳)或磁盤上的數據位置:沒有數據被移動!
2. 如果目標和源在一個不同的文件系統, 由于inode不能跨文件系統,所以mv 需要在目標文件系統中執行相當于cp 和rm。
軟鏈接和硬鏈接
為解決文件的共享使用,Linux 系統引入了兩種鏈接:硬鏈接 (hard link) 與軟鏈接(又稱符號鏈接,即 soft link 或 symbolic link)。鏈接為 Linux 系統解決了文件的共享使用,還帶來了隱藏文件路徑、增加權限安全及節省存儲等好處。若一個 inode 號對應多個文件名,則稱這些文件為硬鏈接。換言之,硬鏈接就是同一個文件使用了多個別名hard link 就是 file 的一個別名,他們有共同的 inode)。硬鏈接可由命令 link 或 ln 創建。如下是對文件 oldfile 創建硬鏈接。
硬鏈接:
從上圖中我們可以看到,硬鏈接與源文件是相同的inode和data block。因此
硬鏈接的特性為:
-
只能對已存在的文件進行創建,創建硬鏈接會在inode里添加計數
-
指向inode相同,與源文件的data block也相同
-
不能對目錄創建硬鏈接
-
不能跨文件系統進行硬鏈接的創建
-
創建硬鏈接會在硬鏈接父目錄添加映射條目:hard link映射源文件inode
-
刪除一個硬鏈接文件,會在父目錄清除該條映射,inode計數減一,所以不影響其他有相同 inode 號的文件。
硬鏈接展示:
源文件不存在, 無法創建硬鏈接:
不能對目錄進行創建硬鏈接:
不能跨文件系統創建硬鏈接:
與源文件有相同的inode,inode里計數增加1:
軟連接:
從上圖中我們可以看到,軟連接和源文件是兩個獨立inode的文件,因此
軟鏈接的特性為:
-
可以指向一個目錄
-
可以跨文件系統(分區)
-
是一個指向源文件名稱的指針,是個一個文件
-
指向的是另一個文件的路徑;其大小為指向的路徑字符串的長度;不增加或減少目標文件inode 的引用計數
軟鏈接展示:
可以對目錄創建軟鏈接:
可以跨文件系統創建軟連接:
軟鏈接是指向源文件的指針,與源文件是兩個獨立inode的文件:
寫在結束
本文描述了 inode 的結構體。通過索引節點結構體,區分硬鏈接與軟鏈接的不同存在。
本文參考資料主要來源于:
《理解 Linux 的硬鏈接與軟鏈接》http://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/#fig2
《學習 Linux,101: 創建和更改硬鏈接和符號鏈接》http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-104-6/
文中主要通過個人理解進行描述,由于初學Linux,限于本人水平有限,文中難免錯誤紕漏。歡迎各位看官不吝指教、討論相關技術。謝謝。聯系我:jacky18676887374@aliyun.com
原創文章,作者:昭其,如若轉載,請注明出處:http://www.www58058.com/30437