1. EXT2文件系统
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级指针,以此类推
- 我们删除文件时,一般不是直接删除文件所对应的数据块,而是删除块组描述符,块位图(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的数据。