深入解析ext2文件系统

  

很久以来,就想写一篇关于ext家族文件系统的文章,源于我刚工作的时候,曾经一不小心rm射频,误删除了很多文件,当时真想有个数据恢复软件能帮我把数据回复了。当然学习数据恢复,首先要学习文件系统。最近工作原因,好长时间没看学习Linux内核相关的东西,感觉面目可憎。扯远了,开始我们的ext2文件系统的探索之旅。

  
 <代码>那些介绍ext2特征的套话我就不说了,任何一本靠谱的linux教程中都可以找的到,我们直接单刀直入,开始探索。
  
  首先生成一个ext2文件系统。我在我磁盘空间有限的Ubuntu中,划出500米的空间来从头学习ext2文件系统。
  
  dd命令用来创建一个文件,不多说了,通过执行这个dd命令生成了一个全零的大小为512000 * 1 kb的文件,即500 mb的文件。
  
  losetup是设定循环设备(循环服务)的循环设备可以将文件模拟成块设备,然后在块设备上建立我们的ext2文件系统,来进行我们的学习。所以下面用mke2fs命令将循环设备格式化成ext2文件系统。哦,是的,我们终于有了ext2文件系统。
  
  这里需要强调下,我们调用了mke2fs的默认选项其中: 
  

root@libin: ~ # dd if=/dev/0=bean b=1 k数=512000
记录了512000 0的读入
记录了512000 0的写出
524288000字节(524 MB)已复制,9.40989秒,55.7 MB/秒
root@libin: ~ #将bean
-rw-r - r - 1根根524288000 2012-07-06 22:24 bean
root@libin: ~ # ll - h bean
-rw-r - r - 1根500根2012-07-06 22:24 bean
root@libin: ~ #
root@libin: ~ #
root@libin: ~ # losetup/dev/loop0 bean

  

root@libin: ~ #猫/proc/partitions
主要小#块名称

  

0 512000 loop0
8 0 312571224 sda
8 1 49182966 sda1
.......

  

oot@libin: ~ # mke2fs/dev/loop0
mke2fs 1.41.11(14 - 3月- 2010)
文件系统标签=
操作系统inux
块大?1024(日志=0)
分块大?1024(日志=0)
跨步=0块,条纹宽度=0块128016 inode
,
512000块25600块(5.00%)为超级用户
第保留一个数据块=1
最大文件系统块=63
67633152块组
8192块每组,每组8192碎片
2032 inode每组块备份存储在
:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

  

正在写入inode表:完成
写作加里和文件系统会计信息:完成

  

这每24挂载文件系统将自动检查或
180天,以先到期者作准。使用tune2fs - c或我覆盖。
但是这样还没完,我们还是不能访问我们新建的ext2文件系统,因为还没有挂载,我决定将循环设备挂载在/mnt/豆目录下。

  

mkdir/mnt/豆
mount - t ext2/dev/loop0/mnt/豆

  

root@libin:/mnt/豆#
.........山
/dev/loop0/mnt/bean类型ext2 (rw)

  

root@libin:/mnt/豆#我
总用量17
drwxr-xr-x 3根根1024 2012-07-06 22:31。/
drwxr-xr-x 4根根4096 2012-07-06 22:32 . ./
drwx - - - - - - 2根12288根2012-07-06 22:31失去了发现/
经过我们的努力,我们终于创建好了我们的ext2文件系统。下面需要讲讲ext2文件系统的结构是什么样的了。

  
 <代码>下面这张图是经典的ext2文件系统的结构图。网上到处可以找到这种类似的图片,但是我非要画这个图片的原因是为了澄清2个问题:
  
  1并不是所有的块组都有超级块和快组描述符。
  2块组描述符GDT并不是只管理自己这个块组的信息,相反,它管理的是所有的块组的信息。 
  

(inode表和数据块的个数不一定相,等我这个图画多少有点问题)

  
 <代码>我们知道,超级块是很重要的,因为它告诉了linux这个块设备是怎样组织的,它告诉linux我这个文件系统是什么文件系统,每个块的大小是多大(1024年、2048年或4096年),每个块组有多少个块,inode占多少个字节等。等的信息。正是因为超级块很重要,所以我们不能将这些信息只保存1份。试想一下,如果超级块坏掉了,而我们只有一个块组有超级块,那么就彻底完蛋了,后面接近500米的空间及里面的数据我们都没办法获得的了。这是比较容易理解的。但是,是不是每个块组都要有启动块呢。这就没必要了,这也有点空间浪费。那到底把超级块放到那些块组呢?  
  

超块备份存储在块:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
这是格式化循环设备输出到终端结果的信息,因为每个块组是8192个块(原因后面讲),所以第0个块组,第1块组,第3个块组第5个块组,第7个块组,第9个块组,第25个块组,第27个块组,第49个块组存储有超级块。

  
 <代码>怎么计算出来的,为什么非要存在这些块组?计算规则是3 5和7的幂,这样的块组保存超级块。
  
  解释块组描述符之前我们先看下超级块的相关信息:

深入解析ext2文件系统