文件系統的核心功能就是實現對磁盤空間的管理,要知道哪些空間可以用,哪些空間不可以用。
基于固定功能區典型文件系統: Linux ExtX
ExtX将磁盤劃分為等份的若幹區域,這個區域被稱為塊組,磁盤空間的管理以塊組為單位,以下是磁盤分區的布局圖(以4K邏輯塊大小為例),其中塊組0最複雜,其他的相似。
ext2磁盤布局
概念說明:
- 超級塊:存儲文件系統級别的信息,比如邏輯塊大小、挂載點等
- 塊組描述符表:ext文件系統每一個塊組信息使用32字節描述,這32個字節稱為塊組描述符,所有塊組的塊組描述符組成塊組描述符表GDT(group descriptor table)。假如block大小為4KB的文件系統劃分了143個塊組,每個塊組描述符32字節,那麼GDT就需要143*32=4576字節即兩個block來存放。
- 預留GDT塊:保留GDT用于以後擴容文件系統使用,防止擴容後塊組太多,使得塊組描述符超出當前存儲GDT的blocks。
- inode:索引節點,即索引數據的節點,一個inode對應一個文件,通常每個塊組有若幹的inode,稱為inode表。
- 由于inode數量固定,且存儲形式固定,可以根據偏移給與編号,即ino_id。
- 位圖,包括數據塊位圖和inode位圖,用來描述對應資源的使用,0表示未使用,1表示已經使用。
我們使用如下命令可以創建并格式化一個文件系統:
brdd if=/dev/zero of=30m.file bs=1M count=30br
mkfs.ext2 30m.file -b 1K
然後使用dump2fs查看
Ext2 磁盤布局實例-1
如果塊大小為4K,那麼有如下塊組:
Ext2磁盤布局實例-2
原因:ExtX使用邏輯塊存儲數據位圖,當block = 1K時,對應的數據塊位圖可以管理1024 * 8個數據塊,即1024[一個block的size] * (1024 * 8) [block的數量]= 8M的空間,30M就需要4個塊組;當block = 4K時,對應的數據塊位圖可以管理4 * 1024 * 8個數據塊,即(4 * 1024) * (4 * 1028 *8) = 128M, 因此一個塊組就可以。
基于非固定功能區基于固定功能區的 磁盤空間管理布局空間智能清晰,便于手動進行丢失數據恢複,但是也容易出現資源不足的情況,比如海量小文件場景。
非固定功能區的磁盤空間管理也分為數據和元數據,但是元數據和數據的區域非固定,随着文件系統對資源的需求而動态分配,典型有XFS和NTFS。
XFS文件系統将磁盤劃分為等份的區域,稱為分配組(AG),XFS對每個分配組進行獨立管理,AG的容量可以很大,最大可以達到1TB。
xfs磁盤布局
概念說明:
XFS文件系統通過兩個B 樹來追蹤空閑空間,一個是基于塊編号索引,另一個是基于空閑塊的大小索引。
- AGF(AG Free Space Block):磁盤空間管理通過兩個B 樹來實現,一個B 樹通過塊的編号來管理,一個B 樹通過剩餘塊的大小來管理,通過兩個不同的B 樹實現對剩餘空間的快速查找。
- AGI(AG Inode Management):通過一個B 樹管理inode,将64個inode(默認大小是256字節)打包為一個塊(chunk),改塊作為B 樹的一個葉子節點。inode的位置不固定,其編号分為相對inode編号和絕對inode編号兩種。相對inode編号是指針對AG的編号,絕對inode編号是在整個文件系統中的編号。
- AGFL(AG Free List):包含了在AG空間内一個存放指向預留空間的塊指針的數組。這個空間不能用于任何類型的用戶數據。
前面的磁盤布局方式都是原地修改,在随機IO比較多的情況下,不太适合SS設備,基于數據追加的磁盤布局方式,對數據的變更并非在原地修改,而是追加寫的方式寫到後面的剩餘空間,将随機寫轉化為順序寫。比如NILFS2。
NILFS2将磁盤劃分為若幹的Segment,Segment默認大小是8M。
NILFS2磁盤布局
NILFS2将文件分為若幹類,分别是常規文件、目錄文件、鍊接文件和元數據文件。而元數據文件包括:
- inode文件(ifile):存儲inode
- 檢查點文件(cpfile):存儲檢查點
- 段使用文件(sufile):存儲段的使用狀态
- 數據地址轉換文件(DAT):虛拟塊号和常規塊号的映射