免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2334 | 回复: 4
打印 上一主题 下一主题

[文件系统] 关于ext2文件系统 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-10 20:32 |只看该作者 |倒序浏览
大家好:
       最近看了看文件系统的相关知识,发现一些不一致的信息。比如http://linux.alai.net/viewblog.php?id=20706在这篇文章中说:每个块组重复保存着一些有关整个文件系统的关键信息,以及真正的文件和目录的数据块。而参考鸟哥上讲的ext2文件系统上面所画的图也是反映了每个block group 中都有superblock的记录。但是我在参考源码时,看到的ext2_group_desc结构体定义如下:
  1. 138 struct ext2_group_desc
  2. 139 {
  3. 140     __u32   bg_block_bitmap;        /* Blocks bitmap block */
  4. 141     __u32   bg_inode_bitmap;        /* Inodes bitmap block */                                                                     
  5. 142     __u32   bg_inode_table;     /* Inodes table block */
  6. 143     __u16   bg_free_blocks_count;   /* Free blocks count */
  7. 144     __u16   bg_free_inodes_count;   /* Free inodes count */
  8. 145     __u16   bg_used_dirs_count; /* Directories count */
  9. 146     __u16   bg_flags;
  10. 147     __u32   bg_reserved[3];
  11. 148 };
复制代码
里面并没有关于superblock的记录,而http://www.ibm.com/developerworks/cn/linux/filesystem/ext2/这篇文章中也没有说明没事不是每个block group中都会记录superblock 等信息。求解......

还有个问题,大家对inode table 这个东西的认识是什么?怎么我看了几篇文章之后感觉inode table 就是inode节点啊....求大神指教。

论坛徽章:
0
2 [报告]
发表于 2012-10-13 12:32 |只看该作者
正好前些天也把EXT2文件系统看完了,大神谈不上,不过可以尝试回答你的问题,ext2_group_desc是块组描述符,每个sb中都包含了若干个块组描述符,所以每个sb中都包含有块组描述符的信息,具体请看:
super_block-》ext2_sb-》s_group_desc,其中s_group_desc就是存放在磁盘前几个block中的块组描述符数组,所以通过super block可以找到块组,但是从块组描述符中确实找不到super block的信息,而且也没有这个必要吧。

第二个问题,我以下面的例子来回答,
gdp = (struct ext2_group_desc *) bh->b_data;//找到了inode对应的块组描述符保存在磁盘上的block的buffer,
        /*
         * Figure out the offset within the block group inode table
         */
        offset = ((inode->i_ino - 1) % EXT2_INODES_PER_GROUP(inode->i_sb)) *EXT2_INODE_SIZE(inode->i_sb); //计算该inode在块组内的offset(单位byte)。
        block = le32_to_cpu(gdp[desc].bg_inode_table) +(offset >> EXT2_BLOCK_SIZE_BITS(inode->i_sb)); //计算该inode所在块组中的block位置
        if (!(bh = bread (inode->i_dev, block, inode->i_sb->s_blocksize))) {              //读出该block
                ext2_error (inode->i_sb, "ext2_write_inode",
                            "unable to read inode block - "
                            "inode=%lu, block=%lu", inode->i_ino, block);
                return -EIO;
        }
        offset &= EXT2_BLOCK_SIZE(inode->i_sb) - 1;  //计算出该inode在一个block内的offset。
        raw_inode = (struct ext2_inode *) (bh->b_data + offset);//读出该inode在磁盘上的对应物 raw_inode。
从上面的流程,应该可以看出bg_inode_table的作用吧,就是在块组中用来查找raw inode的,bg_inode_table本身的含义是块组中第一个inode所对应的block位置。
也许有些地方用词不是太准确,请见谅。

论坛徽章:
0
3 [报告]
发表于 2012-10-14 11:30 |只看该作者
回复 2# ljzbq123
很感谢你的回复。
在后面的学习中关于第一个问题我看到了一些解释是这样的:因为super_block记录了关于文件系统的特别重要的信息,所以会被复制几分分别放在每个block_group前面,所以就有了如下的结构示意图


虽然在struct ext2_group_desc中没有super_block的相关记录,但是在逻辑结构上还是存在的,而后面备份的super_block可以根据block_group的大小找到,所以没有必要记录下来它的位置。

关于第二个问题,inode_tabel是指所有inode聚集在一起形成的表,而不是存在一个确定的表来记录各个inode的位置。

个人意见,欢迎讨论......再次感谢你的精彩回复.....

论坛徽章:
0
4 [报告]
发表于 2012-10-14 17:04 |只看该作者
inode_table. 是在建立文件系统的时候就建立好了.  所以一个文件系统能够存储多少个文件, 这个数值已经决定了. 所有的inode都存储在inode_table 中.

http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 这个链接中, 对 inode 做了一个比较详细的解释.

论坛徽章:
0
5 [报告]
发表于 2012-10-15 12:14 |只看该作者
回复 4# hk2305621


    非常感谢....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP