扩展文件系统(Ext)

来源:互联网 发布:js eval函数 编辑:程序博客网 时间:2024/06/05 10:43

文件系统

文件系统是操作系统用于明确存储设备(常见的有磁盘和基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。从系统角度看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,文件系统负责为用户建立文件,存入、读出、修改转储文件,控制文件的存取等。

文件系统特性

文件系统众多,其运行方式也有区别,这种区别主要与操作系统的文件数据有关。以UNIXUNIX based系统为例,这些操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,例如Linux的文件权限与文件属性等。文件系统通常会将这两部分的数据分别存放在不同的块,权限与属性放置到inode中,实际数据则放置到data block块中。另外,还有一个超级块(super block)会记录整个文件系统的整体信息,包括inodeblock的总量、使用量、剩余量等。

每个inodeblock都有编号,上述三个块的存储数据区别如下:

·super block:记录此文件系统的整体信息,包括inode/data block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;

·inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的data block号码;

·data block(简称block,下同):实际记录文件的内容,若文件太大时,会占用多个block

由于每个inodeblock都有编号,而每个文件都会占用一个inodeinode内则有文件数据放置的block号码。因此,如果能够找到文件的inode的话,那么自然就会知道这个文件所放置数据的block号码,从而读出该文件的实际数据。,其原理如下图所示:


图中浅灰色块为inode块,青蓝色块为block块。这种数据访问的方法称为索引式文件系统(indexed allocation)。

使用Windows系统的用户经常会需要进行碎片整理,而产生磁盘碎片的原因就是文件写入的block太过于离散了,文件系统读取文件时花费了大量时间在查找data block上,导致读取性能变得很差。这个时候就需要通过碎片整理将同一个文件所属的block汇合在一起。但对于Linux使用的索引式文件系统来说,基本上不需要经常进行碎片整理,但如果文件系统使用太久,经常删除/编辑/新增文件时,还是可能会造成文件数据太过于离散的问题,此时会需要整理一下。


Ext系列文件系统

Ext系列文件系统从Ext1开始就引入到了Linux内核中,直到现在最新的Ext4都是Linux默认标准的文件系统。下面主要以Ext2Ext3文件系统来说明扩展文件系统的一些基本特性。

第二代扩展文件系统(Second extended filesystem

Ext219931月加入Linux到核心支持之中,用以代替Ext1,其单一文件大小与文件系统本身的容量上限以及文件系统本身的簇大小有关。一般的X86架构电脑来说簇最大为4KB,则单一文件理论大小上限为2TB,而文件系统的容量上限为16TBExt2主要有如下几个特点:

1)当创建Ext2文件系统时,系统管理员可以根据预期的文件平均长度来选择最佳的块大小(从1024B-4096B)。

2)当创建Ext2文件系统时,系统管理员可以根据在给定大小的分区上预计存放的文件数来选择给该分区分配多少索引节点,以有效地利用磁盘空间。

3)文件系统把磁盘块分为组,形成多个块组,每个块组都有独立的inode/block/super block系统。

4)在磁盘数据块被实际使用之前,文件系统就把这些块预分配给普通文件。因此当文件的大小增加时,因为物理上相邻的几个块已被保留,这就减少了文件碎片。

5)支持快速符号链接。如果符号链接表示一个短路径名(小于或等于60个字符),就把它存放在索引节点中而不用通过由一个数据块进行转换。

Ext2文件系统的主要结构如下:



data block

Ext2文件系统中block主要为1KB2KB4KB三种大小。

除此之外,data block大小还有如下限制:

·原则上,block大小与数量在格式化完就不能再改变了,除非重新格式化;

·每个block内最多只能够放置一个文件的数据;

·承上,如果文件大于block的大小,则一个文件会占用多个block数量;

·承上,若文件小于block,则该block的剩余空间也不能再被使用了(因此磁盘空间会被浪费)。

所以,虽然块容量越大单一文件容量和系统文件容量的上限也越大,但不根据文件长度预期而盲目地选择大容量块可能会浪费大量存储空间。


inodetableinode表格)

如前所述,inode的内容主要记录文件的属性以及该文件实际数据是放置在哪些block内。基本上,inode记录的文件数据至少有下面这些:

·该文件的访问模式(read/write/execute);

·该文件的所有者与所属组(owner/group);

·该文件的大小;

·该文件创建或状态改变的时间(ctime);

·最近一次的读取时间(atime);

·最近修改的时间(mtime);

·定义文件特性的标志(flag),如SUID等;

·该文件真正内容的指向(pointer)。


inode的数量与大小也是在格式化磁盘的时候就已经固定了,除此之外inode还有如下特性:

·每个inode大小固定为128Byte

·每个文件都仅会占用一个inode

·承上,因此文件系统能够创建的文件数量与inode的数量有关;

·系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容。


由于inode要记录的数据非常多,却只有128Byte,而inode记录一个block号码要花掉4Byte,对于大文件来说要使用许多block存储数据,那么一个inode是如何记录多个block号码的呢?Ext2文件系统采用三级间接块来存储数据块指针(block号码)。示例图如下:


如上图所示,一个inode记录block号码的区域分为12个直接、1个一级间接、1个二级间接、1个三级间接记录区。以1KBblock为例,一个inode可记录12+256+65536+16777216=16843020KB≈16GB大小的数据。


superblock(超级块)

superblock是记录整个文件系统相关信息的地方,没有superblock就没有这个文件系统了。它记录的主要信息有:

·inodeblock的总量;

·未使用与已使用的inode/block数量;

·blockinode的大小;

·文件系统的挂载时间、最近一次写入时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息;

·一个validbit数值,若此文件系统已被挂载,则valid bit0,若未被挂载,则为1


每一个块组都可能含有super block。具体来说,除了第一个块组内一定会含有superblock外,其他块组不一定含有,而若含有则主要是作为第一个块组内的superblock的备份。


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

这个区段可以描述每个块组的开始与结束的block号码,以及说明每个区段(superblockbitmapinodemapdata block)分别介于哪一个block号码之间。这部分可以通过dumpe2fs来查看。


block bitmap(块对照表)

用于存储块的使用信息,为添加/删除文件提供block分配支持。

当你想要添加/删除文件时,系统通过block bitmap可以知道哪些block是空的哪些是已被使用的,从而准确有效地找到可使用的空间来处置文件。


inode bitmapinode对照表)

block bitmap是类似功能,用于存储块指针(inode)的使用信息。

一个inode的结构如下:

struct ext2_inode {__le16 i_mode; // 文件格式和访问权限__le16 i_uid; // 文件所有者ID的低16位__le32 i_size; // 文件字节数__le32 i_atime; // 文件上次被访问的时间__le32 i_ctime; // 文件创建时间__le32 i_mtime; // 文件被修改的时间__le32 i_dtime; // 文件被删除的时间(如果存在则为0)__le16 i_gid; // 文件所有组ID的低16位__le16 i_links_count; // 此inode被连接的次数__le32 i_blocks; // 文件已使用和保留的总块数(以512B为单位)__le32 i_flags; // 此inode访问数据时ext2的实现方式union {struct {__le32 l_i_reserved1; // 保留} linux1;struct {__le32 h_i_translator; // “翻译者”标签} hurd1;struct {__le32 m_i_reserved1; // 保留} masix1;} osd1; // 操作系统相关数据

第三代扩展文件系统(Third extended filesystem

作为Ext系列扩展文件系统的第三代,Ext3的文件系统结构大体与Ext2相同,因此Ext3可以向下兼容Ext2Ext3主要增加了日志、位目录跨越多个块提供基于树的目录索引、在线系统增长三个功能。如果没有这些,Ext3也同时是个有效的Ext2文件系统。这样,经过良好测试的、成熟的文件系统工具来管理和修复Ext2文件系统工具,可以无需大的变动就应用于Ext3文件系统。Ext2Ext3文件系统共享相同的工具集,带有fsck工具的e2fsprogs。这种紧密的联系也将两种文件系统之间进行转换变得非常容易。


第四代扩展文件系统(Fourth extended filesystem

Ext4文件系统的特点

·更大的文件系统和更大的文件

Ext3文件系统最多只能支持32TB的文件系统和2TB的文件,根据使用的具体架构和系统设置,实际容量上限可能比这个数字还要低,即只能容纳2TB的文件系统和16GB的文件。而Ext4的文件系统容量达到1EB,而文件容量则达到16TB,这是一个非常大的数字了。对一般的台式机和服务器而言,这可能并不重要,但对于大型磁盘阵列的用户而言,这就非常重要了。

·更多的子目录数量

Ext3目前只支持32000个子目录,而Ext4取消了这一限制,理论上支持无限数量的子目录。

·更多的块和i-节点数量

Ext3文件系统使用32位空间记录块数量和i-节点数量,而Ext4文件系统将它们扩充到64位。

·多块分配

当数据写入到Ext3文件系统中时,Ext3的数据块分配器每次只能分配一个4KB的块,如果写一个100MB的文件就要调用25600次数据块分配器,而Ext4的多块分配器“Multiblock AllocatorMBAlloc支持一次调用分配多个数据块。

·持久性预分配

如果一个应用程序需要在实际使用磁盘空间之前对它进行分配,大部分文件系统都是通过向未使用的磁盘空间写入0来实现分配,比如P2P软件。为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。而Ext4在文件系统层面实现了持久预分配并提供相应的API,比应用软件自己实现更有效率。

·延迟分配

Ext3的数据块分配策略是尽快分配,而Ext4的策略是尽可能地延迟分配,直到文件在缓冲中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,显著提升性能。

·盘区结构

Ext3文件系统采用间接映射地址,当操作大文件时,效率极其低下。例如,一个100MB大小的文件,在Ext3中要建立25600个数据块(以每个数据块大小为4KB为例)的映射表;而Ext4引入了盘区概念,每个盘区为一组连续的数据块,上述文件可以通过盘区的方式表示为该文件数据保存在接下来的25600个数据块中,提高了访问效率。

·新的i-节点结构

Ext4支持更大的i-节点。之前的Ext3默认的i-节点大小128字节,Ext4为了在i-节点中容纳更多的扩展属性,默认i-节点大小为256字节。另外,Ext4还支持快速扩展属性和i-节点保留。

·日志校验功能

日志是文件系统最常用的结构,日志也很容易损坏,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4给日志数据添加了校验功能,日志校验功能可以很方便地判断日志数据是否损坏。而且Ext4Ext3的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能[1] 

·支持无日志模式

日志总归会占用一些开销。Ext4允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。

·默认启用Barrier

磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写Commit记录。若Commit记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4文件系统默认启用Barrier,只有当Barrier之前的数据全部写入磁盘,才能写Barrier之后的数据。

·在线碎片整理

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

·支持快速fsck

以前的文件系统版本执行fsck时很慢,因为它要检查所有的i-节点,而Ext4给每个块组的i-节点表中都添加了一份未使用i-节点的列表,所以Ext4文件系统做一致性检查时就可以跳过它们而只去检查哪些在使用的i-节点,从而提高了速度。

·支持纳秒级时间戳

Ext4之前的扩展文件系统的时间戳都是以秒为单位的,这已经能够应付大多数设置,但随着处理器的速度和集成程度(多核处理器)不断提升,以及Linux开始向其他应用领域发展,它将时间戳的单位提升到纳秒。

Ext4给时间范围增加了两个位,从而让时间寿命在延长500年,Ext4的时间戳支持的日期到2514425日,而Ext3只达到2038118日。


Ext4文件系统的向前和向后兼容

Ext4文件系统在Ext3的基础之上做了很多改进,引入了大量新功能,这些改进主要是为了提高未来的Linux系统的性能。虽然Ext4做了很多改进,但依然能够与Ext3实现向后和向前的兼容性,这一点的确很难得。因为Ext3文件系统是Linux操作系统上最受欢迎的文件系统之一,所以Ext4的研发人员考虑到应该让Ext3用户能够轻松迁移到Ext4,为此,Ext4被设计为在盘区结构方面具有向后和向前的兼容性。首先Ext4是可以向前兼容的,也就是说Ext3文件系统可以挂载为Ext4文件系统使用,不过为了充分利用Ext4的优势,必须实现文件系统的迁移,以转换和利用新的Ext4格式。Ext3文件系统可以在线转换为Ext4,但这样并不能用到Ext4的全部新特性,只有将文件系统重新创建为Ext4才比较彻底。Ext4的向后兼容,向后兼容就是指可以将Ext4文件系统挂载为Ext3文件系统使用,但是前提是Ext4文件系统不能使用盘区功能。




本文部分文字内容摘自《鸟哥的Linux私房菜 基础学习篇(第三版)》和维基百科,图片选自百度图片




原创粉丝点击