一、Ext2文件系统

1.1 概述

文件系统中存储的最小单位是块(Block),一个块究竟多大是在格式化时确定的,使用 tune2fs 命令可以查看块大小。

**注:**我这里演示使用的是ext3,但是没有影响。

1
2
3
4
5
6
7
[root@VM_120_243_centos 1]# cat /etc/fstab 
/dev/vda1 / ext3 noatime,acl,user_xattr 1 1
proc /proc proc defaults 0 0
sysfs /sys sysfs noauto 0 0
debugfs /sys/kernel/debug debugfs noauto 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
/swapfile swap swap defaults 0 0
1
2
3
4
[root@VM_120_243_centos 1]# tune2fs -l /dev/vda1 | grep Block
Block count: 13106944
Block size: 4096
Blocks per group: 32768

一个分区的开头必须有 1kboot block ,任何文件系统不能使用这块内容,用来存储磁盘分区信息和启动信息。启动块之后才是文件系统。

ext2文件系统将整个分区划成若干个同样大小的块组(Block Group),如下图所示:

ext2

1.2 详细描述

1. 超级块(Super Block)

描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等。

由于 super block 很重要 ,在每个block group都会存一份进行备份

2. 块组描述符表(GDT,Group Descriptor Table)

由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符

每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。

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

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

3. 块位图(Block Bitmap)

数据块存储所有文件的数据,比如某个分区的块大小是 1024字节,某个文件是 2049字节,那么就需要三个数据块来存,即使第三个块只存了一个字节也需要占用一个整块。超级块、块组描述符表、块位图、 inode位图、 inode表这几部分存储该块组的描述信息。

那么如何知道哪些块已经用来存储文件数据或其它描述信息,哪些块仍然空闲可用呢?块位图就是用来描述整个块组中哪些块已用哪些块空闲的。

它本身占一个块,其中的每 bit代表本块组中的一个块,这个 bit为 1表示该块已用,这个 bit为 0表示该块空闲可用。

4. inode位图(inode Bitmap)

和块位图类似,本身占一个块,其中每个 bit表示一个 inode是否空闲可用。

5. inode表(inode Table)

我们知道,一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型、权限、文件大小、创建 /修改 /访问时间等,这些信息存在 inode中而不是数据块中。每个文件都有一个inode,一个块组中的所有 inode ** 组成了inode表** 。

6. 数据块(Data Block)

根据不同的文件类型有以下几种情况:

  • 常规文件,文件的数据存储在数据块中。

  • 目录,该目录下的所有文件名和目录名存储在数据块中其它信息都保存在该文件的inode中。注意:目录是一种特殊类型的文件。

  • 对于符号链接,如果目标路径名较短则直接保存在 inode中以便更快地查找,如果目标路径名较长分配一个数据块来保存

  • 设备文件、FIFO和socket 等特殊文件没有数据块,即文件大小为0;设备文件的主设备号和次设备号保存在 inode中

二、Ext3 文件系统

众所周知,Linux通过唯一数值(索引节点号)来标识每个文件。当文件系统每次存储更新文件,它都要用新信息来更新索引节点表。

如果系统在存储文件和更新索引节点表之间发生了故障。即使文件数据正常保存到了物理设备上,如果索引节点表记录没有完成更新的话,ext2文件系统将无法找到那个文件。

为了解决这个问题,引入了ext3文件系统。它和 ext2 文件系统具有相同的索引节点表结构,其差别是 ext3 文件系统在硬盘上多出了一个特殊的 inode,用来记录文件系统的日志(journal)

在存储或更新文件时先将文件的更改写入到日志中,在数据成功写到存储设备和索引节点表后,再删除对应的日志条目。如果系统在数据被写入存储设备之前崩溃或断电了,日志文件系统下次会读取日志文件并处理上次留下的未写入的数据。

虽然ext3文件系统为Linux添加了基本的日志功能,但它仍缺少一些功能。例如ext3文件系统无法删除误删的文件,它没有任何内建的数据压缩功能,也不支持加密文件。

三、Ext4 文件系统

ext4文件系统在2008年收到了Linux内核官方的支持,除了支持数据的压缩和解密,ext4还支持一个称作**区段(extent)**的特性。

区段在存储设备上按块分配空间,但在索引节点表中只保存起始块的位置。

ext4还引入了块预分配技术(block preallocation)。如果你想在存储设备上给一个你知道要变大的文件预留空间,ext4文件系统可以为文件分配所有需要用到的块,而不仅仅是你现在用到的块。它会用0来填满这些块,不会将它们分配给其他文件。