2.1 Linux文件系统:EXT2文件系统解剖

1. EXT2文件系统

2.1 Linux文件系统:EXT2文件系统解剖_第1张图片
EXT2文件系统示意图

EXT2解剖图

  • 块(BLOCK)
    文件系统中最小的存储单位是块(Block),一个块究竟有多大是在格式化是确定的。

  • 启动块(Boot Block)
    启动块(Boot Block)大小确定,就是1K;启动块是由PC标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块,启动块之后才是EXT2文件系统的开始

  • 块组(Block Group)
    EXT2文件系统见整个分区划分成若干个同样大小的块组(Block Group),每个快都由一下部分组成。

  • 超级块(Super Block)
    描述整个分区的文件系统信息,例如块大小,文件系统版本、上次mount(挂载)的时间等。超级块在每个块组的开头都有一份拷贝。

  • 块组描述符表(GDT, Group Descriptor Table)
    由很多块组描述符组成,整个分区分成多少个块组就对应有多少个快描述符。每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始时数据块,空闲的inode和数据块还有多少个等等。

  • 块组描述符表和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组描述符就丢失整个块组的数据,因此它们都有多份拷贝。

  • 通常内核只用到第0个块组中的拷贝,当执行e2fsck检查文件系统一致性时,第0个块组中的超级块和快描述符表就会拷贝到其他块组,这样当第0块组的开头意外损坏时就可以用其他拷贝来恢复,从而减少损失。

  • 块位图(Block Bitmap)
    块位图就是用来描述整个块组中哪些块已用哪些块空闲的,它本身占一个块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用。
    假设1block=1024Bytes;那也就是8092bit位,那这个块位图的每个bit位都代表这个块组(Block Group)的每个block;如果第n个block上有数据,那在块位图相应的bit位就置为1,表示这个block已经被使用了;这样也就限定了这个块组(Block Group)的block的数量,当前就是8192个。
  • 为什么用df命令统计整个磁盘的已用空间非常快呢?因为只需要查看每个块组的块位图即可,而不需要搜遍整个分区。
  • inode位图(Inode Bitmap)
    与块位图相似,本身占一个block,其中每个bit位表示一个indoe是否空闲可用

  • inode表(Inode Table)
    一个文件除了需要储存数据之外,一些描述信息也需要储存,例如文件类型(常规,目录,文件类型等),权限,文件大小,创建/修改/访问时间等;这些信息存在inode中而不是数据块中。每个文件都有一个inode,一个块组中所有的inode组成了inode表。

  • 一个inode占128Bytes,分成两部分,第一部分存储文件属性,权限,创建时间,所有者等等;第二部分存的是数据块指针,一共60个Bytes,也就是15个数据块指针,从block[0]~block[14],每个数据块指针指向一个数据块的block
  • 15数据块指针的前12个是1级指针,第13个是二级指针,第14个是3级指针,第15个是四级指针;1级指针,顾名思义是直接指向一个数据块的,如果文件大小大于12个数据块的大小,就要使用第13个指针,这个二级指针是指向个数据块,这个数据块并不存放数据,而是每4Bytes再变成1级指针,指向其他的数据块,至于变成多少以及指针,这是由一个block的大小决定的;当文件也大于12个数据块和第13个二级指针指向的数据块时,再使用第14个3级指针,以此类推

2.1 Linux文件系统:EXT2文件系统解剖_第2张图片

  • 我们删除文件时,一般不是直接删除文件所对应的数据块,而是删除块组描述符,块位图(Block Bitmap),inode位图(Inode Bitmap)上关于这个文件的indoe表的信息;所以当我们误删除文件是,可以借其他组的块组描述符(GDT每个组都一样)来恢复文件的inode表,从而达到恢复文件的目的(只是思路而已)。
  • block的标号是全局唯一,而不是每个组重复使用。可以通过stat查看文件系统的block大小
  • 当我们用vi /home/rebot/hello.txt打开一个文件时,是怎么找到这个文件的

  • 文件类型

缩写 文件类型
- 普通文件
d 目录
l 符号链接
b 块设备文件
c 字符设备文件
s socket文件,网络套接字
p 管道
未知

vi hello 打开hello这个目录,存放的是这个目录下面的文件和目录,在文件或者目录上回车还可以打开文件或目录

  • 目录的inode

    一个inode占128Bytes,也分成两部分,第一部分不变,存储文件属性,权限,创建时间,所有者等等;第二部分存的是数据块指针,一共60个Bytes,也就是15个数据块指针,从block[0]~block[14],每个数据块指针指向一个数据块的block,这个数据块存放数据也叫记录项

  • 记录项的组成由三部分组成

    • 1.文件或目录的inode
    • 2.本条记录项的长度(因为文件名长度不固定,通过这条,可以找到下一条录项)
    • 3.文件名或目录名
  • 一般一个目录文件是一个block的大小,当这个目录底下存放的目录名和文件名特别多,大于一个block的时候,才会大于一个block的大小
  • 当我们用vi /home/rebot/hello.txt打开一个文件时,是怎么找到这个文件的
  • 解答:当我们打开一个文件的时候,是先从根目录找起的,根目录是目录文件,而且inode号固定位2,因为inode是2,所以就从第一个块组(group block)里面,inode table里面找到2号inode(跳过0,1号inode,也就是跳过256个Byte),可以通过2号indoe的数据指针找到根目录的数据块,根目录数据块里面是根目录的记录项,然后从里面找到home这个目录,并且获取他的inode号,然后通过home的inode号就可以得到home里数据块里的记录项,然后再找到rebot这个目录的记录项,再找到rebot里面的hello.txt文件的inode号,通过这个inode来读取hello.txt的数据。

你可能感兴趣的:(ext2,Linux编程)