在進行建立檔案或者檔案resize過程中,需要有一個快捷入口,可以迅速的知道目前磁盤有哪些可用的(free狀态的)au,asm free space table 簡稱fst表就是提供一個這樣的功能,通過它可以快速的知道哪些allocation table(at表)中繼資料塊中有空閑的au,它存儲的是一個個的at表中繼資料塊的号碼,fst表用來加速au的配置設定,避免讀取已經完全被占用殆盡的at塊,造成配置設定空間效率的低下。
fst表技術上說其實是屬于at表的一部分,位于at表的塊1,fst表和at表都被稱為實體中繼資料,它們經常位于asm磁盤的固定的位置。
fst塊存儲在asm磁盤頭,通過kfed工具可以檢視磁盤頭的資訊,其中kfdhdb.fstlocn的值代表了fst塊位于磁盤頭的第幾個塊。例如下面的輸出代表了,fst塊位于磁盤頭的塊1,也就是au 0的第二個塊。(塊從0開始編号)。
$ kfed read /dev/sdc1 | grep kfdhdb.fstlocn
kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001
我們通過kfed工具檢視一下fst表的内容:
$ kfed read /dev/sdc1 blkn=1 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 2 ; 0x002: kfbtyp_freespc
...
kfdfsb.aunum: 0 ; 0x000: 0x00000000
kfdfsb.max: 254 ; 0x004: 0x00fe
kfdfsb.cnt: 254 ; 0x006: 0x00fe
kfdfsb.bound: 0 ; 0x008: 0x0000
kfdfsb.flag: 1 ; 0x00a: b=1
kfdfsb.ub1spare: 0 ; 0x00b: 0x00
kfdfsb.spare[0]: 0 ; 0x00c: 0x00000000
kfdfsb.spare[1]: 0 ; 0x010: 0x00000000
kfdfsb.spare[2]: 0 ; 0x014: 0x00000000
kfdfse[0].fse: 119 ; 0x018: free=0x7 frag=0x7
kfdfse[1].fse: 16 ; 0x019: free=0x0 frag=0x1
kfdfse[2].fse: 16 ; 0x01a: free=0x0 frag=0x1
kfdfse[3].fse: 16 ; 0x01b: free=0x0 frag=0x1
kfdfse[4037].fse: 0 ; 0xfdd: free=0x0 frag=0x0
kfdfse[4038].fse: 0 ; 0xfde: free=0x0 frag=0x0
kfdfse[4039].fse: 0 ; 0xfdf: free=0x0 frag=0x0
對于這個fst塊,第一個at表中繼資料塊位于au0:
這個fst塊最大數量的fst條目可以達到254個,雖然上面kfed的輸出中kfdfse[i]的編号到了4039,也就是有4039+1=4040個條目,但是有效條目隻有254個。
大的asm磁盤可能會有超過一個stride,asm磁盤頭的kfdhdb.mfact顯示了stride的大小(機關為au),每一個stride有它自己的實體中繼資料,這意味着會有它自己的fst表。
第二個stride的實體中繼資料位于這個stride的第一個au,我們通過kfed工具看一下:
$ kfed read /dev/sdc1 | grep mfact
kfdhdb.mfact: 113792 ; 0x0c0: 0x0001bc80
以上顯示了stride的大小為113792個au,由于au是從0開始編号,是以第一個stride最後的au号是au 113791,我們可以推算出第二個stride的fst位置是,au 113792的第一個塊:
$ kfed read /dev/sdc1 aun=113792 blkn=1 | grep type
如預期,我們在au 113792上有另一個fts表,如果我們還有其他的stride,同樣會在stride的開始au處有fst表。如下面所示,一個大的asm磁盤,會有數個stride,這裡展示了在第三個stride的開始處的fst表:
$ kfed read /dev/sdc1 aun=227584 blkn=1 | grep type
一般fst表位于每一個asm磁盤的au0的塊1,如果磁盤比較大,就會有不止一個stride,每一個stride都會有它自己的fst表。
<b>本文來自雲栖社群合作夥伴“dbgeek”</b>