当前位置:文档之家› Ext2格式分析

Ext2格式分析

Ext2格式分析1、Ext2磁盘数据结构任何Ext2分区中的第一个块从不受Ext2文件系统的管理,因为这一块是为分区的引导扇区所保留的。

Ext2分区的其余部分被分成块组(block group),每个块组的分布图如图所示。

正如你从图中所看到的,一些数据结构正好可以放在一块中,而另一些可能需要更多的块。

在Ext2文件系统中的所有块组大小相同并被顺序存放,因此,内核可以从块组的整数索引很容易地得到磁盘中一个块组的位置:由于内核尽可能地把属于同一个文件的数据块存放在同一块组中,所以块组减少了文件碎片。

块组中的每个块包含下列信息之一:1.文件系统的超级块的一个拷贝2.一组块组描述符的拷贝3.一个数据块位图4.一个索引节点位图5.一个索引节点表6.属于文件的一大块数据,即数据块如果一个块中不包含任何有意义的信息,就说这个块是空闲的。

从上图中可以看出,超级块与组描述符被复制到每个块组中。

其实呢,只有块组0中所包含超级块和组描述符才由内核使用,而其余的超级块和组描述符都保持不变;事实上,内核甚至不考虑它们。

当e2fsck程序对Ext2文件系统的状态执行一致性检查时,就引用存放在块组0中的超级块和组描述符,然后把它们拷贝到其他所有的块组中。

如果出现数据损坏,并且块组0 中的主超级块和主描述符变为无效,那么,系统管理员就可以命令e2fsck引用存放在某个块组(除了第一个块组)中的超级块和组描述符的旧拷贝。

通常情况下,这些多余的拷贝所存放的信息足以让e2fsck把Ext2分区带回到一个一致的状态。

那么有多少块组呢?这取决于分区的大小和块的大小。

其主要限制在于块位图,因为块位图必须存放在一个单独的块中。

块位图用来标识一个组中块的占用和空闲状况。

所以,每组中至多可以有8×b个块,b是以字节为单位的块大小。

例如,一个块是 1024 Byte,那么,一个块的位图就有8192个位,一个块组正好就对应8192个块(位图中的一个bit描述一个块)。

Ext2超块(super Block)Ext2超块中包含了描叙文件系统基本尺寸和形态的信息,是用定义在include/Linux /ext2_fs.h中ext2_supe_block数据结构描述的。

文件系统管理器利用它们来使用和维护文件系统。

通常安装文件系统时只读取数据块组0中的超块,但是为防止文件系统被破坏,每个数据块组都包含了它的拷贝。

超块中的主要信息如下:Magic Number:文件系统安装软件用来检验是否是一个真正的EXl2文件系统超块。

当前Exl2版本中为0xEF53。

Block Size:以字节记数的文件系统块大小,如1024字节。

Blocks per Group:每个组中块数目。

当文件系统创建时此块大小被固定下来。

Free Blocks:文件系统中的空闲块数。

Free Inodes:文件系统中空闲Inode数。

First Inode:文件系统中第一个Inode号。

EX配根文件系统中第一个Inode将是指向‘/’目录的人口。

ExT2组描述符(Group Descript)每个数据块组都拥有一个描叙结构的组描叙符,它是定义在include/Linux/ext2一fs.h中的ext2一group—desc结构。

组描叙符放置在一起形成了组描叙符表。

每个数据块组在超块拷贝后包含整个组描叙符表。

象超块一样,所有数据块组中的组描叙符表被复制到每个数据块组中以防文件系统崩溃。

EX配文件系统仅使用第一个拷贝(在数据块组0中)。

组描叙符主要包含以下信息:Blocks Bitm印:对应此数据块组的块分配位图的块号,在块分配和回收时使用。

Inode Bitmap:对应此数据块组的Inode分配位图的块号,在Inode分配和回收时使用。

Inode Table:对应数据块组的Inode表的起始块号。

每个Inode用下面的EX佗Inode 结构来表示。

Free blocks count,Free Inodes count,USed directory countExT2目录在ExT2文件系统中目录是包含文件存取路径的特殊文件。

目录文件是一组目录人口的链表,它们包含以下信息:Inode:对应每个目录入口的1node,被用来索引储存在数据块组的Inode表中的Inode 数组。

name length:以字节记数的目录人口长度。

name:目录人口的名称ExT2索引节点(hlode)ExT2通过一个Inode结构来说明一个文件,每个Inode有唯一的编号。

Inode描叙文件的物理位置以及文件的存取权限、文件修改时间及文件类型。

每个数据块组的EX他Inode 被保存在Inode表中,同时还有一个位图被系统用来跟踪已分配和未分配的Inode。

图2给出了EXl2 Inode的格式,ext2_in_ode定义在include/Linux/ext2_fS.h中。

EXl2目录仅是一个包含指向其目录人口指针的特殊文件(也用Inode表示)。

EXl2 Inode还可以描叙特殊设备文件,虽然它们不是真正的文件,但可以通过它们访问设备。

所有那些位于/dev 中的设备文件可用来存取Linux设备,例如mount程序可把设备文件作为参数。

块位图、Inode位图和Inode表每个块组都有一个块位图,用来描述本块组中数据块的使用状况。

块位图的每一位(bit)表示一个数据块的使用情况,“l”表示对应的数据块已占用,“0”表示空闲。

各位(bit)的顺序与块组中数据块的顺序一致。

Inode位图反映了Ino(ie表中各个表项的使用情况,其使用方法与块位图类似。

一个块组中所有文件的Inode形成了Inode表。

表项的序号就是lzlode号。

InO(1e表在块组中要占用几个逻辑块由超级块中s_inodes_per_group给出。

2、ExT2文件系统的特点EX配文件系统是标准的Linux文件系统,具有如下特点:(1)物理地址使用了15个数据块指针,采用综合索引方式,最大可支持4(jB的文件;(2)使用变长的目录项,既不浪费磁盘空间,又能支持最长达255个字符的文件名;(3)使用位图来管理空闲数据块和索引节点,解决了采用链表来管理未分配数据块和节点带来的一系列问题;(4)使用了块组的概念,使数据的读写更快、更有效,系统也变得安全可靠;(5)性能高且易于扩展。

但是,EX配系统还存在一些不足,主要体现在下述几个方面:(1)无ACL控制机制。

Linux采用了UNIX的权限控制机制,将文件的用户分为3类:文件主、组用户和其他用户。

而不是对任何特定的用户和用户组,让每个文件与特定的存取权限相关联。

而且,权限控制强度也不如其它操作系统(如Windows NT、Novell等)强。

这需要增强Linux的权限控制机制。

(2)未采用逻辑删除技术。

LinuX下的文件一旦删除,文件就无法恢复,可以采用一个逻辑删除的选项允许用户在必要时恢复以前已删除的文件内容。

(3)文件无压缩机制。

EX舵下的文件尚未采用压缩机制,文件全部按照原码存放,磁盘空间浪费较大。

(4)文件未加密存放。

EX佗中的文件按照明文存放,一旦Exlr2分区所在的磁盘被盗,Ex配上的文件就可以完全恢复过来,这样Linux系统的安全性就要大打折扣。

(5)块片技术(block fragmentation)未实现。

系统管理员对磁盘的访问通常选择较大的块,这样在大块上存放小文件就会浪费很多空间。

通过在大块的不同片上存放多个小文件的方法可以节省不少的磁盘空间。

3、各种文件类型如何使用磁盘块Ext2所认可的文件类型(普通文件、管道文件等)以不同的方式使用数据块。

有些文件不存放数据,因此根本就不需要数据块。

我们来讨论一些文件类型的存储要求:普通文件普通文件是最常见的情况,我们要重点关注它。

但普通文件只有在开始有数据时才需要数据块。

普通文件在刚创建时是空的,并不需要数据块;也可以用 truncate()或open()系统调用清空它。

这两种情况是相同的,例如,当你发出一个包含字符串 > filename的shell命令时,shell创建一个空文件或截断一个现有文件。

目录Ext2以一种特殊的文件实现了目录,这种文件的数据块把文件名和相应的索引节点号存放在一起。

特别说明的是,这样的数据块包含了类型为ext2_dir_entry_2的结构:#define EXT2_NAME_LEN 255struct ext2_dir_entry_2 {__le32 inode; /* 索引节点号 */__le16 rec_len; /* 目录项长度 */__u8 name_len; /* 文件名长度 */__u8 file_type; /* 文件类型 */char name[EXT2_NAME_LEN]; /* 文件名 */};因为该结构最后一个name字段是最大为EXT2_NAME_LEN(通常是255)个字符的变长数组,因此这个结构的长度是可变的。

此外,因为效率的原因,目录项的长度总是4的倍数,并在必要时用null字符(\0)填充文件名的末用的name_len字段存放实际的文件名长度(参见下图)。

注意:此处的目录项与VFS中的dentry不同. 这里的目录项是指目录文件中的一个item(项). 目录文件中的一个item的类型是ext2_dir_entry_2. ext2_dir_entry2实例的长度是可变的,其长度由其rec_len成员指定,而其name成员的实际长度由name_len指定.(这里我们看到了对ext2_dir_entry_2的hack)file_type字段存放指定文件类型的值(见下表):rec_len字段可以被解释为指定一个有效目录项的指针:它是偏移量,与目录项的起始地址相加就得到下一个有效目录的起始地址。

为了删除一个目录项,把它的inode字段置为0并适当地增加前一个有效目录项rec_len字段的值就足够了。

仔细看一下上边图中的rec_len字段,你会发现 oldfile项已被删除,因为usr的rec_len字段被置为12+16(usr 和oldfile目录项的长度)。

符号链接如前所述,如果符号链接的路径名小于等于60个字符,就把它存放在索引节点的i_blocks 字段,该字段是由15个4字节整数组成的数组,因此无需数据块。

但是,如果路径名大于60个字符,就需要一个单独的数据块。

设备文件、管道和套接字这些类型的文件不需要数据块。

所有必要的信息都存放在索引节点中。

相关主题