EXT4是第四代扩展文件系统。单文件系统最大支持1EB,单个文件最大支持16TB。

一、兼容性

Ext4文件系统可以兼容之前的版本,如果用户通过Ext3格式化了磁盘,用户也可以在不损失数据的情况下升级到Ext4文件系统。向前兼容极大的方便了已有用户的升级,避免数据的导入导出可能引入的风险。向前兼容的原理很简单,就是数据在磁盘的布局与Ext3保持一致,并且数据结构也保持一致即可。

二、EXTENT

Extent是新一代文件系统支持的特性,其特点是通过其位置和长度表示文件内的数据,Ext4也支持该特性。在Ext2及Ext3中都是通过间接块的方式存储文件内的数据的,因此文件的大小和访问性能各方面都比较差。
如图,Ext3文件系统文件内数据存储的方式。在文件对应的inode节点中有一个15个元素的数组:

  • 0-11:存储的是文件数据在磁盘中的地址;
  • 12:存储的是地址,其指向磁盘地址存储的数据不是文件内数据,而是指向下一级的地址,该地址才是文件内的数据。也就是在该数组的元素和实际存储文件数据的磁盘块之间多出一个磁盘块,用于存储磁盘的地址,而这个磁盘块就是间接块;
  • 13:以此类推,第14个元素中间有2级间接块;
  • 14:第15个元素有3级间接块。
    从上可知,间接块的作用其实是在一定程度上优化了inode中存储地址的数量。

鉴于上述原理,由于文件系统中块的大小是确定的,而地址长度和数组元素也是确定的,因此就可以确定文件的最大大小。同时,由于每个地址指向的就是一个块,因此这种方式的特点是所有块大小是一样的。这样就有一个缺点,如果用户写入的是远大于文件系统块的数据,Ext3还是要切割为指定大小的块,而且还得计算地址,因此效率会非常不好。

Ext4文件系统对其进行了改进,实现了基于Extent的数据存储方式,其实现基于B+树。此时前文说的数组变成了B+树的树根,而B+树可以有多层,只有叶子节点存储指向文件数据的磁盘地址,中间层的节点只存储下一级的磁盘地址,由于B+树有很多叉(几百个),因此树的深度就会很浅。这样文件系统在查找文件的数据的时候就不需要过多的与磁盘交互,从而保证文件系统的性能。

文件系统overlay好处 文件系统extend_服务器


前文提到,Ext4文件系统的关键之处在于Extent,也就是在叶子节点存储文件数据在磁盘的地址的数据结构。该数据结构存放着地址和数据的长度,因此,如果用户写一个很大块的数据,该数据结构就只需要记录起始位置和长度即可,并不需要进行切割,效率得到极大的提升。

三、延迟分配

延迟分配的意思是在写数据的情况下并不会马上为其分配磁盘空间,而是先写入页缓存,然后做个标记,标记其还没有分配空间。然后在某些特定的条件下才分配磁盘空间,并将数据写入磁盘中。

文件系统overlay好处 文件系统extend_服务器_02


我们举一个例子,如果没有延迟分配,假设用户写入3个数据块,如图3左侧所示,其中数字代表先后顺序。此时文件系统为其分配磁盘空间,在地址上可能就不是连续的,而磁盘要写这些数据就会产生磁盘摆臂,从而对写入性能造成很大的影响。

而如果不马上分配空间,而是延迟分配空间,这样用户写入的数据就是连续的一块数据,此时文件系统只需要分配一块空间即可(如图3右侧所示),结合前面的Extent特性和多分配特性,就可以将该数据一次性写入,从而提升写入性能。简单的理解其实就是尽量的将随机IO转换为顺序IO。

四、日志校验

我们知道为了提高文件系统的可靠性,在Ext3的时候引入了日志系统。日志系统用于在更改元数据(其实更改数据也可以用日志系统,但性能影响比较大)的情况下,会先写入日志系统,然后再更改,这样如果中间出现故障(例如断电,系统崩溃等)时,就可以通过日志系统进行恢复。从而避免文件系统因为故障而导致整个文件系统数据的丢失。

文件系统overlay好处 文件系统extend_数据_03


所谓日志校验,就是在日志系统的数据结构中添加校验和,这样每次写入数据的时候,都会计算校验和,并一起写入。在读取数据的时候会重新进行计算,并与校验和对比,以确定数据的正确性。这种方式在数据库系统中用的非常广泛,比如Oracle和MySQL等,每个写入的数据库都有校验和。

五、在线碎片整理

所谓碎片就是在磁盘上的一些不连续的数据,及空洞。由于碎片的存在可能导致磁盘空间利用率的降低,因为一些小的空洞导致无法重新分配使用;还有就是性能的降低,因为在逻辑上连续的数据,在磁盘物理空间上可能是分散的,这样在访问时,对于普通机械硬盘将导致其频繁摆动磁头,降低访问性能。

虽然Ext4在数据布局和分配上做了很多优化,但数据的在磁盘上产生碎片仍然在所难免。因此Ext4额外实现了一个进行在线碎片整理的特性,并配合了一个用户工具。碎片整理的原理非常简单,就是分配一个临时的连续的大文件,然后将目标文件中的数据与该文件数据进行交换,这样就能把目标文件中不连续的数据转换为连续的。