ext4文件系统布局
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字節。而對于其他的備份塊則直接保存在對應塊組的起始位置處。
根據這個關系,就可以找到對應的超級塊以及備份塊:
| 0 | 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的個數。
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
總結
以上是生活随笔為你收集整理的ext4文件系统布局的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中的长度单位详解(dp、s
- 下一篇: UDP 协议格式