天天看點

ext4檔案系統布局

ext4檔案系統塊組

ext4中的資料是按照塊組進行管理的,一個塊組來中包含有多個塊。其中有1個塊用于儲存資料塊位圖,是以位圖中包含有多少個bit就決定了塊組中塊的個數。

比如,對于一個塊大小為4096Byte的裝置,塊位圖中的比特位數為32768(4096 * 8),那麼單個塊組中最大就隻能具有32768(4096 * 8)個塊。那麼也可以計算出單個塊組的大小為32768*4096=128MB。

塊組的結構布局如下所示:

ext4檔案系統布局

超級塊

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位元組之後開始的:

ext4檔案系統布局

而第1号塊組中的備份超級塊(backup super block),直接就是從該塊組的起始位置開始:

ext4檔案系統布局

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