首先請讀者思考一個問題:Linux系統下面這麼多的文件是如何來管理的?新建一個文件都是經歷了什麼樣的過程?
1.Ext文件系統的特點
1).文件系統的特點
權限與屬性放置到inode中,至於實際數據則放置到data block塊中。還有一個超級塊super block會記錄整個文件系統的整體信息,包括inode與block的總量、使用量、剩餘量等;
- super block:記錄此文件系統的整體信息,包括inode/block的總量、使用量、剩餘量以及文件系統的格式與相關信息等;
- inode:記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的block號碼;
- block:實際記錄文件的內容,若文件太大時,會佔用多個block;
2).Ext2文件系統
inode與block的大小是在一開始就規劃好的,除非重新格式,否則inode與block固定後就不再變動;
對於文件系統動則上百G,那麼將所有的inode與block放置在一起不容易管理,因此Ext2文件系統在格式化的時候基本上是區分爲多個塊組(block group)的,每個塊組都有獨立的inode/block/super block系統;
2.Ext的組成
1).data block(數據塊)
data bloc是用來放置文件內容的地方,在Ext2文件系統中所支持的block大小有1KB、2KB及4KB三種。在格式化時block的大小就固定了,且每個block都有編號,以方便inode記錄;
Ext2文件系統的block有以下限制:
- 原則上,block的大小與數量在格式化完就不能夠再改變了;
- 每個block內最多隻能夠放置一個文件的數據;
- 如果文件大於block的大小,則一個文件會佔用多個block數量;
- 若文件小於block,則該block的剩餘空間就不能夠再被使用了;
2).inode table(inode表格)
inode的內容主要記錄文件的屬性以及該文件實際數據是放置在哪幾號block;
- 每個inode大小均固定爲128bytes;
- 每個文件都僅會佔用一個inode而已;
- 系統讀取文件時需要先找到inode,並分析inode所記錄的權限與用戶是否符合,若符合才能夠開始實際讀取block的內容;
inode要記錄的數據非常多,但inode的大小僅僅只有128bytes,而inode記錄一個block號碼要花掉4bytes,假設一個文件有400M且每個block爲4KB,那麼至少也在10萬條block號碼的記錄,inode哪能記錄這麼多信息呢,inode空間也不夠啊;
inode記錄block號碼的區域定義爲12個直接、一個間接、一個雙間接與一個三間接記錄;所謂間接就是拿一個block來當作記錄block號碼的記錄區;
假設每個block的大小爲1KB;
12個直接:12 x 1=12K;
一個間接:256 x 1K=256K; 256=1KB(一個block) / 4byte(記錄一個block索引需要花費的大小)
一個雙間接:256 x 256 x 1KB=256^2K
一個三間接:256 x 256 x 256 x 1KB=256^3K
總共加起來爲:16GB;所以當文件系統block格式化爲1K大小時,能夠容納的最大文件爲16GB;
3).superblock(超級塊)
superblock是記錄整個文件系統相關信息的地方,沒有superblock,就沒有這個文件系統了。它主要記錄的信息有:
- block與inode的總量;
- 未使用與已使用的inode/block數量;
- block與inode的大小(block爲1K,2K,4K,inode爲128bytes);
- superblock的大小爲1024bytes;
4).File system Description(文件系統描述說明)
這個區段可以描述每個block group的開始與結束的block號碼,以及說明每個區段分別介於哪一個block號碼之間。
5). block bitmap(塊對照表)
添加文件時怎麼知道哪個block是空的,需要通過block bitmap來輔助,從block bitmap當中可以知道哪個block是空的;
6).inode bitmap(inode對照表)
這個其它與block bitmap是類似的功能,只是block bitmap記錄的是使用與未使用的block號碼,至於inode bitmap則是記錄使用與未使用的inode 號碼;
3.Ext2/Ext2日誌文件系統的功能
1).創建文件的流程
Ext2是如何處理創建文件的呢?
1.先確定用戶對於添加文件的目錄是否具有w與x的權限,若有的話才能添加;
2.根據inode bitmap找到沒有使用的inode號碼,並將新文件的權限/屬性寫入;
3.根據block bitmap找到沒有使用中的block號碼,並將實際的數據寫入block中,且更新inode的block指向數據;
4.將剛纔寫入的inode與block數據同步更新inode bitmap與block bitmap,並更新superblock的內容;
2).數據的不一致狀態
如果上述的創建文件在第4步時,因停電、內核錯誤等原因導致寫入inode bitmap與block bitmap沒有執行,就導致bitmap與實際數據存放區產生不一致的情況了;
3).日誌文件系統
爲解決上述問題,在文件系統當中規劃出一個塊,該塊專門記錄寫入或修訂文件時的步驟;
- 預備:當系統要寫入一個文件時,會先在日誌記錄塊中記錄某個文件準備要寫入的信息;
- 實際寫入:開始寫入文件的權限與數據;開始更新bitmap及super block數據;
- 結束:完成數據與新bitmap及super bloc的更新後,在日誌記錄塊當中完成該文件的記錄;
參考資料:鳥哥的Linux私房菜