首页 > *nix技术, 文件系统 > Xfs文件系统磁盘布局之四:AG空闲磁盘空间管理

Xfs文件系统磁盘布局之四:AG空闲磁盘空间管理

2012年1月1日 发表评论 阅读评论 6,545 次浏览

Xfs文件系统的AG空闲磁盘空间管理信息保存的位置紧接在AG超级块后面,其对应的数据结构体为xfs_agf_t,如下所示:

typedef struct xfs_agf {
	/*
	 * Common allocation group header information
	 */
	__be32		agf_magicnum;	/* magic number == XFS_AGF_MAGIC */
	__be32		agf_versionnum;	/* header version == XFS_AGF_VERSION */
	__be32		agf_seqno;	/* sequence # starting from 0 */
	__be32		agf_length;	/* size in blocks of a.g. */
	/*
	 * Freespace information
	 */
	__be32		agf_roots[XFS_BTNUM_AGF];	/* root blocks */
	__be32		agf_spare0;	/* spare field */
	__be32		agf_levels[XFS_BTNUM_AGF];	/* btree levels */
	__be32		agf_spare1;	/* spare field */
	__be32		agf_flfirst;	/* first freelist block's index */
	__be32		agf_fllast;	/* last freelist block's index */
	__be32		agf_flcount;	/* count of blocks in freelist */
	__be32		agf_freeblks;	/* total free blocks */
	__be32		agf_longest;	/* longest free space */
	__be32		agf_btreeblks;	/* # of blocks held in AGF btrees */
} xfs_agf_t;

Xfs文件系统使用两个B+tree来对空闲磁盘空间进行管理,而这两个B+tree又分别根据空闲block块号和空闲block块数(如果空闲block块数相等,则再按空闲block块号,都是升序)来对空闲磁盘进行跟踪,因此,结构体xfs_agf_t中最重要的两个字段也就分别是agf_roots和agf_levels,这两个字段都是数组,数组元素个数都为2,分别表示ABTB(对应0号元素)和ABTC(对应1号元素)的根节点(agf_roots)和树深度(agf_levels):

typedef enum {
	XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_BMAPi, XFS_BTNUM_INOi,
	XFS_BTNUM_MAX
} xfs_btnum_t;

#define	XFS_BTNUM_AGF	((int)XFS_BTNUM_CNTi + 1)

agf_roots[XFS_BTNUM_AGF];
agf_levels[XFS_BTNUM_AGF];

我们仍然先来看实例数据,这样便于理解和记忆:
[root@localhost xfsprogs]# ./db/xfs_db /dev/sdb1
xfs_db> agf 0
xfs_db> p
magicnum = 0x58414746
魔术数,即是‘XAGF’。
versionnum = 1
版本号,这里由宏XFS_AGF_VERSION定义,数值为1。
seqno = 0
agf的序号,第一块AG的agf序号为0,第二块AG的agf序号为1,……

xfs_db> agf 1
xfs_db> p seqno
seqno = 1
xfs_db> agf 2
xfs_db> p seqno
seqno = 2
xfs_db>

length = 262059
本AG内的block块数,前面提到过Xfs会把磁盘等分为多块AG,但不能保证完全的等分(比如不能整除),所以最末一块AG的block块数不一定和前面的AG的block块数完全相等,但也不会差太多。

xfs_db> agf 1
xfs_db> p length
length = 262059
xfs_db> agf 2
xfs_db> p length
length = 262059
xfs_db> agf 3
xfs_db> p length
length = 262056
xfs_db> 

bnoroot = 1
类型为ABTB的B+tree的根节点所在的块号,前面提到AG的第0块block存放着xfs_sb、xfs_agf、xfs_agi、xfs_agfl这四个信息块,并且还剩余了2048空闲,而第1块block存放的就是ABTB,其对应的块号由这个字段指明。
cntroot = 2
和上一个字段类似,指示类型为ABTC的B+tree的根节点所在的块号。
bnolevel = 1
类型为ABTB的B+tree的树深度为1。
cntlevel = 1
类型为ABTC的B+tree的树深度为1。
flfirst = 0
该字段后面再提。
fllast = 3
该字段后面再提。
flcount = 4
该字段后面再提。
freeblks = 192061
本AG内空闲块数目。一块新建立的AG,其块数目可以做下试验,/dev/loop0是一块新的磁盘(见前面的操作),格式成Xfs文件系统,但没有任何文件数据:

[root@localhost xfsprogs]# ./db/xfs_db /dev/loop0
xfs_db> sb 0
xfs_db> p agblocks
agblocks = 32768
xfs_db> agf 0
xfs_db> p freeblks
freeblks = 32756
xfs_db> agf 1
xfs_db> p freeblks
freeblks = 32760
xfs_db> agf 2
xfs_db> p freeblks
freeblks = 31560
xfs_db> 

可以看到,一块新格式化的Xfs文件系统,其primary AG的freeblks = agblocks-12,而其它AG的freeblks = agblocks-8,这根据前面文章《Xfs文件系统磁盘布局之二:AG结构》中的图和说明不难理解,另外可以看出除了primary AG的其它AG并没有一开始就分配inode chunk。
longest = 192061
B+tree树内节点最长的块数目,当前只有一个根节点,并且根节点包含了所有的空闲块,所以longest就等于freeblks。
btreeblks = 0
被用来存放ABTB和ABTC这两种类型B+tree的树节点的block块数,但不包括根节点所占的块,即不包括第1块和第2块。因为当前B+tree的树深度为1,即是没有其它节点占用block,所以btreeblks的值当然为0。
xfs_db>

转载请保留地址:http://www.lenky.info/archives/2012/01/682http://lenky.info/?p=682


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.