Tuesday, March 30, 2010

ext2文件系统

为什么要了解ext2文件系统?

因为想知道quota的工作原理

为什么不是ext3或者是ext4?

相比之下,ext2入门比较简单

ext2的结构

首先碰到两个概念:

1. block

在ext2的逻辑上, block是最小单位。 大小是512*N(N>2)。512是现在常用硬盘的扇区大小。这个大小可以通过mkfs.ext2的-b参数指定。
其实, 现在已经有扇区大小为4K的硬盘了, 见DBA notes的blog: http://www.dbanotes.net/review/hard_drive_4k_sector.html

2. block group

ext2把N多的block划分成group处理, 称为block group。 这个数目可以通过mkfs.ext2的-G参数指定.

block group的具体细节

从图中可以看出, 每个block group有六部分. 其中有二部分是每个block group都是相同的:
1. super block: 
主要存放文件系统整体情况信息, 如
...(被截断)...
340   __le32  s_inodes_count;   /* Inodes count */
341   __le32  s_blocks_count;   /* Blocks count */
342   __le32  s_r_blocks_count; /* Reserved blocks count */
343   __le32  s_free_blocks_count;  /* Free blocks count */
344   __le32  s_free_inodes_count;  /* Free inodes count */
345   __le32  s_first_data_block; /* First Data Block */
346   __le32  s_log_block_size; /* Block size */
347   __le32  s_log_frag_size;  /* Fragment size */
348   __le32  s_blocks_per_group; /* # Blocks per group */
349   __le32  s_frags_per_group;  /* # Fragments per group */
350   __le32  s_inodes_per_group; /* # Inodes per group */
...(被裁断)...

block group数目 = s_blocks_count / s_blocks_per_group
每个block group的开始block位置 = ((group_number - 1)* blocks_per_group)
* 这里的开始block位置不是物理地址! 相当于block的编号

2. group descriptor
这里保存了每个block group的一些重要信息:

106 struct ext2_group_desc
107 {
108   __le32  bg_block_bitmap;    /* Blocks bitmap block */
109   __le32  bg_inode_bitmap;    /* Inodes bitmap block */
110   __le32  bg_inode_table;   /* Inodes table block */
111   __le16  bg_free_blocks_count; /* Free blocks count */
112   __le16  bg_free_inodes_count; /* Free inodes count */
113   __le16  bg_used_dirs_count; /* Directories count */
114   __le16  bg_pad;
115   __le32  bg_reserved[3];
116 };

可以看group descriptor保存了每个block group的使用信息.
group descriptor共使用的block数目 = (sizeof(struct ext2_group_desc) * block group数目) / s_blocks_count
* 存在余数还要加1, 文档里只是这样说的: rounded up if necessary,  见文档

下面部分是每个block group不同的:

3. block bitmap: 记录当前block group的block使用情况, 每个bit表示一个block是否被使用, 1表示被使用, 0表示没有被使用

4. inode bitmap: 和block bitmap的作用一样.

5. inode table:  存放struct ext2_inode数据结构, 每一个struct ext2_inode结构表示一个文件. 文件的属性都存放于这个struct里.

6. data blocks: 主要是存放数据的block.

每个struct ext2_inode是怎么编号, 每个block是怎么对应上物理地址?

上面的信息中, 还有两个问题:
1. 没有提到inode统一分配, 如: block group 2有哪些inode?
2. 没有提到物理地址. 如怎么得到block 1000的4K bytes?

实现上, 这两种信息都是通过计算得到的. 基于两个前提:
1. 逻辑分区的扇区是连续的. 也就是说, block都是连续的. 如: block 1, block 2, ...
2. block group也是连续的. 如: block group 1, block group 2, ...

知道block号码求得block的位置:
The block in that group (offset in blocks) =  block_number %s_blocks_per_group

知道inode号码求得inode的位置:
The inode in that group (offset in blocks)  =  inode_number % s_inodes_per_group
这样就可以知道每个block group有哪些inode, 每个struct ext2_inode结构表示inode

从位置如果得到物理地址?
block group 1的开始物理地址(也是block 1)是可以直接寻址:
The starting point for the file system is the superblock and is always located at an offset of 1024 bytes from the start of the file system.
* 文件系统前1024bytes不使用.
这样就可以计算出每个block group的地址, 然后再求得组出的block的物理地址.

总:

声明: 仅仅是个人的解理, 后果自负




No comments:

Post a Comment

Note: Only a member of this blog may post a comment.