为什么要了解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不使用.
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.