学习ext2文件系统

最近在学习ext2文件系统,由于各种原因,学习过程断断续续。再次记录学习中的坑和重点,作为以后写出优秀博客的基石。

网上有很多ext相关的博客,但是很多都是转载和抄袭的,非常不负责任,错漏百出。包括《深入理解linux内核》中第十八章“Ext2和Ext3文件系统”,其中的错误很误解人,或者说用词很不严谨,例如:732页下方介绍超级块和组描述符,是这样说的:超级块与组描述符被复制到每个块组中。这句话就很不负责任,事实是并不是所有的块组中都保存超级快和组描述符。只有3/5/7的幂的组才有。或许作者只是想精简一切不是重点的东西。
至于网上的许多博客,都是根据这些书籍为依据,所以也是错误百出。

下面上干货,想要深入的理解ext2或者在ext2文件系统方面做些开发的人,建议通过阅读源码和手动分析相结合。

ext2文件系统源码:
手动分析:使用到的命令有dd/od/dumpe2fs/mkfs等

这里不在介绍ext2/ext3/ext4的差异,只是介绍ext2的文件系统和学习方法,具体差异可根据以下方法自行研究。

我们研究ext2,就需要有个ext2,然后结合源码/文档去查看ext2里的内容是不是一样的。
获取ext2系统方法:

  1. dd if=/dev/zero of=./myFile bs=1k count=512
  2. losetup /dev/loop0 ./myFile
  3. mke2fs ./myFile
  4. mkdir /mnt/myExt2;mount -t ext2 /dev/loop0 /mnt/myExt2

    至此我们通过losetup循环设备得到了ext2文件系统,并将其挂在到/mnt/myExt2目录。接下来结合源码/书籍来查看ext2里面的内容。

ext2文件系统的组织形式见下图:
这里写图片描述
图片来源于网络。
这个就是ext2文件系统的文件组织形势,启动快加块组的形式。
启动快,1k大小,内容和硬盘前1k内容类似,包含mbr+grub等内容,用于系统启动,例如制作双系统,就是利用这个启动块。启动块不是本文章讨论范围内。

接下来就是块组,每个块组大小相同,至于是多大,下面会讲。
每个块组内又有自己的组织结构,其中重中之重的就是超级快了,他的作用不可小觑,首先来看其中的数据结构:

 struct ext2_super_block {
  __u32   s_inodes_count;//索引节点总数
  __u32   s_blocks_count;//以块为单位的文件系统大小
  __u32   s_r_blocks_count;//保留的块数
  __u32   s_free_blocks_count;//空闲块计数器
  __u32   s_free_inodes_count;//空闲索引节点计数器
  __u32   s_first_data_block;//第一个使用的块号 =1
  __u32   s_log_block_size;//块的大小
  unsigned char s_magic[2];//魔术签名
  __u16   s_state;//状态标示
...
  __u32[204] s_reserved;//用null填充1024字节
}

sizeof(ext2_super_block) = 1K
超级块是一个块,很废话,但是无论块大小是1k还是4k,超级快都是一个块;意思就是块大小=4k的话,超级块中,后面3k是无人区。

下面就是见证奇迹的时刻,使用dd命令,导出我们的ext2文件系统 的1024-2048字节,这里应该就是超级块,我们来对比一下里面的内容和debugfs命令生成的结果是否一样。
首先贴出dump2fs /mnt/myExt2的结果

root@zjy-Aspire-4750:~/workPlace/ext2# dumpe2fs /dev/loop0 
dumpe2fs 1.42.9 (4-Feb-2014)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          1639f887-ff76-4de8-8fde-022e338796df
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              64
Block count:              512
Reserved block count:     25
Free blocks:              484
Free inodes:              53
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      1
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         64
Inode blocks per group:   8
Filesystem created:       Sat Apr  8 11:13:17 2017
Last mount time:          Sat Apr  8 11:44:53 2017
Last write time:          Sat Apr  8 11:44:53 2017
Mount count:              2
Maximum mount count:      -1
Last checked:             Sat Apr  8 11:13:17 2017
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           128
Default directory hash:   half_md4
Directory Hash Seed:      aabfd1c4-1c32-4ff8-b6ad-10462b24f11c


Group 0: (Blocks 1-511)
  主 superblock at 1, Group descriptors at 2-2
  保留的GDT块位于 3-3
  Block bitmap at 4 (+3), Inode bitmap at 5 (+4)
  Inode表位于 6-13 (+5)
  484 free blocks, 53 free inodes, 2 directories
  可用块数: 28-511
  可用inode数: 12-64

分析:可以看到只有一个group0,启动块大小是1K,那么这个group0的位置是1k开始的。

  1. Group0第一句,超级块在第一块中,位置1k;组描述符在第二块,位置5k;GDT块保留在第三块,位置9k;
  2. Group0第二句,bitmap在第四块,位置13K,
  3. 。。。。。后面以此类推

下面使用dd命令,查看1k位置的超级块信息和我们dump2fs信息是否一致,如果一致,则说明我们分析的是对的!
命令:dd -if=/dev/loop0 bs=1K count=261 | od -tx1 -Ax > ./hex
结果如下:

root@zjy-Aspire-4750:~/workPlace/ext2# cat hex 
000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
000400 40 00 00 00 00 02 00 00 19 00 00 00 e4 01 00 00
000410 35 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
000420 00 20 00 00 00 20 00 00 40 00 00 00 69 e1 ea 58
000430 69 e1 ea 58 03 00 ff ff 53 ef 00 00 01 00 00 00
000440 4d 55 e8 58 00 00 00 00 00 00 00 00 01 00 00 00
000450 00 00 00 00 0b 00 00 00 80 00 00 00 38 00 00 00
000460 02 00 00 00 01 00 00 00 16 39 f8 87 ff 76 4d e8
000470 8f de 02 2e 33 87 96 df 00 00 00 00 00 00 00 00
000480 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0004c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00
0004d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0004e0 00 00 00 00 00 00 00 00 00 00 00 00 aa bf d1 c4
0004f0 1c 32 4f f8 b6 ad 10 46 2b 24 f1 1c 01 00 00 00
000500 0c 00 00 00 00 00 00 00 4d 55 e8 58 00 00 00 00
000510 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
000560 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000570 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
000800 04 00 00 00 05 00 00 00 06 00 00 00 e4 01 35 00
000810 02 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00
000820 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

注意:
1/左侧一列是16进制数,代表字节数,一行16字节,所以0x400=1k
2/以上数据都是小端格式

开始分析,400位置就是超级块位置,超级块第一个字段是__u32 s_inodes_count;//索引节点总数
40 00 00 00 是64和我们dump2fs数据的Inode count = 64一致,接下来就是一步步验证,过程这里省略。。。

下面开始说明ext2系统的理论知识:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值