文件系统之ext2,ext3和ext4

The Second Extended File System(ext2)文件系统是Linux系统中的标准文件系统,是通过对Minix的文件系统进行扩展而得到的,其存取文件的性能极好。  

在ext2文件系统中,文件由inode(包含有文件的所有信息)进行唯一标识。

 ext2文件系统采用三级间接块来存储数据块指针,并以块(block,默认为1KB)为单位分配空间。其磁盘分配策略是尽可能将逻辑相邻的文件分配到磁盘上物理相邻的块中,并尽可能将碎片分配给尽量少的文件,以从全局上提高性能。

文件数据除了文件的实际内容外,还含有文件权限(RWX)与文件属性(所有者、群组、时间参数等)。文件系统通常会把这两部分数据放到不同的块中,权限与属性放置到inode中,至于实际数据则放置到data-block中。另外,还有一个Superblock会记录文件的整体信息,包括inode与block的总量、使用量’剩余量等。

每个inode和block都有编号,这三个数据的意义简要的说明如下:

  • superblock:记录文件的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;
  • inode:记录文件属性,一个文件占用一个inode,同时记录此文件的数据所在的blick号码;
  • block:实际记录文件的内容,若文件太大,会占用多个block。

由于inode和block都有自己的编号,而每个文件都会占有一个inode,inode内则含有文件数据放置的block号码。所以,如果能找到文件的inode,那么自然就会知道数据存放到哪些block了,也可以对数据进行读取。

node/block数据访问示意图:

如图所示,文件系统先格式化出 inode 与 block的区块,假设一个文件的权限和属性是放在4号(白色方块),而这个 inode 记录了文件数据的实际的放置点为2,7,13,15这4个号码,此时我们就可以一次找到这4个block的内容!

这种数据访问的方式称为索引式文件系统(indexed allocation)。至于我们常用的U盘,使用的一般是FAT格式,这种格式的文件系统没有 inode 存在,所以每个block号码都记录在前一个block当中,如图所示:

我们经常听到“碎片整理”对吧,需要碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的性能将会变得很差所致。这个时候可以通过碎片整理将一个文件所属的block汇合在一起,读取比较容易,一般来说,Ext2不太需要经常进行碎片整理,使用太久的话,也许需要。

EXT2文件系统 

Linux的正规文件系统为Ext2.**文件系统一开始就将inode与block规划好了,除非重新格式化(后者利用resize2fs等命令更改文件),否则inode与block固定后就不再变动。**但是如果我们的文件系统高达几百GB时,把所有的inode和block放在一起是很不明智的。

因此Ext2在格式化的时候基本上是分为多个块组(block group)的,每个块组都有独立的inode/block/superblock系统。在整体的规划当中,**文件系统最前面有一个活动扇区(boot sector), 这个启动扇区可以安装引导装载程序,**这样我们就能够将不同的引导装载程序安装到个别的文件系统最前端,而不用覆盖整块硬盘的唯一MBR。

data block(数据块) 

data block是用来放置文件内容的地方,**在Ext2文件系统中所支持的block大小有1kb、2kb以及4kb三种。**在格式化时,block的大小就固定了,且每个block都有编号,以便inode记录。由于block大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。如下表格所示:

Block大小1KB2KB4KB
最大单一文件限制16GB256GB2TB
最大文件系统容量2TB8TB16TB

除此之外,Ext2文件系统的block还有哪些限制?

  • 原则上,block的大小与数量在格式化完就不能再改变了(除非重新格式化)
  • 每个block内最多只能够放置一个文件的数据
  • 如果文件大于block的大小,则就会占用多个block
  • 若文件小于block,则该block的剩余容量就不会被使用(磁盘空间浪费)

例题:

假设你的Ext2文件系统使用4K block,而改文件系统中有10000个小文件,每个文件的大小均为50 bytes,请问此时磁盘浪费多少容量?由于一个block只能容纳一个文件,所以,每个block会浪费4046 bytes,所有文件仅为:50 x 10000(bytes) = 488.3KB,但浪费却达到了:4046 x 10000(bytes) = 38.6MB。所以合适的block大小很重要。

inodetable(inode表格) 

前面已经说了,inode的内容主要记录文件的属性以及该文件实际数据的位置。基本上,它记录的文件数据有下面这些:

  • 该文件的访问模式(read/write/execute)
  • 该文件的所有者与组(owner/group)
  • 该文件的大小的各个时间(ctime/atime/mtime)
  • 定义文件特征的标志(flag),如SUID等
  • 该文件真正内容的指向(pointer)
  • 每个inode大小固定为128bytes
  • 每个文件都仅会占用一个inode

**因此文件系统能创建的文件数量与inode的数量有关。系统读取文件时需要找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容。下面我们来简单分析下inode/block与文件大小的关系。inode要记录的数据非常多,但是又只有128bytes,一个block占用4bytes。那如果我们的文件比较大,该怎么办?为此我们的系统将inode记录block号码的区域定义为12个直接、一个间接、一个双间接、一个三间接记录区。**如图所示:

以每个block的大小1KB为例来说,情况如下:

  • 12个直接指向:12 x 1K = 12K
  • 间接:256 x 1K = 256K
  • 双间接:256 x 256 x 1K = 2562K
  • 三间接:256 x 256 x 256 = 256 3K

总额:将上面的加在一起,可得到12 + 256 + 2562+ 2563(K) = 16GB.我们这下也知道了前面的最大单一文件限制是怎么来的了。

superblock(超级块) 

superblock主要是记录整个文件系统相关的地方,记录的主要信息有:

  • block与inode的总量,未使用和已使用的inode/block数量及总量
  • block与inode的大小
  • 文件系统挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)时间等
  • 一个valid bit数值,若此文件系统已经被挂载,则valid bit为0,否则为1

File system deion(文件系统描述说明) 

这个区段可以描述每个block group的开始与结束的号码,以及说明每个区段(superblock、bitmap、inodemap、data block)分别介于哪个block号码之间。也能够用dumpe2fs查看。

block bitmap(块对照表) 

我们可以通过block bitmap来知道哪些block是空的,此时系统就可以快速地找到可使用空间老放置文件。

inode bitmap(inode对照表) 

这个和block bitmap的功能是类似的,只是inode bitmap记录的是使用与未使用的号码。

 

Ext3是一种日志式文件系统,是对ext2系统的扩展,它兼容ext2。日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。因此每当系统要关机时,必须将其所有的文件系统全部shutdown后才能进行关机。 

如果在文件系统尚未shutdown前就关机如(停电)时,下次重开机后会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。然而,此一重整的工作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会流失。

  为了克服此问题,使用所谓“日志式文件系统 (Journal File System)” 。此类文件系统最大的特色是,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。

  由于资料的写入动作包含许多的细节,像是改变文件标头资料、搜寻磁盘可写入空间、一个个写入资料区段等等,每一个细节进行到一半若被中断,就会造成文件系统的不一致,因而需要重整。

  然而,在日志式文件系统中,由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据这些记录直接回溯并重整被中断的部分,而不必花时间去检查其他的部分,故重整的工作速度相当快,几乎不需要花时间。

Ext3日志文件系统特点

  1、高可用性

  系统使用了ext3文件系统后,即使在非正常关机后,系统也不需要检查文件系统。宕机发生后,恢复ext3文件系统的时间只要数十秒钟。

  2、数据的完整性

  ext3文件系统能够极大地提高文件系统的完整性,避免了意外宕机对文件系统的破坏。在保证数据完整性方面,ext3文件系统有2种模式可供选择。其中之一就是“同时保持文件系统及数据的一致性”模式。采用这种方式,你永远不再会看到由于非正常关机而存储在磁盘上的垃圾文件。

  3、文件系统的速度

  尽管使用ext3文件系统时,有时在存储数据时可能要多次写数据,但是,从总体上看来,ext3比ext2的性能还要好一些。这是因为ext3的日志功能对磁盘的驱动器读写头进行了优化。所以,文件系统的读写性能较之Ext2文件系统并来说,性能并没有降低。

  4、数据转换

   由ext2文件系统转换成ext3文件系统非常容易,只要简单地键入两条命令即可完成整个转换过程,用户不用花时间备份、恢复、格式化分区等。用一个ext3文件系统提供的小工具tune2fs,它可以将ext2文件系统轻松转换为ext3日志文件系统。另外,ext3文件系统可以不经任何更改,而直接加载成为ext2文件系统。

  5、多种日志模式

  Ext3有多种日志模式,一种工作模式是对所有的文件数据及metadata(定义文件系统中数据的数据,即数据的数据)进行日志记录(data=journal模式);另一种工作模式则是只对metadata记录日志,而不对数据进行日志记录,也即所谓data=ordered或者data=writeback模式。系统管理人员可以根据系统的实际工作要求,在系统的工作速度与文件数据的一致性之间作出选择。

Ext4(The fourth extended file system)

  Ext4是一种针对ext3系统的扩展日志式文件系统,是专门为 Linux 开发的原始的扩展文件系统(ext 或 extfs)的第四版。 Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能。

  相对于Ext3,特点如下:

  1. 与 Ext3 兼容。 执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。

  2. 更大的文件系统和更大的文件。 较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。

  3. 无限数量的子目录。 Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。

  4. Extents。 Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在 Ext3 中要建立 25,600 个数据块(每个数据块大小为 4KB)的映射表。而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。

  5. 多块分配。 当 写入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。

  6. 延迟分配。 Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。

  7. 快速 fsck。 以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。

  8. 日志校验。 日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。

  9. “无日志”(No Journaling)模式。 日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。

  10. 在线碎片整理。 尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。

  11. inode 相关特性。 Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。

  12. 持久预分配(Persistent preallocation)。 P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。 Ext4 在文件系统层面实现了持久预分配并提供相应的 API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。

  13. 默认启用 barrier。 磁 盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 "mount -o barrier=0" 命令禁用该特性。)

相关命令:

1. 查看inode 可用空间 

df -i

2. 查看块组信息

dumpe2fs  device

2. 查看文件系统类型

df -T

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值