首先請讀者思考一個問題:Linux系統下面這麼多的文件是如何來管理的?新建一個文件都是經歷了什麼樣的過程?node
權限與屬性放置到inode中,至於實際數據則放置到data block塊中。還有一個超級塊super block會記錄整個文件系統的總體信息,包括inode與block的總量、使用量、剩餘量等;ide
inode與block的大小是在一開始就規劃好的,除非從新格式,不然inode與block固定後就再也不變更;
對於文件系統動則上百G,那麼將全部的inode與block放置在一塊兒不容易管理,所以Ext2文件系統在格式化的時候基本上是區分爲多個塊組(block group)的,每一個塊組都有獨立的inode/block/super block系統;日誌
data bloc是用來放置文件內容的地方,在Ext2文件系統中所支持的block大小有1KB、2KB及4KB三種。在格式化時block的大小就固定了,且每一個block都有編號,以方便inode記錄;
Ext2文件系統的block有如下限制:blog
inode的內容主要記錄文件的屬性以及該文件實際數據是放置在哪幾號block;索引
inode要記錄的數據很是多,但inode的大小僅僅只有128bytes,而inode記錄一個block號碼要花掉4bytes,假設一個文件有400M且每一個block爲4KB,那麼至少也在10萬條block號碼的記錄,inode哪能記錄這麼多信息呢,inode空間也不夠啊;
inode記錄block號碼的區域定義爲12個直接、一個間接、一個雙間接與一個三間接記錄;所謂間接就是拿一個block來看成記錄block號碼的記錄區;ip
假設每一個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;同步
superblock是記錄整個文件系統相關信息的地方,沒有superblock,就沒有這個文件系統了。它主要記錄的信息有:it
這個區段能夠描述每一個block group的開始與結束的block號碼,以及說明每一個區段分別介於哪個block號碼之間。io
添加文件時怎麼知道哪一個block是空的,須要經過block bitmap來輔助,從block bitmap當中能夠知道哪一個block是空的;table
這個其它與block bitmap是相似的功能,只是block bitmap記錄的是使用與未使用的block號碼,至於inode bitmap則是記錄使用與未使用的inode 號碼;
Ext2是如何處理建立文件的呢?
1.先肯定用戶對於添加文件的目錄是否具備w與x的權限,如有的話才能添加;
2.根據inode bitmap找到沒有使用的inode號碼,並將新文件的權限/屬性寫入;
3.根據block bitmap找到沒有使用中的block號碼,並將實際的數據寫入block中,且更新inode的block指向數據;
4.將剛纔寫入的inode與block數據同步更新inode bitmap與block bitmap,並更新superblock的內容;
若是上述的建立文件在第4步時,因停電、內核錯誤等緣由致使寫入inode bitmap與block bitmap沒有執行,就致使bitmap與實際數據存放區產生不一致的狀況了;
爲解決上述問題,在文件系統當中規劃出一個塊,該塊專門記錄寫入或修訂文件時的步驟;
參考資料:鳥哥的Linux私房菜