|
|
发表于 2007-8-23 18:40:56
|
显示全部楼层
==《Ext2文件系统的内部布局》阅读辅助笔记 <续> ==
===== group descriptors 块组描述符(软盘)
# hexdump /dev/fd0 -s 2048 -n 1024
0000800 0003 0000 0004 0000 0005 0000 0577 00ad
0000810 0002 0000 0000 0000 0000 0000 0000 0000
0000820 0000 0000 0000 0000 0000 0000 0000 0000
*
0000c00
笔记 group_desc structure
_ offset __ size ___ description
------ ------- ------------------
___ 0 _____ 4 bg_block_bitmap | Block Bitmap 的第一个块的块ID
___ 4 _____ 4 bg_inode_bitmap | Inode Bitmap 的第一个块的块ID
___ 8 _____ 4 bg_inode_table | Inode Table 的第一个块的块ID
___ 12 ____ 2 bg_free_blocks_count | 当前块组里未用的块的总数
___ 14 ____ 2 bg_free_inodes_count | 当前块组里未用的inode的总数
___ 16 ____ 2 bg_used_dirs_count | 当前块组分配给目录的inode 总数
___ 18 ____ 2 bg_pad
___ 20 ___ 12 bg_reserved
(bg_block_bitmap阅读例子)
# hexdump -s 2048 -n 4 /dev/fd0
0000800 0003 0000
0000804
# echo "ibase=16;00000003" | bc
3
(bg_free_blocks_count阅读例子)
# hexdump -s 2060 -n 2 /dev/fd0
000080c 0577
000080e
# echo "ibase=16;577" | bc
1399
(bg_free_inodes_count阅读例子)
# hexdump -s 2062 -n 2 /dev/fd0
000080e 00ad
0000810
# echo "ibase=16;AD" | bc
173
[ ‘当前块组’意思是当前文件系统(或理解成分区)的块组设置。 group descriptors(块组描述符)跟着 超级块。 ]
(验证例子) ‘ dumpe2fs /dev/fd0 ’显示如下:
...... ......
Group 0: (Blocks 1-1439)
Primary Superblock at 1, Group Descriptors at 2-2
Block bitmap at 3 (+2), Inode bitmap at 4 (+3)
Inode table at 5-27 (+4)
1399 free blocks, 173 free inodes, 2 directories
Free blocks: 41-1439
Free inodes: 12-184 注: 这是软盘上ext2文件系统只有一个块组的情况。Group 0 包括文件系统上块ID 1-1439,block bitmap at 3 (+2) 中的‘+2’表示当前Group 0的偏移数,‘+0’则为当前Group 0第一块。
例子:以下是硬盘上一个关联Group的情况:
Group 19: (Blocks 622592-655359)
Block bitmap at 622592 (+0), Inode bitmap at 622593 (+1)
Inode table at 622596-623106 (+4)
0 free blocks, 12437 free inodes, 70 directories
Free blocks:
Free inodes: 314294, 314297-314298, 314301-314322, 314487-314593, 314595, 314631-314635, 314639-314660, 314662, 314667-314697, 314796-327040
[ 注: 超级块结构+块组描述符结构 需要依照格式化程序合理分配到一个或多个Group里,而且是一系列关联Group的开头部分。]
====== block Bitmap
# hexdump -s 3072 -n 1024 /dev/fd0
0000c00 ffff ffff 00ff 0000 0000 0000 0000 0000
0000c10 0000 0000 0000 0000 0000 0000 0000 0000
*
0000cb0 0000 8000 ffff ffff ffff ffff ffff ffff
0000cc0 ffff ffff ffff ffff ffff ffff ffff ffff
*
0001000
摸索→ ‘hexedit -s /dev/fd0’显示block bitmap区域,0xC00 到 0xCB3(标记值80)前包含179字节(byte)。一个字节能表示8个标记值(如‘ff’表示‘11111111’),那么已经有40块被占用。该block bitmap能表示1432块( 179x8 )。
1432块跟1439块差了7块,检查 80标记值:
# echo "ibase=16;obase=2; 80" | bc
10000000
显示7个0标记,能表示7块,例子中block bitmap应该表示1439块。 ↖ 凭估!
[ 测试过程中发现‘lost+found’目录占12块,block bitmap中占12个标记位 ]
======= inode bitmap
inode bitmap的作用类同于block bitmap,不同的是每一个位对应inode table里的一个inode而不是块。
# hexdump -s 4096 -n 1024 /dev/fd0
0001000 07ff 0000 0000 0000 0000 0000 0000 0000
0001010 0000 0000 0000 ff00 ffff ffff ffff ffff
0001020 ffff ffff ffff ffff ffff ffff ffff ffff
*
0001400
仿hexedit显示
# hexdump -e "\"%.8_ax \" 16/1 \"%02X \"\"\\n\"" -s 0x1000 -n 1024 /dev/fd0
# hexdump -e "\"%.8_ax \" 16/1 \"%02X \"\"\\n\"" -s 4096 -n 1024 /dev/fd0
00001000 FF 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001010 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF
00001020 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
*
inode bitmap能表示184( 23x8 )个inode,已经占用11个inode 。
# echo "ibase=16 ; obase=2 ; 07FF" | bc
11111111111 (已经占用11个inode)
----
---- |
|