ext4檔案系統塊組
ext4中的資料是按照塊組進行管理的,一個塊組來中包含有多個塊。其中有1個塊用于儲存資料塊位圖,是以位圖中包含有多少個bit就決定了塊組中塊的個數。
比如,對于一個塊大小為4096Byte的裝置,塊位圖中的比特位數為32768(4096 * 8),那麼單個塊組中最大就隻能具有32768(4096 * 8)個塊。那麼也可以計算出單個塊組的大小為32768*4096=128MB。
塊組的結構布局如下所示:

超級塊
ext4超級塊(super block)記錄了檔案系統的很多關鍵資訊,如果一個檔案系統中隻存在一個超級塊,那麼如果超級塊損壞将導緻整個檔案系統的損壞,是以整個塊裝置上存在很多超級塊的備份,
對于超級塊的備份,如果每個塊組中都備份一個,又會占據太多的檔案系統空間,ext4中支援 sparse_super 特性,如果打開該特性,超級塊将隻在特定的塊組中備份,它的備份塊需要滿足如下規定:
- 塊組0
- 塊組的組ID為3、5、7的幂
需要注意的是,塊組0是一個特殊的塊組,它的最前面1024位元組是預留給boot sector使用的,是以super block的起始位置需要跳過塊組0的前1024位元組。而對于其他的備份塊則直接儲存在對應塊組的起始位置處。
根據這個關系,就可以找到對應的超級塊以及備份塊:
塊組id | 第N塊 |
---|---|
0(前面需要跳過1024byte) | |
1(3^0) | 32768 |
3(3^1) | 32768*3 |
5(5^0) | 32768*5 |
7(7^0) | 32768*7 |
9(3^2) | 32768*9 |
… | … |
作為測試,可以把對應的super block dump出來:
dd if=/dev/sda1 of=sb0.txt bs=4096 count=1
dd if=/dev/sda1 of=sb1.txt bs=4096 count=1 skip=32768
dd if=/dev/sda1 of=sb2.txt bs=4096 count=1 skip=98304
檢視第0号塊組中的super block,可以發現它确實是從1024位元組之後開始的:
而第1号塊組中的備份超級塊(backup super block),直接就是從該塊組的起始位置開始:
inode
ext4檔案系統中,inode也是在塊組中進行管理的,塊組中存在1個塊用于儲存inode位圖和多個塊用于儲存inode表。塊組大小的計算類似,對于塊大小為4096Byte的檔案系統,inode位圖的比特位最大是32768(40968),
那麼也就說明該塊組中最大隻能申請32768個inode,塊組中最大管理檔案個數也就是32768個。單個inode占用大小為256Byte,那麼inode表最大占用32768256=8M空間,轉換為塊個數為2048個。
實際上對于一個塊組來說,按照最大限制來預留inode是沒有必要的,因為我們一個塊組128M,如果分成32768個檔案,相當于平均單個檔案才4K,這種情況還是比較少見的,是以可以少配置設定一些空間給inode表,這樣就能節省空間。
是以正常在建立檔案系統時,會傳入參數到mkfs.ext4中的-i選項來設定單個檔案占用的空間預計為多少,工具會根據檔案size設定來确定inode的個數。
# dumpe2fs test.image | grep -i inode
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Inode count: 65536
Free inodes: 65525
Inodes per group: 8192
Inode blocks per group: 512
First inode: 11
Inode size: 256
Journal inode: 8
Journal backup: inode blocks
flex_bg
前面介紹的是經典ext4檔案系統布局,ext4還引入了flex_bg的特性,就是把多個塊組放在一起管理,簡單來講,就是把多個塊組的block bitmap聚合在一起,inode bitmap聚合在一起,inode table 也聚合在一起,形成一個更大的邏輯塊組。它的好處就是能夠充分發揮核心預讀取的作用,減少了inode零散分布帶來的查找開銷,提升了檔案系統性能。一般使用mkfs.ext4工具建立檔案系統時預設都是開着該選項的。
參考文檔:
https://bean-li.github.io/EXT4-packet-meta-blocks/
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout