文件系統(tǒng)的核心功能就是實(shí)現(xiàn)對(duì)磁盤(pán)空間的管理,要知道哪些空間可以用,哪些空間不可以用。
基于固定功能區(qū)
典型文件系統(tǒng): Linux ExtX
ExtX將磁盤(pán)劃分為等份的若干區(qū)域,這個(gè)區(qū)域被稱(chēng)為塊組,磁盤(pán)空間的管理以塊組為單位,以下是磁盤(pán)分區(qū)的布局圖(以4K邏輯塊大小為例),其中塊組0最復(fù)雜,其他的相似。

概念說(shuō)明:
超級(jí)塊:存儲(chǔ)文件系統(tǒng)級(jí)別的信息,比如邏輯塊大小、掛載點(diǎn)等
塊組描述符表:ext文件系統(tǒng)每一個(gè)塊組信息使用32字節(jié)描述,這32個(gè)字節(jié)稱(chēng)為塊組描述符,所有塊組的塊組描述符組成塊組描述符表GDT(group descriptor table)。假如block大小為4KB的文件系統(tǒng)劃分了143個(gè)塊組,每個(gè)塊組描述符32字節(jié),那么GDT就需要143*32=4576字節(jié)即兩個(gè)block來(lái)存放。
預(yù)留GDT塊:保留GDT用于以后擴(kuò)容文件系統(tǒng)使用,防止擴(kuò)容后塊組太多,使得塊組描述符超出當(dāng)前存儲(chǔ)GDT的blocks。
-
inode:索引節(jié)點(diǎn),即索引數(shù)據(jù)的節(jié)點(diǎn),一個(gè)inode對(duì)應(yīng)一個(gè)文件,通常每個(gè)塊組有若干的inode,稱(chēng)為inode表。
- 由于inode數(shù)量固定,且存儲(chǔ)形式固定,可以根據(jù)偏移給與編號(hào),即ino_id。
位圖,包括數(shù)據(jù)塊位圖和inode位圖,用來(lái)描述對(duì)應(yīng)資源的使用,0表示未使用,1表示已經(jīng)使用。
我們使用如下命令可以創(chuàng)建并格式化一個(gè)文件系統(tǒng):
dd if=/dev/zero of=30m.file bs=1M count=30
mkfs.ext2 30m.file -b 1K
然后使用dump2fs查看

如果塊大小為4K,那么有如下塊組:

原因:ExtX使用邏輯塊存儲(chǔ)數(shù)據(jù)位圖,當(dāng)block = 1K時(shí),對(duì)應(yīng)的數(shù)據(jù)塊位圖可以管理1024 * 8個(gè)數(shù)據(jù)塊,即1024[一個(gè)block的size] * (1024 * 8) [block的數(shù)量]= 8M的空間,30M就需要4個(gè)塊組;當(dāng)block = 4K時(shí),對(duì)應(yīng)的數(shù)據(jù)塊位圖可以管理4 * 1024 * 8個(gè)數(shù)據(jù)塊,即(4 * 1024) * (4 * 1028 *8) = 128M, 因此一個(gè)塊組就可以。
基于非固定功能區(qū)
基于固定功能區(qū)的 磁盤(pán)空間管理布局空間智能清晰,便于手動(dòng)進(jìn)行丟失數(shù)據(jù)恢復(fù),但是也容易出現(xiàn)資源不足的情況,比如海量小文件場(chǎng)景。
非固定功能區(qū)的磁盤(pán)空間管理也分為數(shù)據(jù)和元數(shù)據(jù),但是元數(shù)據(jù)和數(shù)據(jù)的區(qū)域非固定,隨著文件系統(tǒng)對(duì)資源的需求而動(dòng)態(tài)分配,典型有XFS和NTFS。
XFS文件系統(tǒng)將磁盤(pán)劃分為等份的區(qū)域,稱(chēng)為分配組(AG),XFS對(duì)每個(gè)分配組進(jìn)行獨(dú)立管理,AG的容量可以很大,最大可以達(dá)到1TB。

概念說(shuō)明:
XFS文件系統(tǒng)通過(guò)兩個(gè)B+樹(shù)來(lái)追蹤空閑空間,一個(gè)是基于塊編號(hào)索引,另一個(gè)是基于空閑塊的大小索引。
AGF(AG Free Space Block):磁盤(pán)空間管理通過(guò)兩個(gè)B+樹(shù)來(lái)實(shí)現(xiàn),一個(gè)B+樹(shù)通過(guò)塊的編號(hào)來(lái)管理,一個(gè)B+樹(shù)通過(guò)剩余塊的大小來(lái)管理,通過(guò)兩個(gè)不同的B+樹(shù)實(shí)現(xiàn)對(duì)剩余空間的快速查找。
-
AGI(AG Inode Management):通過(guò)一個(gè)B+樹(shù)管理inode,將64個(gè)inode(默認(rèn)大小是256字節(jié))打包為一個(gè)塊(chunk),改塊作為B+樹(shù)的一個(gè)葉子節(jié)點(diǎn)。
- inode的位置不固定,其編號(hào)分為相對(duì)inode編號(hào)和絕對(duì)inode編號(hào)兩種。相對(duì)inode編號(hào)是指針對(duì)AG的編號(hào),絕對(duì)inode編號(hào)是在整個(gè)文件系統(tǒng)中的編號(hào)。

- AGFL(AG Free List):包含了在AG空間內(nèi)一個(gè)存放指向預(yù)留空間的塊指針的數(shù)組。這個(gè)空間不能用于任何類(lèi)型的用戶數(shù)據(jù)。
基于數(shù)據(jù)追加的磁盤(pán)空間管理
前面的磁盤(pán)布局方式都是原地修改,在隨機(jī)IO比較多的情況下,不太適合SS設(shè)備,基于數(shù)據(jù)追加的磁盤(pán)布局方式,對(duì)數(shù)據(jù)的變更并非在原地修改,而是追加寫(xiě)的方式寫(xiě)到后面的剩余空間,將隨機(jī)寫(xiě)轉(zhuǎn)化為順序?qū)?。比如NILFS2。
NILFS2將磁盤(pán)劃分為若干的Segment,Segment默認(rèn)大小事是8M。

NILFS2將文件分為若干類(lèi),分別是常規(guī)文件、目錄文件、鏈接文件和元數(shù)據(jù)文件。而元數(shù)據(jù)文件包括:
inode文件(ifile):存儲(chǔ)inode
檢查點(diǎn)文件(cpfile):存儲(chǔ)檢查點(diǎn)
段使用文件(sufile):存儲(chǔ)段的使用狀態(tài)
數(shù)據(jù)地址轉(zhuǎn)換文件(DAT):虛擬塊號(hào)和常規(guī)塊號(hào)的映射
磁盤(pán)布局情況:

參考文獻(xiàn):
https://blog.csdn.net/MyySophia/article/details/107946092
https://zhuanlan.zhihu.com/p/137906421?from_voters_page=true
《文件系統(tǒng)技術(shù)內(nèi)幕》