首页 > *nix技术, 文件系统 > Xfs文件系统磁盘布局之十五:目录文件数据结构(续)

Xfs文件系统磁盘布局之十五:目录文件数据结构(续)

2012年1月10日 发表评论 阅读评论 2,449 次浏览

当一个目录文件下的子文件比较多,其子文件的相关信息以简短方式无法在inode的data fork内存放时,就要被转移到一个新的单独的“directory block”块内。“directory block”块是存放目录子文件相关信息所需磁盘的基本申请和释放单位,一块“directory block”的大小不一定和一块逻辑block大小一致,因为一块“directory block”可以由多个连续逻辑block组成,具体大小bytes = sb_blocksize * 2sb_dirblklog,但在默认情况下sb_dirblklog = 0,也即是一块“directory block”就由一块逻辑block组成,默认大小同为为4096。另外,一块“directory block”的大小最大值为35536(bytes)。

利用新的单独的“directory block”块来更多存放子文件的相关信息,对这些“directory block”的组织又有多种方式,如前面所说,包括数组“extents”、“Btree”等。先来看看“extents”方式,此时目录文件inode核心数据的di_format字段值将由XFS_DINODE_FMT_LOCAL(数值1,简短方式时的值)变成XFS_DINODE_FMT_EXTENTS(数值2),各个“directory block”块号等信息以数组的形式存放在data fork空间内,数组元素的个数由inode核心数据的di_nextents标记,数组元素内记录的一个“directory block”的信息包括startoff、startblock、blockcount、extentflag,这和前面介绍的普通文件的extents数据结构是一样的。
先看数组元素只有一个的情况,这是一种特例情况,此时di_nextents = 1,di_nblocks = “directory block”/“logic block” (我这里,“directory block”和“logic block” 大小一样,所以di_nblocks = 1),数组第0个元素内记录的“directory block”的信息:startoff恒等于0、startblock指向对应的起始block块好、blockcount等于“directory block”/“logic block”、extentflag记录flag标记。

实例:

[root@localhost block]# ls -lai
total 616
 137 drwxr-xr-x 2 root root  4096 Jan 10 04:59 .
 128 drwxr-xr-x 6 root root    81 Jan 10 04:49 ..
 143 -rw-r--r-- 1 root root  1244 Jan 10 04:59 atomic.h
 166 -rw-r--r-- 1 root root   664 Jan 10 04:59 bitops.h
 168 -rw-r--r-- 1 root root  8381 Jan 10 04:59 builddefs
 170 -rw-r--r-- 1 root root  3838 Jan 10 04:59 builddefs.in
...
[root@localhost block]# cd ../../
[root@localhost loop]# umount inode.256
[root@localhost loop]# /home/lenky/xfs/xfsprogs/db/xfs_db /dev/loop0
xfs_db> inode 137
xfs_db> p
core.magic = 0x494e
core.mode = 040755
core.version = 1
core.format = 2 (extents)
...
core.nblocks = 1
core.extsize = 0
core.nextents = 1
core.naextents = 0
...
core.gen = 5
next_unlinked = null
u.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,36,1,0]
xfs_db> q
[root@localhost loop]# hexdump -C -s 35072 -n 256 /dev/loop0
00008900  49 4e 41 ed 01 02 00 02  00 00 00 00 00 00 00 00  |INA.............|
00008910  00 00 00 02 00 00 00 00  00 00 00 00 00 00 00 17  |................|
00008920  4f 0c 0c 01 16 3b 86 ac  4f 0c 0c 00 17 a9 bc ac  |O....;..O.......|
00008930  4f 0c 0c 00 17 a9 bc ac  00 00 00 00 00 00 10 00  |O...............|
00008940  00 00 00 00 00 00 00 01  00 00 00 00 00 00 00 01  |................|
00008950  00 00 00 02 00 00 00 00  00 00 00 00 00 00 00 05  |................|
00008960  ff ff ff ff 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00008970  04 80 00 01 00 00 00 00  00 00 02 00 00 00 00 00  |................|
00008980  21 80 00 01 00 00 00 01  00 00 00 00 00 00 00 01  |!...............|
00008990  9b c0 00 01 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000089a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000089b0  00 00 00 00 00 00 10 33  00 00 00 00 00 00 00 00  |.......3........|
000089c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00008a00
[root@localhost loop]# 

00008960 ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 |…………….|
00008970 04 80 00 01 00 00 00 00 00 00 02 00 00 00 00 00 |…………….|
非0的数据“04 80 00 01”拆成2进制为“00000100 10000000 00000000 00000001”,即startblock的二进制值为100100(十进制为36),blockcount的二进制值为001(十进制为1),对比前面是符合数据一致的。

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


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

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

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