基本概念
首先講下inode和塊的基本概念。在Linux系統中,檔案由中繼資料和資料塊組成。資料塊就是多個連續性的扇區(sector),扇區是檔案存儲的最小機關(每個512位元組)。塊(block)的大小,最常見的是4KB,也就是連續8個sector組成,存儲檔案資料和目錄資料。而中繼資料用來記錄檔案的建立者、建立日期、大小等,這種存儲檔案中繼資料資訊的區域叫做inode,即索引節點。
由于inode也是用來存儲檔案相關屬性資訊的,是以也會消耗硬碟空間。具體包含的資訊有inode号,檔案的位元組數、User ID、Group ID、讀、寫、執行權限、時間戳(共有三個:ctime指inode上一次變動的時間,mtime指檔案内容上一次變動的時間,atime指檔案上一次打開的時間)、連結數(軟硬連結)、資料block的位置,注意沒有檔案名。
在硬碟格式化的時候,作業系統就會将硬碟分為兩個區,即資料區和inode區。每個inode節點的大小一般為128B或者256B,inode的總數在格式化檔案系統的時候就已經确定。
另外還有幾個概念了解一下:
- node Bitmap:即inode位圖,用二進制的方式記錄了inode的使用情況, 比如inode是否空閑等。
- Block Bitmap:即塊位圖,同Inode Bitmap,用二進制方式記錄了塊的使用情況。當查找或建立檔案時,會掃描此位圖來尋找空閑的inode号對應的塊。
- super block:超級塊包含了該硬碟或分區上的檔案系統的整體資訊,如檔案系統的大小等。
- dentry:在核心中起到了連接配接不同的檔案對象inode的作用,進而起到了維護檔案系統目錄樹的作用。dentry是一個純粹的記憶體結構,由檔案系統在提供檔案通路的過程中在記憶體中直接建立。dentry中包含了檔案名,檔案的inode号等資訊。
下圖為檔案系統inode區block區圖:

檔案的查找、建立、删除原理
接下來對檔案的查找、建立、删除原理三個方面來對inode和塊的了解。
- 檔案的查找:比如要查找/var/log/message
- 檔案的建立:比如要建立/backup/test.txt(前提backup目錄存在)
- 檔案的删除:删除/backup/test.txt
查找
- 首先根目錄(目錄也是個檔案,不是容器!也可以了解為路徑的映射表)會自引用。找到inode表中對應的條目。(暫且把inode表中inode号和其對應的塊資訊成為條目)
- inode表中對應的資訊指向根目錄對應的塊,其中有var目錄對應的資訊和inode号。
- 系統根據var目錄inode号回頭找到inode表中var目錄其對應的條目。
- 根據var目錄對應的塊資訊找到對應的塊,其中有log目錄對應的資訊和inode号。
- 系統又根據log目錄inode号在inode表中找到其對應的條目。
- 根據log目錄對應的塊資訊找到對應的塊,其中有messages檔案。
- 根據messages檔案的inode号在inode表中找到其對應的條目。
- 最後系統根據messages對應的條目資訊告訴我們messages檔案對應了多少的塊,最後給我們呈現的就是所看到的資料。
建立
- 首先掃描inode位圖,找空閑的inode号,找到之後占用。
- 根目錄自引用找到inode表中對應的條目,并根據條目找到對應的塊。
- 依據根目錄對應的塊中backup目錄對應的inode号,回頭找到inode表中條目。
- inode表中條目又找到對應的塊,在這個塊的dentry中建立了一個檔案test.txt。
- 然後在最開始掃描占用的inode号給到此test.txt檔案。
當要存資料給test.txt檔案時,會進行如下:
系統掃描塊位圖(加速查找磁盤空閑塊,記錄是否空閑等),找到空閑塊,配置設定大于資料大小的塊,最後再回收(避免磁盤碎片)。比如要建立10k大小的test.txt檔案,一個塊4k,隻需要3個塊,系統配置設定4個或者多于,最後再去把這多餘的塊配置設定到空閑塊中等待使用。
删除
當要删除一個檔案時,其實就是把其使用的block位圖示記為空閑,inode位圖的相關位置成空,相當于不被占用,系統就認為此檔案删除。但是資料還在,在下次建立檔案時,就可覆寫原已清空block位圖和inode位圖的檔案的資料。
檔案粉粹也隻是使用一些随機資料填充進原來檔案的資料塊中,導緻檔案難以恢複。
原文連結:https://www.cnblogs.com/whych/p/9315723.html