精华内容
下载资源
问答
  • 在windows下使用Ext2Fsd可以访问EXT4格式的分区,试试吧
  • ext4文件系统源码

    2015-01-04 16:11:13
    包含完整的ext4文件系统的源代码,提供给大家学习和参考。
  • make_ext4fs.zip

    2015-11-05 17:57:12
    make_ext4fs工具,包括make_ext4fs、mkuserimg.sh、simg2img三个文件。
  • 可以读写Ext2,以Ext2方式挂载Ext3文件系统(不支持Ext3日志),不支持中文! It provides Windows NT4.0/2000/XP/2003/Vista/2008 with full access to Linux Ext2 volumes (read access andwrite access). This ...
  • make_ext4fs工具

    热门讨论 2015-02-09 12:50:31
    Android提供的制作ext4文件分区镜像的工具。Linux平台。
  • 使用该工具可以直接将image文件载入ext4分区,安卓刷机必备,android
  • make_ext4fs

    热门讨论 2015-01-17 11:33:31
    Android中制作ext4压缩分区镜像的工具,可以将一个目录打包成为system.img文件。
  • 目前越来越多的Android手机放弃了nand, 更多采用了emmc为内部存储设备。...以emmc为存储设备的android手机,其文件系统(/system,/data两个分区)一般采用ext4格式。 下面讲述如何解压和生成 system.img。
  • Linux Ext2/Ext3/Ext4文件系统

    千次阅读 2019-05-18 19:43:00
    四、Ext4文件系统 一、Ext2磁盘结构 Ext2文件系统的磁盘结构如下图: 任何Ext2分区的第一个块都是引导块,引导块保存了分区和内核启动加载器相关的信息,不受文件系统管理。其余磁盘块被Ext2分成块组,每组...

    目录

    一、Ext2磁盘结构

    二、Ext2 索引节点和数据块管理

    三、Ext3文件系统

    四、Ext4文件系统


    一、Ext2磁盘结构

          Ext2文件系统的磁盘结构如下图:

          任何Ext2分区的第一个块都是引导块,引导块保存了分区和内核启动加载器相关的信息,不受文件系统管理。其余磁盘块被Ext2分成块组,每组包含的数据块和索引节点等都存放在相邻的磁道上,所有的块组大小相同且顺序的存放在磁盘上,内核可以根据块组的整数索引很快计算该块组在磁盘上的具体位置。由于内核尽可能的把同一个文件的数据块存放在同一个块组中,所以块组减少了文件碎片,减少了访问该文件的磁盘平均寻道时间。每个块组都包含如下信息:

     1、超级块

          是描述文件系统相关信息的超级块的一个拷贝,数据结构为ext2_super_block,主要记录了索引节点总数,块总数,空闲块数,空闲索引节点数,每块组的块数和索引节点数,分区的状态,安装操作计数器和最后一次安装时间等,用于文件系统一致性检查。

    2、组描述符

        记录当前块组相关信息,数据结构为ext2_group_desc,主要包含数据块位图,索引节点位图对应的块号,第一个索引节点表块的块号,组中空闲块和空闲索引节点的个数,即可以根据组描述符快速定位数据块位图,索引节点位图和索引节点表。

    3、数据库块位图和索引节点位图

         位图就是位的序列,其中0表示该位对应的数据块或者索引节点是空闲的,1表示占用的,每个位图都存放在单独的块中,比如块的大小是1024字节,可以描述的1024*8=8192个块的状态。根据位图可以快速定位处于空闲的数据块或者索引节点。

    4、索引节点表 

         索引节点表就是一组连续的索引节点,存放在一组连续的磁盘块上,第一个磁盘块的块号保存在组描述符中的bg_inode_table字段中。所有的索引节点大小相同,即128字节,比如大小为4096字节的块可以包含32个索引节点。每个Ext2索引节点的数据结构为ext2_innode,主要包含了文件类型,文件访问控制列表,目录访问控制列表,文件大小,文件数据块数,最后访问时间,最后修改时间,指向第一个数据块的指针等文件属性信息。

        索引节点大小有限制,如果需要增加其他的文件属性则需要使用增强属性机制,增加的属性都保存在一个单独的数据块中,索引节点的i_file_acl字段指向该数据块,linux提供setxattr(),getxattr(),listxattr()等系统调用来处理增强属性。增强属性机制主要是为了实现ACL访问控制列表而引入的,通过该列表可以限定某个文件允许访问的用户或者用户组及其对应的权限。

    5、数据块

          不同文件类型使用数据块的方式不同,主要有以下几种情形:

    • 普通文件在创建时是空的,不需要数据块,只有写入数据时才分配数据块,也可通过truncate()系统调用清空其对应的数据块。
    • 目录对应的数据块是一个特殊的数据结构,ext2_dir_entry_2,包含了索引节点号,目录项长度,文件名长度,文件类型和文件名5个属性,根据索引节点号可以快速定位对应的索引节点,根据目录项长度可以找到下一个目录项的起始地址。
    •  符号链接的数据块取决于符号链接的路径名长度,如果小于60个字符则放在索引节点的i_blocks字段,如果大于60个字符则采用跟目录相同的数据块。
    •  设备文件,管道和套接字都不需要数据块,相关信息都存放在索引节点中

         参考:Linux Ext2 数据结构及文件存储解析

    二、Ext2 索引节点和数据块管理

       Linux上通过superformat或者fdformat程序格式化磁盘,然后通过mke2fs程序创建Ext2文件系统,创建时需要指定块大小和分配的索引节点个数,保留块的百分比(默认5%),然后初始化所有的块组的组描述符,索引节点表和位图等,对有缺陷的块会用一个链表组织起来放到lost+found目录下。

       创建索引节点即文件或者目录等时,会先从父目录所属的块组开始往后查找空闲索引节点足够多的合适的块组,然后根据该该块组的索引节点位图找到一个空闲的索引节点,将相应的位置位,初始化索引节点属性和访问控制列表,更新关联的计数器属性和链表,最后将包含该索引节点的磁盘块读入页高速缓存中并返回新索引节点对象的地址。

       删除索引节点时会根据索引节点号和每个块组包含的索引节点数找到该索引节点所属的块组,找到对应的索引节点位图,更新关联的计数器,将位图对应的位置0。删除索引节点前必须删除内核相关的数据结构,删除指向该索引节点的硬链接并回收对应的数据块。

       从相对于文件起始位置的偏移量f开始读取a字节时,需要根据f和块大小计算偏移量f的字节所处的文件块号,因为数据块在磁盘上不一定是连续存储,所以需要将文件块号同相对于磁盘分区起始位置的逻辑块号建立映射,Ext2是通过索引节点内的i_block字段保存对应映射关系,该字段是一个定长的数组,长度通过EXT2_N_BLOCKS指定,默认为15。前12个数组元素表示0-11文件块号对应的逻辑块号;下标为12的元素包含的逻辑块号指向的数据块包含一个数组,假设块大小为b字节,逻辑块号为4字节,能够映射的文件块号的范围是12~b/4+11; 下标为13的元素包含的逻辑块号指向的数据块包含一个数组,数组每个元素包含的逻辑块号对应的数据块同样包含一个数组,即二级间接映射,能够映射的文件块号范围是b/4+12~(b/4)^2+b/4+11; 下标为14的元素为三级映射,能够映射的文件块号范围是(b/4)^2+b/4+12~(b/4)^3+(b/4)^2+b/4+11,如下图所示:

        

        如果读取的文件块号小于12,则两次磁盘访问就可以读取目标数据,一次找到逻辑块号,一次读取逻辑块号对应的磁盘块,如果大于12个则可能需要多次访问磁盘,因为索引节点和数据块的数据都在页高速缓存中,所以可以极大的减少磁盘访问次数,提高访问效率。上述数据块的查找机制表明块的大小会直接影响寻址方式并限制文件系统支持的文件最大字节数,如下图:

          文件的洞是普通文件的一部分,具体来说是一堆随机数量的空字符,但是这些空字符不存放在磁盘上,通常用于对文件做散列。每个索引节点的i_size字段定义程序所看到的文件大小,包含洞的,i_blocks字段存放实际分配给文件的以512字节为单位的有效的数据块的数量,即i_size会大于i_blocks算出来的文件大小。

         进程创建一个新的文件时只是创建了一个新的索引节点,只有当有数据需要写入该文件时才会分配数据块,分配数据块通过ext2_get_block()函数完成,如果存在未写满数据的已分配数据块则返回该数据块,否则分配一个新的空闲的数据块,在获取目标块的同时,Linux也会给文件分配一组多达8个的相邻的预分配块。为了减少文件碎片,Ext2首先在预分配块中查找符合条件的目标块,如果失败则尽可能在已分配给文件的最后一个块的附近找一个新块,如果失败则尝试在包含该索引节点的块组找一个空闲的块,还是失败则从邻近的块组中查找空间的块。

       当进程删除文件或者将文件大小设置为0时必须释放文件所属的所有数据块,通过ext2_truncate()函数完成。该函数会扫描i_block字段,找到该文件的所有的逻辑块号,然后循环调用ext2_free_blocks()函数来逐一释放这些块,释放时会找到数据块所属的块组的数据块位图,将对应的位置0,然后更新相关计数器即可。

         参考:ext2文件系统

    三、Ext3文件系统

        Linux系统启动过程中会调用e2fsck程序检查文件系统超级块对象的s_mount_state字段,如果他不等于EXT2_VALID_FS,说明文件系统因为断电故障或者系统崩溃等原因未正常退出,此时保存在内存中的未及时刷新到磁盘上的相关数据结构可能处于不一致状态,e2fsck程序就开始检查并适当修正磁盘上文件系统的所有数据结构。这种文件系统一致性检查的所花费的时间取决于要检查的文件数和目录数,随着磁盘容量扩大,文件数和目录数不断增加,耗时也不断加长。为了避免这种耗时性的一致性检查引入了日志文件系统,通过一个特殊的磁盘区来记录磁盘的写操作,这种记录就叫做日志,当文件系统不一致后通过日志来修复相关数据结构就很快了,因为可以通过日志很快定位故障前发生修改的磁盘数据结构。所谓日志是指执行任何磁盘写操作时,先把待写的块的副本写入日志中,等写入日志的I/O数据传送完成时就会开始该块与对应磁盘逻辑块之间的I/O数据传输,即正常的磁盘写入,等写入完成,日志中的块副本就会被丢弃,视为无效的。当从系统故障中恢复时,e2fsck程序会将故障前已经提交到日志的未写入磁盘的块副本重新写入文件系统,故障前未提交到日志的未写入磁盘块则忽略,保证一定程度的数据一致性。

        Ext3是Ext2的增强版,与Ext2兼容,其磁盘数据结构与Ext2基本相同,在Ext2的基础上重点强化了日志功能。文件系统通常有两种块,包含元数据的块和包含普通文件数据的块,Ext2和Ext3中元数据是指超级块,块组描述符,索引节点,位图块等,不同文件系统使用不同的元数据。Ext3支持将元数据块和普通文件数据块都写入日志中,具体提供了三种不同大的日志模式:

    1. 日志(journal),文件系统的所有文件数据和元数据的改变都写入日志中。该模式减少了文件修改丢失,但是增加了额外的磁盘开销,是最安全和最慢的模式
    2. 预定(ordered),只有文件系统的元数据的修改才写入日志,但是保证当元数据块和相关的文件数据块都需要写入磁盘时,文件数据块会比元数据块先写入磁盘,此时元数据块已经在日志中保存了一个副本。该模式是Linux的默认模式,可以减少普通文件修改的丢失,因为要维护元数据块和普通文件块的相关性和两者的磁盘写入顺序,相比写回模式有轻微的性能损耗。
    3. 写回(writeback),只有文件系统的元数据的修改才写入日志,对元数据块和普通文件数据块写入磁盘的顺序不做限制,由页高速缓存的脏页刷新机制决定。该模式是其他日志文件系统使用的方式,是最快的模式,但是当系统故障时存在文件损坏的风险。

    可以通过mount命令在设备挂载的时候指定日志模式,如mount –t ext3 –odata=writeback /dev/sda2 /jdisk。

         Ext3的日志通常放在根目录下名称.journal的隐藏文件中,Ext3本身不处理日志,而是借助日志块设备(JDB)的通用内核层实现,JDB本身必须保证所有的日志记录不能因系统故障而损坏。Ext3与JDB交互时基于以下三个单元:

        1、日志记录,本质是对文件系统将要执行的一次低级操作的描述,JDB层使用的日志记录是由低级操作所修改的整个缓冲区组成,日志记录在日志内部表现为普通的数据块。

        2、原子操作处理,即一个系统调用对磁盘数据结构的一组低级操作,当从系统故障中恢复时,文件系统确保这组低级操作要么都成功,要么都失败。

        3、事务,将一个处理如一次函数调用涉及的多个原子操作处理放在一个事务中,一个事务下的所有日志记录都存放在日志的连续块中,只有当该事务下所有的日志记录的块副本都写入磁盘即事务已完成时才会回收该事务使用的块,即丢弃该事务下所有的日志记录。事务一旦被创建就能接受新的原子操作处理,当事务持续的时间超过5s或者没有空闲块保存日志记录则会停止接受新的原子处理。事务未完成时按照其是否接受新的原子操作处理分为以下几种状态:

    •      T_RUNNING,还在接受新的原子操作处理
    •      T_LOCKED,不接受新的原子操作处理,其中一部分未完成
    •     T_FLUSH,所有原子操作都已完成,磁盘写入未完成
    •     T_COMMIT,所有的日志记录都已写入磁盘,此时事务被标记为未完成

    日志中可能包含多个事务,任何时刻只有一个事务出于T_RUNNING状态下,称为活动事务。

           参考:《深入理解Linux内核》(第三版)

                       Ext3日志原理

    四、Ext4文件系统

         Ext4完全向后兼容Ext3,其磁盘数据结构与Ext3基本一致,因为是基于Ext3做的改进,所以Ext4对Linux只是一种临时的过渡解决方案,最终会被一种全新的下一代文件系统取代。目前Ext4尚未完全成熟,部分新特性如数据校验和、一流的配额支持和大分配块等还在开发完善中,其与Ext3的主要区别如下:

    1. ext3 文件系统使用 32 位寻址,这限制它最大支持 2 TiB 文件大小和 16 TiB 文件系统系统大小;ext4 使用 48 位寻址,理论上可以在文件系统上分配高达 16 TiB 大小的文件,其中文件系统大小最高可达 1000000 TiB(1 EiB)
    2. ext3目前只支持32,000个子目录,而ext4支持无限数量的子目录。
    3. ext4引入区段extent,extent是存放文件块号和逻辑块号映射关系的数据结构,是对Ext3中inode数据结构的一个改进,从而节省大文件下多次访问磁盘获取索引节点表的性能开销。
    4. ext4增加了日志校验,检查日志文件的正确和完整性,避免被非法篡改
    5. ext3 提供粒度为一秒的时间戳,ext4 通过纳秒级的时间戳
    6. ext2 和 ext3 都不直接支持在线碎片整理 —— 即在挂载时会对文件系统进行碎片整理,ext4 通过 e4defrag 提供支持

    参考:   Linux.ext4文件系统.inode和extent

                  深入理解 ext4 等 Linux 文件系统

     

    展开全文
  • Windows读取Ext4分区的工具 Ext2Read

    热门讨论 2012-09-17 11:24:00
    Ext2Read 它能查看 ext2/3/4 分区并从中拷贝文件和目录,支持 LVM2 和 EXT4 extent ,以及递归拷贝整个目录。
  • Windows 7下使用Ext2Fsd读取写入Linux Ext3&Ext4分区文件
  • ext4_utils android rom 解包

    热门讨论 2013-01-22 07:58:53
    ext4_utils android rom 解包工具, 三星 i9300 rom转换 2020.2.15更新:删除下载积分要求,全部免分下载
  • Linux EXT4文件系统简介

    千次阅读 2020-07-07 13:05:19
    我想更详细地了解EXT文件系统的细节,但是首先让我们回答以下问题:“什么是文件系统?” 文件系统包括以下所有内容: 数据存储:任何文件系统的主要功能都应该是存储和检索数据的结构化场所。 命名空间:一种...

    在先前有关Linux文件系统的文章中,我写了Linux文件系统的介绍以及一些更高级的概念,例如, 一切都是文件 。 我想更详细地了解EXT文件系统的细节,但是首先让我们回答以下问题:“什么是文件系统?” 文件系统包括以下所有内容:

    1. 数据存储:任何文件系统的主要功能都应该是存储和检索数据的结构化场所。
    2. 命名空间:一种命名和组织方法,提供命名和结构化数据的规则。
    3. 安全模型:一种用于定义访问权限的方案。
    4. API:系统函数调用,用于操作文件系统对象,例如目录和文件。
    5. 实现:该软件可以实现上述功能。

    本文重点介绍列表中的第一项,并探讨了元数据结构,这些元数据结构为EXT文件系统中的数据存储提供了逻辑框架。

    EXT文件系统历史记录

    尽管EXT文件系统是为Linux编写的,但其根源是Minix操作系统和Mi​​nix文件系统,它们早于Linux大约五年,于1987年首次发布。了解EXT4文件系统要容易得多,如果我们回顾一下历史和技术从Minix根源扩展EXT文件系统系列。

    极小

    在编写原始的Linux内核时,Linus Torvalds需要一个文件系统,但是不想编写一个文件系统。 因此,他只是包含了Minix文件系统 ,该文件系统Andrew S. Tanenbaum编写,是Tanenbaum的Minix操作系统的一部分。 Minix是用于教育目的的类Unix操作系统。 它的代码是免费提供的,并获得了适当的许可,以允许Torvalds将其包括在他的第一个Linux版本中。

    Minix具有以下结构,其中大多数位于生成文件系统的分区中:

    • 安装了硬盘驱动器的第一个扇区中的引导扇区 。 引导块包括一个很小的引导记录和一个分区表。
    • 每个分区中的第一个是一个超级块 ,其中包含元数据,该元数据定义了其他文件系统结构,并将它们定位在分配给该分区的物理磁盘上。
    • 索引节点位图块 ,它确定使用哪些索引节点和哪些索引节点空闲。
    • 索引节点 ,在磁盘上有自己的空间。 每个inode包含有关一个文件的信息,包括数据块的位置,即属于该文件的区域。
    • 区域位图 ,用于跟踪已使用和可用的数据区域。
    • 实际存储数据的数据区

    对于两种类型的位图,一位代表一个特定的数据区域或一个特定的inode。 如果该位为零,则该区域或索引节点是空闲的并且可以使用,但是如果该位为1,则该数据区域或索引节点在使用中。

    什么是inode ? 索引节点的缩写,索引节点是磁盘上的256字节块,用于存储有关文件的数据。 这包括文件的大小; 文件的用户和组所有者的用户标识; 文件模式(即访问权限); 和三个时间戳记,它们指定以下时间和日期:上次访问文件,上次修改文件和上一次修改inode中的数据。

    索引节点还包含指向硬盘驱动器上文件数据位置的数据。 在Minix和EXT1-3文件系统中,这是数据区或块的列表。 Minix文件系统inode支持九个数据块,七个直接块和两个间接块。 如果您想了解更多信息,可以在Wikipedia上找到一份出色的PDF,其中包含Minix文件系统结构的详细说明和inode指针结构的快速概述。

    外部

    最初的EXT文件系统 (扩展)由RémyCard编写,并于1992年随Linux发行,以克服Minix文件系统的某些大小限制。 主要的结构更改是基于Unix文件系统(UFS)(也称为Berkeley快速文件系统(FFS))的文件系统的元数据。 我发现很少有关于EXT文件系统的公开信息可以验证,显然是因为它存在重大问题,并很快被EXT2文件系统所取代。

    EXT2

    EXT2文件系统非常成功。 它在Linux发行版中使用了很多年,它是我在1997年左右开始使用Red Hat Linux 5.0时遇到的第一个文件系统。EXT2文件系统具有与EXT文件系统基本相同的元数据结构,但是EXT2更向前看起来,元数据结构之间留有很多磁盘空间供将来使用。

    与Minix一样,EXT2在其安装的硬盘驱动器的第一个扇区中有一个引导扇区 ,其中包括一个很小的引导记录和一个分区表。 然后,引导扇区之后会有一些保留空间,该空间跨越引导记录和硬盘驱动器上的第一个分区之间的空间,该分区通常位于下一个柱面边界上。 GRUB2(可能还有GRUB1)使用此空间作为其引导代码的一部分。

    每个EXT2分区中的空间都分为多个圆柱组,以便对数据空间进行更精细的管理。 根据我的经验,组大小通常约为8MB。 下面的图1显示了气缸组的基本结构。 圆柱体中的数据分配单元是块,其大小通常为4K。

    cylindergroup-01_1.png

    图1:EXT文件系统中的柱面组的结构

    柱面组中的第一个块是一个超级块,其中包含定义其他文件系统结构并将其定位在物理磁盘上的元数据。 分区中的某些其他组将具有备份超级块,但不是全部。 损坏的超级块可以通过使用诸如dd之类的磁盘实用程序来替换,以将备份超级块的内容复制到主超级块。 它并不经常发生,但是很多年前,我有一个损坏的超级块,我能够使用其中一个备份超级块来还原其内容。 幸运的是,我已经有所预见,并使用dumpe2fs命令来转储系统上分区的描述符信息。

    以下是dumpe2fs命令的部分输出。 它显示了超级块中包含的元数据,以及有关文件系统中前两个柱面组中的每个柱面组的数据。

    
    
       
    # dumpe2fs /dev/sda1
    Filesystem volume name:   boot
    Last mounted on:           / boot
    Filesystem UUID:          79fc5ed8-5bbc-4dfe- 8359 -b7b36be6eed3
    Filesystem magic number:  0xEF53
    Filesystem revision #:    1 (dynamic)
    Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir nlink extra_isize
    Filesystem flags:         signed_directory_hash
    Default mount options:    user_xattr acl
    Filesystem state:         clean
    Errors behavior:          Continue
    Filesystem OS type:       Linux
    Inode count:               122160
    Block count:               488192
    Reserved block count:     24409
    Free blocks:               376512
    Free inodes:               121690
    First block:               0
    Block size:               4096
    Fragment size:             4096
    Group descriptor size:     64
    Reserved GDT blocks:       238
    Blocks per group:         32768
    Fragments per group:       32768
    Inodes per group:         8144
    Inode blocks per group:   509
    Flex block group size:     16
    Filesystem created:       Tue Feb   7 09: 33 : 34 2017
    Last mount time:          Sat Apr 29 21 : 42 :01 2017
    Last write time:          Sat Apr 29 21 : 42 :01 2017
    Mount count:               25
    Maximum mount count:       -1
    Last checked:             Tue Feb   7 09: 33 : 34 2017
    Check interval:           0 ( < none > )
    Lifetime writes:           594 MB
    Reserved blocks uid:       0 ( user root )
    Reserved blocks gid:       0 ( group root )
    First inode:               11
    Inode size:               256
    Required extra isize:     32
    Desired extra isize:       32
    Journal inode:             8
    Default directory hash:   half_md4
    Directory Hash Seed:      c780bac9-d4bf-4f35-b695-0fe35e8d2d60
    Journal backup:           inode blocks
    Journal features:         journal_64bit
    Journal size:             32M
    Journal length:           8192
    Journal sequence:         0x00000213
    Journal start:             0


    Group 0 : ( Blocks 0 - 32767 )
     Primary superblock at 0 , Group descriptors at 1 - 1
     Reserved GDT blocks at 2 - 239
     Block bitmap at 240 ( + 240 )
     Inode bitmap at 255 ( + 255 )
     Inode table at 270 - 778 ( + 270 )
      24839 free blocks, 7676 free inodes, 16 directories
     Free blocks: 7929 - 32767
     Free inodes: 440 , 470 - 8144
    Group 1 : ( Blocks 32768 - 65535 )
     Backup superblock at 32768 , Group descriptors at 32769 - 32769
     Reserved GDT blocks at 32770 - 33007
     Block bitmap at 241 ( bg #0 + 241)
     Inode bitmap at 256 ( bg #0 + 256)
     Inode table at 779 - 1287 ( bg #0 + 779)
      8668 free blocks, 8142 free inodes, 2 directories
     Free blocks: 33008 - 33283 , 33332 - 33791 , 33974 - 33975 , 34023 - 34092 , 34094 - 34104 , 34526 - 34687 , 34706 - 34723 , 34817 - 35374 , 35421 - 35844 , 35935 - 36355 , 36357 - 36863 , 38912 - 39935 , 39940 - 40570 , 42620 - 42623 , 42655 , 42674 - 42687 , 42721 - 42751 , 42798 - 42815 , 42847 , 42875 - 42879 , 42918 - 42943 , 42975 , 43000 - 43007 , 43519 , 43559 - 44031 , 44042 - 44543 , 44545 - 45055 , 45116 - 45567 , 45601 - 45631 , 45658 - 45663 , 45689 - 45695 , 45736 - 45759 , 45802 - 45823 , 45857 - 45887 , 45919 , 45950 - 45951 , 45972 - 45983 , 46014 - 46015 , 46057 - 46079 , 46112 - 46591 , 46921 - 47103 , 49152 - 49395 , 50027 - 50355 , 52237 - 52255 , 52285 - 52287 , 52323 - 52351 , 52383 , 52450 - 52479 , 52518 - 52543 , 52584 - 52607 , 52652 - 52671 , 52734 - 52735 , 52743 - 53247
     Free inodes: 8147 - 16288
    Group 2 : ( Blocks 65536 - 98303 )
     Block bitmap at 242 ( bg #0 + 242)
     Inode bitmap at 257 ( bg #0 + 257)
     Inode table at 1288 - 1796 ( bg #0 + 1288)
      6326 free blocks, 8144 free inodes, 0 directories
     Free blocks: 67042 - 67583 , 72201 - 72994 , 80185 - 80349 , 81191 - 81919 , 90112 - 94207
     Free inodes: 16289 - 24432
    Group 3 : ( Blocks 98304 - 131071 )

    < snip >

    每个柱面组都有自己的inode位图,用于确定该组中使用了哪些inode,哪些空闲。 每个组中的inode都有自己的空间。 每个索引节点包含有关一个文件的信息,包括属于该文件的数据块的位置。 块位图跟踪文件系统中已使用和可用的数据块。 注意,在上面显示的输出中,有很多关于文件系统的数据。 在非常大的文件系统上,组数据的长度可以达到数百页。 组元数据包括该组中所有空闲数据块的列表。

    EXT文件系统实施了数据分配策略,以确保文件碎片最少。 减少碎片可以提高文件系统性能。 下文在EXT4的部分中介绍了这些策略。

    我在某些情况下遇到的EXT2文件系统最大的问题是,崩溃后可能要花费数小时才能恢复,因为fsck (文件系统检查)程序花费很长时间来定位和纠正文件系统中的任何不一致之处。 一次崩溃后,我的其中一台计算机在重新启动后完全花了28个小时才恢复了磁盘,那时磁盘的大小只有几百兆字节。

    EXT3

    EXT3文件系统的唯一目标是克服fsck程序完全恢复由于文件更新操作期间发生的不当关机而损坏的磁盘结构所需的大量时间。 EXT文件系统唯一的补充是journal ,它预先记录了将对文件系统执行的更改。 其余磁盘结构与EXT2中的相同。

    EXT3中的日志不是像以前的版本那样直接将数据写入磁盘的数据区域,而是将文件数据及其元数据写入磁盘上的指定区域。 一旦数据安全地放在硬盘驱动器上,就可以将其合并或附加到目标文件中,而丢失数据的几率几乎为零。 由于此数据已提交到磁盘的数据区域,因此会更新日志,以便在系统发生故障时,在提交日志中的所有数据之前,文件系统将保持一致状态。 在下一次引导时,将检查文件系统是否存在不一致,然后将日志中剩余的数据提交到磁盘的数据区域,以完成对目标文件的更新。

    日记功能确实会降低数据写入性能,但是日记功能有三个可用选项,允许用户在性能,数据完整性和安全性之间进行选择。 我个人偏爱安全性,因为我的环境不需要大量的磁盘写入活动。

    日志功能最多可将故障后检查硬盘驱动器不一致的时间从数小时(甚至数天)减少到仅几分钟。 这些年来,我遇到了很多使系统崩溃的问题。 这些细节可能会充斥另一篇文章,但足以说明大多数是自安装的,例如拔出电源插头。 幸运的是,EXT日志文件系统已将启动恢复时间减少到两到三分钟。 另外,自从我开始将EXT3与日记一起使用以来,我从未遇到过数据丢失的问题。

    可以关闭EXT3的日记功能,然后将其用作EXT2文件系统。 日记本本身仍然存在,为空且未使用。 只需使用type参数使用mount命令重新挂载分区,以指定EXT2。 您可以从命令行执行此操作,具体取决于您正在使用的文件系统,但可以在/ etc / fstab文件中更改类型说明符,然后重新启动。 我强烈建议不要将EXT3文件系统安装为EXT2,因为这可能会丢失数据并延长恢复时间。

    可以使用以下命令通过添加日志将现有的EXT2文件系统升级到EXT3。

    
    tune2fs -j / dev / sda1 
    

    / dev / sda1是驱动器和分区标识符。 确保更改/ etc / fstab中的文件类型说明符,然后重新挂载分区或重新引导系统,以使更改生效。

    EXT4

    EXT4文件系统主要提高了性能,可靠性和容量。 为了提高可靠性,添加了元数据和日记校验和。 为了满足各种关键任务要求,文件系统时间戳得到了改进,增加了几秒钟的间隔。 在timestamp字段中添加两个高阶位至少可以将EXT4文件系统的2038年问题推迟到2446年。

    在EXT4中,数据分配从固定块更改为扩展区。 范围通过其在硬盘驱动器上的开始和结束位置来描述。 这样就可以在单个inode指针条目中描述很长的,物理上连续的文件,这可以大大减少描述较大文件中所有数据位置所需的指针数量。 EXT4中已实施了其他分配策略,以进一步减少碎片。

    EXT4通过在磁盘上散布新创建的文件来减少碎片,从而使它们不会像许多早期的PC文件系统那样在磁盘的开头集中在一个位置。 文件分配算法试图在圆柱组之间尽可能均匀地分布文件,并且在需要分段时,要使不连续的文件范围尽可能与同一文件中的其他文件区保持尽可能近的距离,以最大程度地减少磁头查找和旋转延迟尽可能。 创建新文件或扩展现有文件时,可以使用其他策略来预分配额外的磁盘空间。 这有助于确保扩展文件不会自动导致其碎片化。 新文件绝不会在现有文件之后立即分配,这也可以防止现有文件碎片化。

    除了磁盘上数据的实际位置以外,EXT4还使用诸如延迟分配之类的功能策略来允许文件系统在分配空间之前收集所有写入磁盘的数据。 这样可以提高数据空间连续的可能性。

    较旧的EXT文件系统(例如EXT2和EXT3)可以作为EXT4挂载,以提高性能。 不幸的是,这需要关闭EXT4的一些重要的新功能,因此我建议不要这样做。

    自Fedora 14以来,EXT4一直是Fedora的默认文件系统。可以使用Fedora文档中描述的过程将EXT3文件系统升级到EXT4,但是由于残留的EXT3元数据结构,其性能仍然会受到影响。 从EXT3升级到EXT4的最佳方法是备份目标文件系统分区上的所有数据,使用mkfs命令将空的EXT4文件系统写入该分区,然后从备份中还原所有数据。

    索引节点

    如前所述,索引节点是EXT文件系统中元数据的关键组成部分。 图2显示了索引节点和存储在硬盘驱动器上的数据之间的关系。 此图是单个文件的目录和索引节点,在这种情况下,该文件可能会高度分散。 EXT文件系统积极地工作以减少碎片,因此,您几乎不可能看到具有如此众多间接数据块或扩展数据块的文件。 实际上,正如您将在下面看到的那样,EXT文件系统中的碎片非常少,因此大多数inode只会使用一个或两个直接数据指针,而不会使用任何间接指针。

    inodesanddataallocation-01_0.png

    图2:inode存储有关每个文件的信息,并使EXT文件系统能够找到属于该文件的所有数据。

    索引节点不包含文件名。 通过目录条目访问文件,该目录条目本身就是文件的名称,并包含指向inode的指针。 该指针的值是索引节点号。 文件系统中的每个索引节点都有唯一的ID号,但是同一台计算机(甚至同一硬盘驱动器)上其他文件系统中的索引节点可以具有相同的索引节点号。 这对链接有影响,并且该讨论超出了本文的范围。

    索引节点包含有关文件的元数据,包括其类型和权限以及其大小。 索引节点还包含15个指针的空间,这些指针描述了圆柱组的数据部分中数据块或扩展区的位置和长度。 十二个指针提供对数据扩展区的直接访问,并且应该足以处理大多数文件。 但是,对于具有较大碎片的文件,有必要以间接节点的形式具有一些其他功能。 从技术上讲,这些并不是真正的inode,因此为了方便起见,在此使用术语“节点”。

    间接节点是文件系统中的普通数据块,仅用于描述数据而不用于元数据的存储,因此可以支持15个以上的条目。 例如,一个4K的块大小可以支持512个4字节的间接节点,从而允许单个文件有12个(直接)+ 512个(间接)= 524个扩展区。 还支持双重和三重间接节点支持,但是我们大多数人不太可能遇到需要这么多扩展的文件。

    数据碎片

    对于许多较旧的PC文件系统,例如FAT(及其所有变体)和NTFS,碎片化已成为一个严重的问题,导致磁盘性能下降。 碎片整理本身就是一个行业,它使用了不同品牌的碎片整理软件,范围从非常有效到只有很少。

    Linux的扩展文件系统使用数据分配策略,这些策略有助于最大程度地减少硬盘驱动器上文件的碎片,并在碎片确实发生时减少碎片的影响。 您可以在EXT文件系统上使用fsck命令来检查整个文件系统的碎片。 以下示例检查了我的主工作站的主目录,该主目录的碎片只有1.5%。 确保使用-n参数,因为它防止fsck对扫描的文件系统执行任何操作。

    
    fsck -fn / dev / mapper / vg_01-home 
    

    我曾经进行过一些理论计算,以确定磁盘碎片整理是否可以导致任何明显的性能提升。 尽管我确实做了一些假设,但我使用的磁盘性能数据来自具有300ms轨道间寻道时间的新型300GB Western Digital硬盘。 此示例中的文件数是我进行计算当天文件系统中存在的实际数。 我确实假设每天会碰到相当多的碎片文件(20%)。

    Total files 271,794
    % fragmentation 5.00%
    Discontinuities 13,590
     
    % fragmented files touched per day 20%(假设)
    Number of additional seeks 2,718
    Average seek time 10.90毫秒
    Total additional seek time per day 29.63秒
      0.49分钟
     
    Track-to-track seek time 2.00毫秒
    Total additional seek time per day 5.44秒
      0.091分钟

    表1:碎片对磁盘性能的理论影响

    我已经对每天的总额外搜寻时间做了两次计算,一次是基于轨道到轨道的搜寻时间,这是大多数文件由于EXT文件分配策略而发生的情况,而另一次是平均搜寻时间,我认为这会造成最坏的情况。

    从表1中可以看出,对于绝大多数应用程序而言,碎片对现代EXT文件系统的影响是很小的,甚至可以忽略不计。 您可以将环境中的数字插入到自己的类似电子表格中,以查看对性能产生影响的预期结果。 这种类型的计算很可能无法代表实际性能,但可以提供一些有关碎片化及其对系统的理论影响的见解。

    我的大多数分区都是大约1.5%或1.6%的碎片。 我确实有一个碎片是3.3%,但是那是一个128GB的大型文件系统,只有不到100个非常大的ISO映像文件。 这些年来,由于分区太满,我不得不多次扩展分区。

    这并不是说某些应用程序环境不需要更大的保证就可以减少碎片。 经验丰富的管理员可以谨慎地调整EXT文件系统,管理员可以调整参数以补偿特定的工作负载类型。 这可以在创建文件系统时执行,也可以稍后使用tune2fs命令来完成。 应对每个调整更改的结果进行测试,精心记录和分析,以确保针对目标环境的最佳性能。 在最坏的情况下,如果无法将性能提高到所需的水平,则可以使用其他文件系统类型,这些类型可能更适合于特定的工作负载。 请记住,通常在单个主机系统上混合文件系统类型以匹配每个文件系统上的负载。

    由于大多数EXT文件系统上的碎片数量很少,因此无需进行碎片整理。 无论如何,对于EXT文件系统都没有安全的碎片整理工具。 有一些工具可让您检查单个文件的碎片或文件系统中剩余可用空间的碎片。 有一个工具e4defrag ,它将对文件,目录或文件系统进行碎片整理,使其达到剩余可用空间所允许的最大数量。 顾名思义,它仅适用于EXT4文件系统中的文件,并且确实有一些限制。

    如果有必要在EXT文件系统上执行完整的碎片整理,则只有一种方法可以可靠地工作。 您必须将所有文件从文件系统中移出以进行碎片整理,确保将它们安全地复制到其他位置后将其删除。 如果可能的话,您可以增加文件系统的大小,以帮助减少将来的碎片。 然后将文件复制回目标文件系统。 即使这样也不能保证对所有文件都进行完全碎片整理。

    结论

    二十多年来,EXT文件系统已成为许多Linux发行版的默认文件系统。 它们提供稳定性,高容量,可靠性和性能,同时只需最少的维护。 我尝试了其他文件系统,但始终返回到EXT。 我在Linux上工作过的每个地方都使用EXT文件系统,并发现它们适用于在它们上使用的所有主流负载。 毫无疑问,除非有充分的理由使用另一个文件系统,否则EXT4文件系统应该用于大多数Linux系统。

    翻译自: https://opensource.com/article/17/5/introduction-ext4-filesystem

    展开全文
  • Ext4文件系统架构分析

    千次阅读 2018-06-29 10:39:08
    转自:https://www.cnblogs.com/alantu2018/p/8461272.html本文描述的Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3的和的Ext2文件系统,除了它们不...1. Ext4文件系统布局综述一个的Ext4文件系统被分成...

    转自:https://www.cnblogs.com/alantu2018/p/8461272.html

    本文描述的Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3的和的Ext2文件系统,除了它们不支持的的Ext4的特性外,整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等。感兴趣的看官敬请留意和指导!

    1. Ext4文件系统布局综述

    一个的Ext4文件系统被分成一系列块组。为减少磁盘碎片产生的性能瓶颈,块分配器尽量保持每个文件的数据块都在同一个块组中,从而减少寻道时间。以4KB的数据块为例,一个块组可以包含32768个数据块,也就是128MB。

    1.1磁盘布局

    EXT4文件系统的标准磁盘布局如下:

    EXT4文件系统主要使用块组0中的超级块和块组描述符表,在其他一些特定块组中有超级块和块组描述符表的冗余备份。如果块组中不含冗余备份,那么块组就会以数据块位图开始。当格式化磁盘成为Ext4文件系统的时候,mkfs将在块组描述符表后面分配预留GDT表数据块(“Reserve GDT blocks”)以用于将来扩展文件系统。紧接在预留GDT表数据块后的是数据块位图与inode的表位图,这两个位图分别表示本块组内的数据块与inode的表的使用,索引节点表数据块之后就是存储文件的数据块了。在这些各种各样的块中,超级块,GDT,块位图,索引节点位图都是整个文件系统的元数据,当然的inode表也是文件系统的元数据,但是i节点表是与文件一一对应的,我更倾向于将索引节点当做文件的元数据,因为在实际格式化文件系统的时候,除了已经使用的十来个外,其他的inode表中实际上是没有任何数据 的,直到创建了相应的文件才会分配的inode表,文件系统才会在索引节点表中写入与文件相关的inode的信息。

    1.2灵活块组(flex_bg)

    灵活块组(flex_bg)是从Ext4开始引入的新特性。在一个flex_bg中,几个块组在一起组成一个逻辑块组。flex_bg.Flex_bg的第一个块组中的位图空间和inode表空间扩大为包含了flex_bg中其他块组上位图和inode的表。

    比如flex_bg包含4个块组,块组0将按序包含超级块,块组描述符表,块组0-3的数据块位图,块组0-3的索引节点位图,块组0-3的i节点表,块组0中的其他空间用于存储文件数据。同时,其他块组上的数据块位图,索引节点位图,索引节点表元数据就不存在了,但是SB和GDT还是存在的。

    灵活的块组的作用是:

    (1)聚集元数据,加速元数据载入;

    (2)使得大文件在磁盘上尽量连续;

    即使开启flex_bg特性,超级块和块组描述符的冗余备份仍然位于块组的开头。Flex_bg中块组的个数由2 ^ ext4_super_block.s_log_groups_per_flex给出。

    1.3元块组(Meta Block Groups)

    通常,在每个冗余备份的超级块的后面是一个完整的(包含所有块组描述符的)块组描述符表的备份。这样会产生一个限制,以Ext4的块组描述符大小64字节计算,文件系统中最多只能有2 ^ 21个块组,也就是文件系统最大为256TB。

    使用元块组Meta元组特性,每个块组都包含该块组自己的描述符的冗余备份。因此可以创建2 ^ 33个块组,也就是文件系统最大1EB.48位数据块, - 个块组128MB,因而可以创建2 ^ 33个块组。

    元块组实际上是可以用一个块组描述符块来进行描述的块组集,简单的说,它由一系列块组组成,同时这些块组对应的块组描述符存储在一个块中。它的出现使得Ext3的和的Ext4的磁盘布局有了一定的变化,以往超级块后紧跟的是变长的GDT块,现在是超级块依然决定于是否是3,5,7的幂,而一个块组描述符块则存储在元块组的第一个,第二个和最后一个块组的开始处(见下图)

    在两种情况下我们可能会用到这种新布局: 

    (1)文件系统创建时。用户可以指定使用这种布局。 

    (2)当前文件系统增长而且预留的组描述符块耗尽时。目前超级块中有一个域s_first_meta_bg用于描述第一个使用元块组的块组。 

     当增加新块组时,我们不需要给组描述符表预留空间,而是在当前文件系统后面直接添加新的元块组就可以了。

     

    1.4懒惰块组初始化

    如果块组中的相应标志已设置,那么块组中的索引节点位图和索引节点表将不被初始化。这样可以减少mkfs的时间,如果开启了块组描述符校验和功能,甚至连块组都可以不初始化。

    1.5特殊inodes

    EXT4预留了一些索引节点做特殊特性使用,见下表:

    表1 Ext4的特殊inode

    Inode号用途

    0不存在0号inode

    1损坏数据块链表

    2根目录

    3 ACL索引

    4 ACL数据

    5引导装载程序

    6未删除的目录

    7预留的块组描述符inode

    8日志inode

    11第一个非预留的inode,通常是lost + found目录

    1.6数据块和Inode分配策略

    在机械磁盘上,保持相关的数据块相互接近可以总的磁头移动时间,因而可以加速磁盘IO。在SSD上虽然没有磁头转动,数据局部性可以增加每次IO请求的传输的数据大小,因而减少响应IO请求的传输次数。数据的局部性对单个擦除块的写入产生影响,可以加速文件重写的速度。因而尽可能减少碎片是必要的。inode和数据块的分配策略可以保证数据的局部集中。以下为inode和数据块的分配策略:

    (1)  多块分配可以减少磁盘碎片。当文件初次创建的时候,块分配器预测性地分配8KB的磁盘空间给文件。当文件关闭的时候,未使用的空间当然也就释放了。但是如果推测是正确的,那么文件数据将写到一个多个块的extent中。

    (2)  延迟分配。当一个文件需要更多的数据块引起写操作时,文件系统推迟决定新数据在磁盘上的存放位置,直到脏的buffer写到磁盘为止。

    (3)  尽量保持文件的数据块与其inode在同一个块组中。可以减少磁盘寻道时间.

    (4)  尽量保持同一个目录中的所有inodes与目录位于同一个块组中。这样的假设前提是一个目录中的文件是相关的。

    (5)  磁盘卷被分成128MB的块组。当在根目录中创建目录时,inode分配器扫描块组并将新目录放到它找到的使用负荷最小的块组中。这可以保证目录在磁盘上的分散性。

    (6)  即使上述机制无效,仍然可以使用e4defrag整理碎片文件。


    1.7 超级块

    超级块记录整个文件系统的大量信息,如数据块个数、inode个数、支持的特性、管理信息,等待。

    如果设置sparse_super特性标志,超级块和块组描述符表的冗余备份仅存放在编号为0或3、5、7的幂次方的块组中。如果未设置sparse_super特性标志,冗余备份存在与所有的块组中。以下是2.6.32.18内核中对Ext4超级块的描述:

     



    3.0的内核中,Ext4的超级块加入了以下相关元数据:快照、文件系统错误处理相关、挂载选项、配额文件inode、超级块校验和等,见下图。目前没有深入研究这些新的元数据。

     

    1.8 块组描述符

    一个块组中,具有固定位置的数据结构是超级块和块组描述符。其他数据结构位置都可以不固定。Flex_bg机制使用这个性质将几个块组聚合成一个flex块组,将flex_bg中所有位图和inode 表放到flex_bg的第一个块组中。详细情况可以参考我的上一篇Ext4分析博文的Flexible 块组(flex_bg)部分。


          如果设置了meta_bg特性标志,几个块组结合成一个meta group。在meta_bg的情况下,在meta group中的第一个和最后两个块组中仅包含meta group中的块组的块组描述符。Flex_bg和Meta_bg互斥因而不能共同出现。

     

    1.9 数据块位图与inode位图

    数据块位图跟踪块组中数据块使用情况。Inode位图跟踪块组中Inode使用情况。每个位图一个数据块,每一位用0或1表示一个块组中数据块或inode表中inode的使用情况。如果一个数据块大小是4KB的话,那一个位图块可以表示4*1024*8个数据块的使用情况,这也是单个块组具有的最大数据块个数。这样可以算出一个块组大小是128MB。当然一个位图块也可以表示4*1024*8个inode的使用情况,但是实际上一个块组中即使存满了文件,也不会用到这么多的inode,因为实际系统中基本不会出现所有文件大小都小于等于1个数据块大小的情况。实际上一个块组中有多少个inode,在块组描述符中是确定的,在文件系统格式化过程中也会看到这个数值,如果没记错的话,大概是每4个还是8个数据块分配一个inode空间。

     

    1.10 Inode表

    为了找到与一个文件相关的信息,必须遍历目录文件找到与文件相关的目录项,然后加载inode找到该文件的元数据。Ext4在目录项中用一位存储了文件类型(通常存储在inode中)的拷贝,这对性能提升有益。Inode表的大小为ext4_super_block.s_inode_size * ext4_super_block.s_inodes_per_group Bytes。 


         
     Ext4的inode的数据结构大小为156 bytes,但是Ext4的标准inode的大小是256 bytes。

     

    1.11 查找inode

    每个块组包含ext4_super_block.s_inodes_per_group个inodes。因为0号inode不存在,可以通过如下的算式计算inode所在的块组:

    bg=(inode_num -1)/ ext4_super_block.s_inodes_per_group

    inode在块组中inode表中的索引index可以通过如下的算式计算:

    index=(inode_num -1) % ext4_super_block.s_inodes_per_group

    inode在inode表中的地址偏移为:

    offset=index * ext4_super_block.s_inode _size

     

    1.12 inode.i_block0[]s的内容

    取决于文件类型,inode.i_blocks[]使用的方式不同。一般来说,常规文件和目录用inode.i_blocks[]作为文件数据块索引信息,特殊文件将inode.i_blocks[]用于特殊用途。常规文件用inode.i_blocks[]作为文件数据块索引信息的三级索引结构会在后面直接、间接块地址中详细介绍。

     

    1.13  符号链接

    如果符号链接的目标字符串长度小于60字节,那么就将其存储在inode.i_blocks[]中,inode中inode.i_blocks[]占据的大小刚好是60KB。这里要注意到的是,有些文件其内容是跟文件的元数据放在一起的,因而就没有了数据块。也就是说不是每个文件数据都必然占据着一个数据块。

     

    1.14 直接/间接块地址

     Ext2/Ext3中数据块映射方式如下表

     

     

    1.15   Extent 树

    Ext4中用extent树代替了逻辑块映射。使用extents,用一个struct ext4_extent结构就可以映射多个数据块,减少元数据块的使用。如果设置了flex_bg,甚至可以用一个extent分配一个非常大的文件。使用extent特性,inode必须设置extents flag。

    Extents以树的方式安排。Extent树的每个节点都以一个ext4_extent_header开头,如果节点是内部节点(ext4_extent_header.eh_depth>0),ext4_extent_header后面紧跟的是ext4_extent_header .eh_entries个索引项struct ext4_extent_idx,每个索引项指向该extent树中一个包含更多的节点的数据块。如果节点是叶子节点(ext4_extent_header.eh_depth==0),ext4_extent_header后面紧跟的是ext4_extent_header .eh_entries个struct ext4_extent数据结构。这些ext4_extent结构指向文件数据块。Extent树的根结点存储在inode.i_blocks中,可以存储文件的前4个extents而不需额外的元数据块。

    ext4_extent_header:

    struct ext4_extent_idx:extent树的内部节点,也称为索引节点。

    ext4_extent:extent树的叶子节点。

     

     

    1.16 Extent树数据块校验和:可能加入的新元数据

    由于extent树的根在inode中,因而Extent树数据块指extent树的除根据节点外的所有内部节点和叶子节点。Extent的树根节点和叶子节点的数据块中存储完xt4_extent_idx和xt4_extent数据结构后至少会留下4 ((2^x%12)>=4) bytes的空间。因而可以加入一个结构struct ext4_extent_tail,其中存储32位的校验和。位于inode中的4个extents无需校验和,因为inode已经做了校验和。

     

    1.17 目录项

    Ext4文件系统中,一个目录差不多是一个平面文件,映射任意长度的字符串到文件系统中的一个inode。文件系统中存在多个目录项引用同一个inode——硬链接,这也是硬链接不能链接其他文件系统中的文件的原因。

     

    1.18 线性(经典)目录

    缺省地,目录文件中包含一个线性的目录项数组。未使用的目录项标记为inode =0。Ext4文件系统默认地使用struct ext4_dir_entry_2记录目录项,除非没有设置filetype特性标志。在没有设置filetype特性标志的情况下,使用struct ext4_dir_entry记录目录项。

     

     

    1.19 哈希树目录

    线性目录项不利于系统性能提升。因而从ext3开始加入了快速平衡树哈希目录项名称。如果在inode中设置EXT4_INDEX_FL标志,目录使用哈希的B树(hashed btree ,htree)组织和查找目录项。为了向后只读兼容Ext2,htree实际上隐藏在目录文件中。

    Ext2的惯例,树的根总是在目录文件的第一个数据块中。“.”和“..”目录项必须出现在第一个数据块的开头。因而这两个目录项在数据块的开头存放两个struct ext4_dir_entry_2结构,且它们不存到树中。根结点的其他部分包含树的元数据,最后一个hash->block map查找到htree中更低的节点。如果dx_root.info.indirect_levels不为0,那么htree有两层;htree根结点的map指向的数据块是一个内部节点,由一个minor hash索引。Htree中的内部节点的minor_hash->block map之后包含一个零化的(zeroed out) structext4_dir_entry_2找到叶子节点。叶子节点包括一个线性的struct ext4_dir_entry_2数组;所有这些项都哈希到相同的值。如果发生溢出,目录项简单地溢出到下一个叶子节点,哈希的least-significant位(内部节点的map)做相应设置。

           以htree的方式遍历目录,计算要查找的目录文件名称的哈希值,然后使用哈希值找到对应的数据块号。如果树是flat,该数据块是目录项的线性数组,因而可被搜索到;否则,计算文件名称的minor hash,并使用minor hash查找相应的第三个数据块号。第三个数据块是目录项线性数组。

    Htree的根 :struct dx_root


    Htree的内部节点: struct dx_node

    Htree 树根和节点中都存在的 Hash map: struct dx_entry

     

    1.20 扩展属性EA

    扩展属性(xattrs)通常存储在磁盘上的一个单独的数据块中,通过inode.i_file_acl*引用。扩展属性的第一应用是存储文件的ACL以及其他安全数据(selinux)。使用user_xattr挂载选项就可为用户存储以“user”开头的所有扩展属性。这样的限制在3.0内核中已经消失。

    可以在两个地方找到扩展属性:一是在一个inode项结尾到下一个inode项开头的地方;二是inode.i_file_acl指向 的数据块之中,到3.0为止,这个数据块中不包含指向第二个扩展属性数据块的指针。理论上可以将每个属性值存储到一个单独的数据块中,但是3.0内核为止仍然没有这样做。

    当扩展属性不存储在一个inode之后的时候,就会有一个头部ext4_xattr_ibody_header

    扩展属性数据块的开头是ext4_xattr _header

    紧跟在ext4_xattr_ibody_header或者ext4_xattr _header后面的是结构数组 struct ext4_xattr_entry

    扩展属性值可以紧跟在ext4_xattr_entry项表后面。考虑4 bytes对齐。扩展属性值从扩展属性数据块的末尾开始向ext4_xattr _header / ext4_xattr_entry表的方向增长。当发生溢出时,溢出的部分放到一个单独的磁盘数据块上。

     

    1.21 日志(JBD2)

    文件系统在磁盘上保留一段小的连续区域(默认128MB),作为尽可能需要快速写入磁盘的“重要”数据的存放地。一旦该重要数据事务完全写到磁盘,将其从磁盘写缓存中刷出。被提交的数据一份记录也被写到日志。一段时间后,日志在擦除提交记录前将事务写到它们在磁盘上的最终位置(可能包含大量的寻道或者大量的读-写-擦除)。

    从性能方面考虑,Ext4默认直接将文件系统元数据写到日志。因而不能保证文件数据块的一致性。

           日志的inode为8。日志inode的前68 bytes复制了ext4 超级块。日志文件在文件系统中是普通文件,但是隐藏不可见。日志文件通常消耗一个完整的块组,可以通过mke2fs将日志文件放在磁盘的中间。

    Ext4和Ocfs2都使用JBD2。

    1.21.1 布局

    日志布局

    一个事务以描述符和一些数据或者block revocation链表开始。一个结束的事务总是以一个提交块结束。如果没有提交记录(或者校验和不匹配),事务在日志重演的时候将被丢弃。

    1.21.2  数据块头部

    日志中的每个数据块的开头都是一个12 bytes的数据结构 struct journal_header_s

    1.21.3  超级块

    日志的超级块比Ext4的超级块简单。保存在日志的超级块中是日志的关键数据。日志超级块使用数据结构struct journal_superblock_s表示,大小为1024 bytes。

    1.21.4  描述数据块Descriptor Block

    Descriptor Block包含一个日志数据块tags的数组,这些tags描述了日志中接下来的数据块的最终位置。

    日志数据块tags具有如下格式:由数据结构struct journal_block_tag_s表示,可以是8,12,24或38bytes。

    1.21.5  数据块Data Block

    存放的是通过日志写到磁盘的数据块。但是如果数据块的前4 bytes与jbd2的魔数匹配,那么这些4 bytes用0代替,并且在Descriptor Block中设置escaped。

     

    1.21.6  Revocation Block

     

    Revocation block用于记录本事务中的数据块链表,取代任何潜在日志中的更陈旧的数据块这样可以加速恢复,因为陈旧的数据块不必写到磁盘。

    Revocation block使用 structjbd2_journal_revoke_header_s结构表示

     

    1.21.7  提交块

    提交快表明了一个事务已完整写到日志。一旦提交块到达日志,存储在该事务中的数据可以写到它们在磁盘中的最终位置。

    提交快由数据结构struct commit_header表示:

     

    展开全文
  • Ext4文件系统介绍

    热门讨论 2011-06-21 10:58:09
    主要介绍EXT4文件系统,及其相对于EXT2/EXT3的优势
  • ext2、ext3与ext4的区别

    万次阅读 2018-09-03 11:15:43
    ext2与ext3 Linux ext2/ext3文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统...

    ext2与ext3

    Linux ext2/ext3文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。 linux文件系统将文件索引节点号和文件名同时保存在目录中。所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。 对于一个文件来说有唯一的索引节点号与之对应,对于一个索引节点号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问它。
    Linux之前缺省情况下使用的文件系统为Ext2,ext2文件系统的确高效稳定。但是,随着Linux系统在关键业务中的应用,Linux文件系统的弱点也渐渐显露出来了:其中系统缺省使用的ext2文件系统是非日志文件系统。这在关键行业的应用是一个致命的弱点。本文向各位介绍Linux下使用ext3日志文件系统应用。
    Ext3文件系统是直接从Ext2文件系统发展而来,目前ext3文件系统已经非常稳定可靠。它完全兼容ext2文件系统。用户可以平滑地过渡到一个日志功能健全的文件系统中来。这实际上了也是ext3日志文件系统初始设计的初衷。

    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模式。系统管理人员可以根据系统的实际工作要求,在系统的工作速度与文件数据的一致性之间作出选择。


    实际使用Ext3文件系统
    创建新的ext3文件系统,例如要把磁盘上的hda8分区格式化ext3文件系统,并将日志记录在/dev/hda1分区,那么操作过程如下:
    [root@stationxx root]# mke2fs -j /dev/hda8
    mke2fs 1.24a (02-Sep-2001)
    Filesystem label=
    OS type: Linux
    Block size=1024 (log=0)
    .. .. ..
    Creating journal (8192 blocks): done
    Writing superblocks and filesystem accounting information: done
    This filesystem will be automatically checked every 30 mounts or
    180 days, whichever comes first. Use tune2fs -c or -i to override.
    在创建新的文件系统时,可以看到,ext3文件系统执行自动检测的时间为180天或每第31次被mount时,实际上这个参数可以根据需要随意调节。

    以下将新的文件系统mount到主分区/data目录下:
    [root@stionxx root]# mount -t ext3 /dev/hda8 /data
    说明:以上将已格式化为ext3文件系统的/dev/hda8分区加载到/data目录下。
    ext3 基于ext2 的代码,它的磁盘格式和 ext2 的相同;这意味着,一个干净卸装的 ext3 文件系统可以作为 ext2 文件系统重新挂装。Ext3文件系统仍然能被加载成ext2文件系统来使用,你可以把一个文件系统在ext3和ext2自由切换。这时在ext2文件系统上的ext3日志文件仍然存在,只是ext2不能认出日志而已。

    以转换文件系统为例,将ext2文件系统转换为ext3文件系统,命令如下:
    [root@stationxx root]# tune2fs -j /dev/hda9
    tune2fs 1.24a (02-Sep-2001)
    Creating journal inode: done
    This filesystem will be automatically checked every 31 mounts or
    180 days, whichever comes first. Use tune2fs -c or -i to override.
    这样,原来的ext2文件系统就转换成了ext3文件系统。注意将ext2文件系统转换为ext3文件系统时,不必要将分区缷载下来转换。
    转换完成后,不要忘记将/etc/fstab文件中所对应分区的文件系统由原来的ext2更改为ext3。

    ext3日志的存放位置
    可以将日志放置在另外一个存储设备上,例如存放到分区/dev/hda8。例如要在/dev/hda8上创建一个ext3文件系统,并将日志存放在外部设备/dev/hda2上,则运行以下命令:
    [root @stationxx root]#mke2fs -J device=/dev/hda8 /dev/hda2
    ext3文件系统修复
    新的e2fsprogs中的e2fsck支持ext3文件系统。当一个ext3文件系统被破坏时,先卸载该设备,在用e2fsck修复:
    [root @stationxx root] # umount /dev/hda8
    [root @stationxx root] #e2fsck -fy /dev/hda8

     

    ext3的优点
    为什么你需要从ext2迁移到ext3呢?以下有四个主要原因:可用性、数据完整性、速度、易于迁移。
    1、可用性
    在非正常当机后(停电、系统崩溃),只有在通过e2fsck进行一致性校验后,ext2文件系统才能被装载使用。运行e2fsck的时间主要取决于 ext2文件系统的大小。校验稍大一些的文件系统(几十GB)需要很长时间。如果文件系统上的文件数量多,校验的时间则更长。校验几百个GB的文件系统可能需要一个小时或更长。这极大地限制了可用性。相比之下,除非发生硬件故障,即使非正常关机,ext3也不需要文件系统校验。这是因为数据是以文件系统始终保持一致方式写入磁盘的。在非正常关机后,恢复ext3文件系统的时间不依赖于文件系统的大小或文件数量,而依赖于维护一致性所需“日志”的大小。使用缺省日志设置,恢复时间仅需一秒(依赖于硬件速度)。
    2、数据完整性
    使用ext3文件系统,在非正常关机时,数据完整性能得到可靠的保障。你可以选择数据保护的类型和级别。你可以选择保证文件系统一致,但是允许文件系统上的数据在非正常关机时受损;这是可以在某些状况下提高一些速度(但非所有状况)。你也可以选择保持数据的可靠性与文件系统一致;这意味着在当机后,你不会在新近写入的文件中看到任何数据垃圾。这个保持数据的可靠性与文件系统一致的安全的选择是缺省设置。
    3、速度
    尽管ext3写入数据的次数多于ext2,但是ext3常常快于ext2(高数据流)。这是因为ext3的日志功能优化硬盘磁头的转动。你可以从3种日志模式中选择1种来优化速度,有选择地牺牲一些数据完整性。
    4、易于迁移
    你可以不重新格式化硬盘,并且很方便的从ext2迁移至ext3而享受可靠的日志文件系统的好处。对,不需要做长时间的、枯燥的、有可能失误的“备份-重新格式化-恢复”操作,就可以体验ext3的优点。有两种迁移的方法:
    · 如果你升级你的系统,Red Hat Linux安装程序会协助迁移。需要你做的工作 就是为每一个文件系统按一下选择按钮。
    · 使用tune2fs程序可以为现存的ext2文件系统增加日志功能。如果文件系统在转换的过程已经被装载了(mount),那么在root目录下会出现文件”.journal”;如果文件系统没有被装载,那么文件系统中不会出现该文件。转换文件系统,只需要运行tune2fs –j /dev/hda1(或者你要转换的文件系统所在的任何设备名称),同时把文件/etc/fstab中的ext2修改为ext3。如果你要转换自己的根文件系统,你必须使用initrd引导启动。参照mkinitrd的手册描述运行程序,同时确认自己的LILO或GRUB配置中装载了initrd(如果没有成功,系统仍然能启动,但是根文件系统会以ext2形式装载,而不是ext3,你可以使用命令cat /proc/mounts 来确认这一点。)详情可参看tune2fs命令的man page在线手册(执行man tune2fs)。

    总而言之,ext3日志文件系统是目前linux系统由ext2文件系统过度到日志文件系统最为简单的一种选择,实现方式也最为简洁。由于是直接从ext2文件系统发展而来,系统由ext2文件系统过渡到ext3日志文件系统升级过程平滑,可以最大限度地保证系统数据的安全性。目前linux系统要使用日志文件系统,最保险的方式就是选择ext3文件系统。

     


    最新的ext4
    Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:

    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" 命令禁用该特性。)

    展开全文
  • linux xfs 和 ext4的区别

    千次阅读 2021-01-27 19:26:10
    centos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3ext3和ext4的最大区别在于,ext3在fsck时需要耗费大量时间(文件越多,时间越长),而ext4在fsck时用的时间会少非常多 ext4是第四代扩展文件系统...
  • Linux xfs和ext4的区别

    千次阅读 2020-01-30 20:05:53
    centos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3 ext3和ext4的最大区别在于,ext3在fsck时需要耗费大量时间(文件越多,时间越长),而ext4在fsck时用的时间会少非常多 ext4是第四代扩展文件系统...
  • ext4解包和重新打包

    千次阅读 2020-04-02 14:06:11
    有的官方包用的是.img.ext4格式,要用Linux解包 以下用Ubuntu做例子讲解打包解包方法 也可以用相同的原理修改EXT4文件系统的.img 1.需要: Ubuntu操作系统http://www.ubuntu.org.cn/download/desktop 解打包工具 ...
  • Linux之ext\ext2\ext3\ext4的介绍与区别 文件系统名称 介绍 特点 优势 ext 第一代扩展文件系统,一种文件系统,于1992年4月发表,是为linux核心所做的第一个文件系统。采用Unix文件系统(UFS)的元数据...
  • EXT4和XFS的区别

    千次阅读 2021-09-09 10:17:43
    EXT4是第四代拓展文件系统(Fourth Extended Filesystem)是Linux系统下的日志文件系统,是ext3文件系统的后继版本。 ext4的文件系统容量达到1EB,而文件容量达到了16TB.而且EXT4理论上支持无限数量
  • EXT3-fs error和EXT4-fs error小总结

    千次阅读 2021-02-05 16:28:50
    对于ext3类型的文件系统,可以使用tune2fs 查看 tune2fs -l /dev/sdf|grep stat Filesystem state: clean 使用fsck命令来检测和修复文件系统,FSCK 全称为 File System Consistency Check 作用: 它可以进行三种...
  • WINDOWS下查看EXT4文件系统

    热门讨论 2010-11-24 19:14:50
    可以通过安装此工具在WINDWOS下可以查看LINUX文件系统或者对资料进行拷贝备份! 支持EXT4的文件系统查看
  • [ext3已验证]如何在buildroot中添加支持去制作ext3和ext4类型的根文件系统rootfs镜像文件 最近因需要,折腾了在buildroot下面,如何添加支持制作出ext2类型的rootfs, 其实就是在make menuconfig中,将ext2选上,...
  • Android data分区格式F2FS改为EXT4

    千次阅读 2019-06-12 15:07:03
    1. 主板型号:AIO-3399J ...5. 需要的功能: 将RK3399的跟目录下的data文件系统f2fs,无法挂载 mount data分区,更换data文件系统ext4后,Android系统对userdata分区进行了加密,启动Android系统需要密码。 6. ...
  • ext4和xfs区别

    千次阅读 2020-04-21 21:07:16
    xfs 对于存储海量小文件或者超大规模文件,文件也很大,建议使用xfs。 它是一个64位文件系统,最大支持8EB减一的单个文件系统,实际部署取决于宿主操作...ext4 目前主流稳定的文件系统。容量达1EB,文件内容达16TB ...
  • 应为原文:http://www.ilsistemista.net/index.php/linux-a-unix/6-linux-filesystems-benchmarked-ext3-vs-ext4
  • ext3转化为ext4

    千次阅读 2018-07-20 11:42:31
    ext4是ext3的升级版,在性能方面有了很大的提升。详情请点击   下面是ext3转化为ext4的过程 参考: 我在AS4U7和AS5U3上通过升级内核的方式,自己玩了玩。内核要2.6.28以上版本,升级好内核后还要系统支持mkfs....
  • ext4之super.c

    千次阅读 2016-10-06 19:12:49
    super.c是ext4里非常重要的文件,挂载时候运行的代码基本上都在super.c里边,如果super.c有一点代码上的bug的话,那么一个块设备就不能被以ext4文件系统挂载。我在比较重要的地方都加了注释讲解,如果有认为我没写...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 552,964
精华内容 221,185
关键字:

ext4