EXWOLF討論區's Archiver

wolf 發表於 2008-1-6 21:46

JFS 文件係統概述及布局分析(五)

塊分配映射表
塊分配映射表用來為整個聚集跟蹤分配或釋放的磁盤塊。由於聚集內所有的文件集共享相同的磁盤塊池,在分配或釋放磁盤塊時,聚集內所有的文件集可使用該分配映射表。  
塊分配映射表本身是聚集inode2描述的文件。當初始創建聚集時,分配包括聚集空間的映射表數據塊。映射表將隨著聚集的擴充或緊縮而相應動態地增大或縮小。  
塊分配映射表跟蹤是否每個個別的聚集塊被分配還是釋放。

映射表的每頁長度為4K。映射表包含三種類型的頁:bmap控制頁、dmap控制頁和dmap頁。

每個dmap包含表示每個聚集塊的一位。第i位表示第i個邏輯聚集塊的分配狀態。它由structdmap_t的jfs_dmap.h文件定義。每個dmap頁包括8K的聚集塊。

因為塊分配映射表可能有許多dmap頁,它們由dmap控制頁組織。這些頁改進了查找空閒塊的大盤區的性能。聚集的大小將決定需要多少頁和多少層。至多有三層,它允許的聚集塊的最大尺寸是2(43)。如果不是所有層都需要,塊映射表inode是每個沒有使用層的第一頁有“洞”的稀疏文件。 [color=#f5fafe][/color]
JFS使用提交策略確保控制數據可靠更新。可靠更新意味著一旦係統出錯時,要維持一致的JFS結構和資源分配狀態。為了保證塊分配映射表是一致狀態,JFS維護dmap結構中的兩張映射表,工作映射表和持續映射表。工作映射表記錄當前分配狀態。持續映射表記錄提交的分配狀態,由磁盤上找到的或 JFS日志或提交的JFS事務內的記錄描述的分配狀態組成。當釋放聚集塊時,首先更新永久映射表。當分配聚集塊時,首先更新工作映射表。位值為0表示空閒資源,值為1表示已分配資源。

塊分配映射表的dmap控制頁包含與dmap結構中樹相似的樹,除葉層包含1024個元素外。dmap控制頁由structdmapctl_t定義。可在jfs_dmap.h.文件中找到它。

要注意,dmap結構中的這一字段是一個平面數組,但它表示圖中顯示的樹。樹跟蹤除最底層之外的每層上連續塊的最大號。樹的最底層,從樹[85]到樹[341],包含下面描述的工作映射表的二進制搭檔表示法。樹的其它層包含來自下一較低層的四個部分的最大數目相連空閒塊。
Www.
二進制搭檔係統用來完成每個摘要樹的葉層。通過首先為位圖的每個字獲得空閒位的最長二進制搭檔字符串而形成dmap結構的樹。字符以2的冪編碼,-1用來表示已分配全部。
Www.
然後,使用二進制搭檔係統完成樹的葉。通過取得從指定索引開始、只包括其以2的冪顯示的搭檔的最大數目空閒塊,可形成此樹。

請注意,只有完全空閒的字才與其完全空閒的搭檔組合。組合時,最右搭檔變成-1,以指示它由另一項所表示。

塊分配映射表的dmap控制頁包含與dmap結構中樹相似的樹,除葉層包含1024個元素外。這些元素是樹[0]為緊跟下面的1024個映射表頁的二進制搭檔表示法。對於L0頁,它是接下來的1024個dmap頁,對於L1頁,它是接下來的1024個L0頁,而對於L2頁,它是接下來1024個L1 頁。

在塊分配映射表的頂部,有映射表控制結構structdbmap_t。該結構包含摘要信息,能加快查找比平均空閒空間多的AG。可在jfs_dmap.h中找到該結構。
Www.
塊分配映射表沒有記日志:它能在恢復期間由logredo修復,或者由fsck重構。在fsck或logredo後工作和持續映射表,都必需是相同狀態。 [color=#f5fafe][/color]
擴展聚集以增大文件係統 [color=#f5fafe][/color]
要擴展聚集,JFS必須確保有足夠的頁存儲塊分配映射表,索引聚集新擴展的塊。通常,從現有的聚集分配空間給新增的頁,但是如果該聚集空間已滿,那就不可能了。所以我們需要解決這種特殊情況。

要解決該問題,通常JFS為塊分配映射表分配的空間多於索引聚集地址空間所需的空間。每個映射表都有額外頁空間用於存放位圖,如果該頁指向另一層摘要樹,則該映射表就需額外頁存放所需的摘要信息。這種額外空間使得JFS可以在必要時將聚集分為更小的單位,以擴大聚集至所需的大小。擴展聚集,需採取以下步驟:

如果現有聚集的空間足以擴展塊分配映射表,使其能索引新聚集的所有塊,那么,JFS不做任何特殊處理,將聚集擴展至整個空間。僅當需要考慮聚集將來的擴展時,塊分配映射表才需增加額外頁。 [color=#f5fafe][/color]
如果沒有足夠空間擴展,那么JFS僅給聚集擴展塊分配映射表中已有額外頁所能尋址的塊。 [color=#f5fafe][/color]
至此,JFS有一些額外的聚集塊未在聚集中使用到。JFS可以用這些聚集塊擴大塊分配映射表,以繼續將聚集擴展至所需大小。JFS必須謹記將這些額外頁放入塊分配映射表中。 [color=#f5fafe][/color]
這個處理過程完全由vfs_cntl()處理,對係統的其它部分隱藏。 [color=#f5fafe][/color]
另一種表示法:二進制編碼搭檔表示法

塊分配映射表也可以用二進制編碼搭檔係統表示。除了樹的葉結點和dmap結構不同外,這種表示法的邏輯和物理結構與前一種一樣。

structdmap定義塊分配映射表的最下層。每個dmap頁包括8K的聚集塊。
  

[table=95%][tr][td][color=#ff0000]以下為引用的內容:[/color]
  /*
  *dmapsummarytree
  *
  *dmaptree_tmustbeconsistentwithdmapctl_t.
  */
  typedefstruct{
  int32nleafs;/*4:numberoftreeleafs*/
  int32l2nleafs;/*4:l2numberoftreeleafs*/
  int32leafidx;/*4:indexoffirsttreeleaf*/
  int32height;/*4:heightofthetree*/
  int8budmin;/*1:minl2treeleafvaluetocombine*/
  int8stree[TREESIZE];/*TREESIZE:tree*/
  uint8pad[2];/*2:padtowordboundary*/
  }dmaptree_t;/*-360-*/
  
  
  /*
  *dmappageper8Kblocksbitmap

  */
  typedefstruct{
  int32nblocks;/*4:numblkscoveredbythisdmap*/
  int32nfree;/*4:numoffreeblksinthisdmap*/
  int64start;/*8:startingblknoforthisdmap*/
  dmaptree_ttree;/*360:dmaptree*/
  uint8pad[1672];/*1672:padto2048bytes*/
  uint32wmap[LPERDMAP];/*1024:bitsoftheworkingmap*/
  uint32pmap[LPERDMAP];/*1024:bitsofthepersistentmap*/
  }dmap_t;/*-4096-*/[/td][/tr][/table]
  
二進制編碼搭檔係統的每一項都有三個字段:type,size和bitmap。type字段表示塊空閒、已分配、用位圖表示或不由該字段表示(don'tcare)。如果類型是"don'tcare"則這些塊由左搭檔表示,size字段忽略。如果type是位圖,則位圖字段的32位和 32塊一一對應,表示其空閒或已分配。位值0表示空閒塊,1表示塊已分配。size是2的冪次方,表示該項描述的聚集塊的個數。  對於每個全空閒項,如果其相同大小的左搭檔也完全空閒,則右搭檔設為"don'tcare"類型,且右搭檔的空間合並入左搭檔。當分配塊時,僅當搭檔分配在同一盤區才合並。必須維護"don'tcare"類型,以便logredo修正映射表。

結構dmap包含一個摘要樹。其它每個映射層都包含一個摘要樹。摘要樹提高了查找空閒塊大盤區的性能。摘要信息足以判斷dmap頁是否有足夠的空閒位,這樣就無需查看dmap頁,從而可以避免無效搜索。 [color=#f5fafe][/color]
要注意,dmap結構中的這一字段是一個平面數組,但它表示圖中顯示的樹。樹的每一層都索引最大數目個相鄰的塊。樹的最底層,樹[21]至樹 [84],映射至工作映射表中的二進制編碼搭檔表示。樹的其它層包含來自下一較低層的四個部分的最大數目相連空閒塊。塊分配映射表的其它層可能有一個相似的樹,除了葉節點層有1024個元素。這些元素映射至樹[0]的二進制編碼搭檔表示,樹[0]指向後面的dmap頁。

如果要合並的四個都為"don'tcare"類型,則合並項大小標記為-1。這些項的搭檔項負責標記正確的狀態。  
inode分配

動態inode分配機制中,inode號不再直接映射至聚集中特定的邏輯磁盤塊,所以要支持下列三種操作,需要定義新的數據結構: [color=#f5fafe][/color]
正向查找:給定inode號,找到磁盤上的inode。文件查找是一種典型的正向查找。

反向查找:給定分區磁盤號(更確定,則給定分配組號),查找鄰近的空閒i-結點。分配新inode就屬於這種情況,JFS盡量查找物理上鄰近所選分配組的inode(以便,例如,同一子目錄的文件其inode都是相鄰的)。

空閒inode號查找:要分配新的inode盤區,先要找到32個相鄰的、未分配給相應inode盤區的inode。當所有已分配的inode都在使用,或當JFS需要給分配組分配inode但以前從未分配過inode時,或當一個分配組中沒有空閒inode時,需要分配新的inode盤區。 [color=#f5fafe][/color]
注意動態inode分配的一種微妙效應:相鄰inode號在磁盤上未必相鄰:inodeN+32可以和inodeN相隔任意遠。然而,相隔很遠的inode號在磁盤上可以是緊鄰的;所以,inodeN+K和inodeN緊鄰在理論上是可能的(即使K>1) [color=#f5fafe][/color]
inode分配映射表 [color=#f5fafe][/color]
inode分配映射表解決正向查找問題。聚集和每個文件集都有一個inode分配映射表,該表是一個IAG(inode分配組)的數組。IAG是 inode分配映射表的數據。對於聚集,inode分配映射表映射的inode也稱為聚集inode表。對於文件集,inode分配映射表映射的 inode也稱為文件inode表。

每個IAG大小為4K,描述磁盤上128個物理inode盤區。由於每個inode盤區包含32個inode,所以每個IAG描述4096個 inode。IAG可以位於聚集的任意位置。IAG的所有inode盤區位於一個分配組,由此IAG和AG綁定在一起直至釋放所有的inode盤區。任意 AG可以分配空間給一個inode盤區,然後該IAG就與那個AG綁定。IAG由structiag_t定義(見jfs_imap.h)。 [color=#f5fafe][/color]

[table=95%][tr][td][color=#ff0000]以下為引用的內容:[/color]
  /*
  *inodeallocationgrouppage(per4096inodesofanAG)
  */
  typedefstruct{
  int64agstart;/*8:startingblockofag*/
  int32iagnum;/*4:inodeallocationgroupnumber*/
  int32inofreefwd;/*4:aginodefreelistforward*/
  int32inofreeback;/*4:aginodefreelistback*/
  int32extfreefwd;/*4:aginodeextentfreelistforward*/
  int32extfreeback;/*4:aginodeextentfreelistback*/
  int32iagfree;/*4:iagfreelist*/
  
  /*summarymap:1bitperinodeextent*/
  int32inosmap[SMAPSZ];/*16:summapofmapwordsw/freeinodes;
  *note:thisindicatesfreeandbacked
  *inodes,iftheextentisnotbackedthe 中國

  *valuewillbe1.iftheextentis
  *backedbutallinodesarebeingusedthe
  *valuewillbe1.iftheextentis
  *backedbutatleastoneoftheinodesis
  *freethevaluewillbe0.
  */
  int32extsmap[SMAPSZ];/*16:summapofmapwordsw/freeextents*/
  int32nfreeinos;/*4:numberoffreeinodes*/
  int32nfreeexts;/*4:numberoffreeextents*/
  /*(72)*/
  uint8pad[1976];/*1976:padto2048bytes*/
  /*allocationbitmap:1bitperinode(0-free,1-allocated)*/
  uint32wmap[EXTSPERIAG];/*512:workingallocationmap*/
  uint32pmap[EXTSPERIAG];/*512:persistentallocationmap*/
  pxd_tinoext[EXTSPERIAG];/*1024:inodeextentaddresses*/
  }iag_t;/*(4096)*/[/td][/tr][/table]
inode分配映射表最前面4k大小的頁是控制頁。該頁包含inode分配映射表的摘要信息。dinomap_t結構的定義見jfs_imap.h。

邏輯上,inode分配映射表是動態可擴展的IAG結構的數組:

structiaginode_allocation_map[1..N]; [color=#f5fafe][/color]
物理上,inode分配映射表本身是聚集內的一個文件。聚集inode分配映射表由聚集self-node描述。文件集inode分配映射表由文件集inode描述。頁空間的分配和釋放依據B+樹索引需要進行。B+樹的鍵是IAG頁的字節偏移量。 [color=#f5fafe][/color]
JFS使用提交策略確保控制數據可靠更新。可靠更新意味著一旦係統出錯時,要維持一致的JFS結構和資源分配狀態。為確保inode分配映射表的一致性,每個IAG都同時維護兩個映射表,工作映射表和持續映射表。工作映射表記錄當前分配狀態。持續磁盤記錄遞交的分配狀態,包括磁盤上記錄的分配狀態或是JFS日志中提交的JFS事務記錄描述的分配狀態。  
映射表中的每一位記錄相應inode是空閒還是已分配的。位值0表示inode空閒,1表示inode已分配。IAG的每一個控制區內都有一個摘要映射表,用以提高查找空閒inode的性能。摘要映射表映射到IAG的工作位圖。摘要映射表使用一位映射工作映射表的相鄰32位。每一位表示相應的 inode可用(0),或相應的inode不可用(1)。(如果沒有已分配的盤區,那么該inode摘要映射位為1,表明沒有可用的inode,) [color=#f5fafe][/color]
IAG還包含inode盤區描述符,該描述符描述相應的inode盤區。每個IAG有128個描述符。IAG的每個控制區內都有一個摘要映射表,用於改進空閒inode盤區查找的性能。摘要映射表用一位映射一個inode盤區。0表示空閒的inode盤區,1表示已分配的inode盤區。

如果給定inode號,用inode分配映射表,通過以下步驟,可以找到inode的物理位置:  
1、找到描述該inode的IAG。需要找到inode分配映射表在B+樹中的鍵(字節偏移量)。

iagkey=((Inodenumber/Inodesperiag)*Inodesperiag)+4096(EQ1) [color=#f5fafe]Www.[/color]
2、查找已找到的IAG中引用的inode。這可用於在IAG工作映射表和持續映射表中索引。  
iaginodeindex=(Inodenumber)mod(Inodesperiag)(EQ2)

3、查找IAG中的inode盤區描述符,該描述符描述包含指定inode的inode盤區。 [color=#f5fafe][/color]
inodeextentdescriptor=(iaginodeindex)/(Inodeperinodeextent)(EQ3) [color=#f5fafe][/color]
4、要找的inode位於找到的inode盤區內、適當的偏移量處。  
inodeoffset=((iaginodeindex)mod(Inodesperinodeextent)  
*sizeofdinode)(EQ4) [color=#f5fafe][/color]
inode分配映射表本身由聚集inode表中文件集的分配映射表inode描述。

通過前面介紹的公式,將inode號,#9157,轉換成一個偏移量:
  

[table=95%][tr][td][color=#ff0000]以下為引用的內容:[/color]
  iagkey=((inum/num_inodes_per_iag)*(num_inodes_per_iag))+4096
  =((9157/4096)*4096)+4096
  =12288
  iaginodeindex=inummodnum_inodes_per_iag
  =(9157mod4096)
  =965
  inodeextentdescriptor=iag_inode_index/num_inodes_per_extent
  =965/32
  =30
  inodeoffset=(iag_inode_indexmodnum_inodes_per_extent)
  *sizeofdinode
  =(965mod32)*512
  =5*512
  =2560[/td][/tr][/table]
  
為簡化JFS維護命令,及便於理解布局策略的動態性,inode分配映射文件盤區的大小總為4KB。
當新文件集創建時,必須分配一個IAG以及第一個inode盤區,以處理文件集的元數據文件。(即,保留的inode和根目錄inode)。

AG空閒inode列表

AG空閒inode列表解決反向查找問題。為減少擴展和縮減聚集的係統開銷,JFS設定每個聚集允許的最大AG數。所以,AG空閒inode列表頭的個數是固定的。列表頭在inode分配映射表的控制頁中。表的第i項是一個雙向列表的頭,表的第i項是一個雙向列表的頭,該雙向列表是第i個AG中的所有包含空閒inode的inode分配映射表項(IAG)的集合。IAG號作為列表索引。-1表示列表尾。每個IAG控制區都包含指向該列表的正向和反向指針。 [color=#f5fafe][/color]
AG列表從表頭開始插入。當分配新的inode盤區,或當因盤區佔滿而刪除一個inode時,會有插入操作。當一個IAG所有的inode盤區都滿時,從列表中刪除該IAG。
中國
注意AG3中的IAG沒有任何相應的inode盤區可供分配。所以,這些inode未在AG空閒inode列表中表示。  
此表沒有記日志;但可以在恢復時由logredo恢復,或由fsck重建。AG空閒列表結構定義是structdinomap_t,見jfs_imap.h文件。

頁: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.