首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

深入解析 ext2 文件系统

深入解析 ext2 文件系统

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

            那些介绍ext2特征的套话我就不说了,任何一本靠谱的linux教程中都可以找到,我们直接单刀直入,开始探索。
       

            首先生成一个ext2文件系统。我在我磁盘空间有限的Ubuntu中,划出500M的空间来从头学习ext2 文件系统。
       

            dd命令用来创建一个文件,不多说了,通过执行这个dd命令生成了一个全零的大小为512000*1KB的文件,即500MB 的文件。
       

            losetup是设定循环设备(loop service)的,循环设备可以将文件模拟成块设备。然后在块设备上建立我们的ext2文件系统,来进行我们的学习。所以下面用mke2fs命令将loop设备格式化成ext2文件系统。 Oh,yeah,我们终于有了ext2文件系统。
       

            这里需要强调下,我们调用了mke2fs的默认选项其中:

                       
                           
  •                                 root@libin:~# dd if=/dev/zero of=bean bs=1K count=512000
                           
  •                                 记录了512000
    0 的读入
                           
  •                                 记录了512000
    0 的写出
                           
  •                                 524288000字节(524 MB)已复制,9.40989 秒,55.7 MB/
                           
  •                                 root@libin:~# ll bean
                           
  •                                 -rw-r--r-- 1 root root 524288000 2012-07-06 22:24 bean
                           
  •                                 root@libin:~# ll -h bean
                           
  •                                 -rw-r--r-- 1 root root 500M 2012-07-06 22:24 bean
                           
  •                                 root@libin:~#
                           
  •                                 root@libin:~#
                           
  •                                 root@libin:~# losetup /dev/loop0  bean
                           
  •                                
                           
  •                                 root@libin:~# cat /proc/partitions
                           
  •                                 major minor  #blocks  name
                           
  •                                
                           
  •                                    7        0     512000 loop0
                           
  •                                    8        0  312571224 sda
                           
  •                                    8        1   49182966 sda1
                           
  •                                 .......
                           
  •                                
                           
  •                                 oot@libin:~# mke2fs /dev/loop0
                           
  •                                 mke2fs 1.41.11 (14-Mar-2010)
                           
  •                                 文件系统标签=
                           
  •                                 操作系统:Linux
                           
  •                                 块大小=1024 (log=0)
                           
  •                                 分块大小=1024 (log=0)
                           
  •                                 Stride=0 blocks, Stripe width=0 blocks
                           
  •                                 128016 inodes, 512000 blocks
                           
  •                                 25600 blocks (5.00%) reserved for the super user
                           
  •                                 第一个数据块=1
                           
  •                                 Maximum filesystem blocks=67633152
                           
  •                                 63 block groups
                           
  •                                 8192 blocks per group, 8192 fragments per group
                           
  •                                 2032 inodes per group
                           
  •                                 Superblock backups stored on blocks:
                           
  •                                     8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
                           
  •                                
                           
  •                                 正在写入inode表: 完成
                           
  •                                 Writing superblocks and filesystem accounting information: 完成
                           
  •                                
                           
  •                                 This filesystem will be automatically checked every 24 mounts or
                           
  •                                 180 days, whichever comes first. Use tune2fs -c or -i to override.               
       
    但是这样还没完,我们还是不能访问我们新建的ext2文件系统,因为还没有挂载,我决定将loop 设备挂载在/mnt/bean 目录下。


       
                   
  •                         mkdir /mnt/bean
                   
  •                         mount -t ext2 /dev/loop0 /mnt/bean
                   
  •                        
                   
  •                         root@libin:/mnt/bean# mount
                   
  •                         .........
                   
  •                         /dev/loop0 on /mnt/bean type ext2 (rw)
                   
  •                        
                   
  •                         root@libin:/mnt/bean# ll
                   
  •                         总用量 17
                   
  •                         drwxr-xr-x 3 root root  1024 2012-07-06 22:31 ./
                   
  •                         drwxr-xr-x 4 root root  4096 2012-07-06 22:32 ../
                   
  •                         drwx------ 2 root root 12288 2012-07-06 22:31 lost
    found/
           

     经过我们的努力,我们终于创建好了我们的ext2文件系统。下面需要讲讲ext2文件系统的结构是什么样的了。       
                            下面这张图是经典的ext2文件系统的结构图。网上到处可以找到这种类似的图片,但是我非要画这个图片的原因是为了澄清2个问题:       
                       
       
                            1 并不是所有的块组都有超级块和快组描述符。       
                            2 块组描述符GDT并不是只管理自己这个块组的信息,相反,它管理的是所有的块组的信息。       
                       
       
                               
                           (inode表和数据块的个数不一定相等,我这个图画多少有点问题)       
                       
       
                             我们知道,超级块是很重要的,因为它告诉了linux 这个块设备是怎样组织的,它告诉linux我这个文件系统是什么文件系统,每个块的大小是多大(1024、2048 or 4096),每个块组有多少个块,inode占多少个字节。等等的信息。正是因为超级块很重要,所以我们不能将这些信息只保存1份。试想一下,如果超级块坏掉了,而我们只有一个块组有超级块,那么就彻底完蛋了,后面接近500M的空间及里面的数据我们都没办法获得了。这是比较容易理解的。但是,是不是每个块组都要有启动块呢。这就没必要了,这也有点空间浪费。那到底把超级块放到那些块组呢?       

                           
继承事业,薪火相传
返回列表