精华内容
下载资源
问答
  • EXT3文件系统增加快照功能,谢全朝,刘日升,本文分析了EXT3文件系统的磁盘存储布局,介绍了快照功能的实现方法。快照功能是完全在文件系统内部实现,没有修改内核接口或者改��
  • EXT4文件组织 - EXT4文件系统详解2

    千次阅读 2015-12-11 16:51:11
    EXT4 文件系统是从 EXT2 和 EXT3 上发展而来的,这里我们来分析它们是如何将一个文件的内容组织起来,从而在磁盘上“拼凑出一个文件”。

    EXT4 文件系统是从 EXT2 和 EXT3 上发展而来的,这里我们来分析它们是如何将一个文件的内容组织起来,从而在磁盘上“拼凑出一个文件”。

    EXT2文件组织方式

    出于对EXT4文件系统兼容性的考虑,我们尝试在先从EXT2文件系统的文件组织方式说起。

    EXT2文件节点定义:http://lxr.free-electrons.com/source/fs/ext2/ext2.h?v=4.1#L297

    EXT2 文件节点变量有点多,我们需要关注 i_block[] 这个成员,这个成员是解析 EXT2 文件组织方式的重要入手点。

    __le32  i_block[EXT2_N_BLOCKS];     /* Pointers to blocks */
    
    #define EXT2_NDIR_BLOCKS                12
    #define EXT2_IND_BLOCK                  EXT2_NDIR_BLOCKS
    #define EXT2_DIND_BLOCK                 (EXT2_IND_BLOCK + 1)
    #define EXT2_TIND_BLOCK                 (EXT2_DIND_BLOCK + 1)
    #define EXT2_N_BLOCKS                   (EXT2_TIND_BLOCK + 1)

    在上面的代码中我们给出了后面五行宏定义的代码,用来解释 EXT2_N_BLOCKS 数值大小的由来,结合图1进行说明会更加清晰。

    这里写图片描述
    图 1 EXT2/EXT3文件组织索引结构

    i_block[] 占用了60 Bytes 的固定空间,包含15个32位的无符号整形变量,每一个变量记录了一个块号(Block Number, http://lxr.free-electrons.com/source/fs/ext2/ext2.h?v=4.1#L25)用来指示磁盘上的一个Block。最前面[0 - 11]这12个块号都直接标示了一个数据块用来保存数据,因此可以用来记录 12 * 4KB = 48KB 的文件内容。这太小了,放不下多少东西!我们再来看后面的内容。

    i_block[12] 表示一级索引,这个一级索引同样记录了一个块号,不过这个块号所指示的Block并不用来保存数据,而是保存了 4KB / 4B = 1024 个直接索引,这些直接索引在用来指示数据块的位置。因此,以及索引可以用来保存 4KB / 4B * 4KB = 4MB 的文件内容。

    依此类推,i_block[13]i_block[14] 分别保存了二级索引和三级索引,分别可以用来保存 4GB 和 4TB 的文件内容。也就是说通过这种分级索引映射的方式,EXT2文件系统最大可以支持单个文件的大小是 4TB + 4GB + 4MB + 48KB

    EXT4文件组织方式

    分析完EXT2/3的文件组织方式,发现这种方法有不少缺陷:首先,文件存储会消耗很多额外的磁盘空间,每增加4MB的大小就需要额外的4KB来映射文件内容;另外,4TB的单个文件有点小,要知道现在数据库文件动辄就要几十甚至是上百TB。网上说EXT4文件系统支持最大的单个文件大小是64TB,我也没弄明白这是怎么计算出来的,不过从CentOS 7 开始改为默认采用XFS文件系统,能够支持更大的单个文件尺寸。

    EXT4文件系统在组织文件时使用了 extents 方法来改进旧的分层索引映射的方式,所谓的extents方法简单地说就是构建extent树来组织文件,并且记录文件使用的某片区域的起始位置而非一一映射。extent树最重要的两个数据结构式 ext4_extent_idxext4_extent_header,先把代码贴出来吧。

    http://lxr.free-electrons.com/source/fs/ext4/ext4_extents.h?v=4.1#L86

    struct ext4_extent_idx {
        __le32  ei_block;   /* index covers logical blocks from 'block' */
        __le32  ei_leaf_lo; /* pointer to the physical block of the next *
                     * level. leaf or next index could be there */
        __le16  ei_leaf_hi; /* high 16 bits of physical block */
        __u16   ei_unused;
    };
    struct ext4_extent_header {
        __le16  eh_magic;   /* probably will support different formats */
        __le16  eh_entries; /* number of valid entries */
        __le16  eh_max;     /* capacity of store in entries */
        __le16  eh_depth;   /* has tree real underlying blocks? */
        __le32  eh_generation;  /* generation of the tree */
    };
    展开全文
  • 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表示:

     

    展开全文
  • 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 文件系统

     

    展开全文
  • Ext4 文件系统学习

    千次阅读 2013-04-02 16:44:29
    Ext4 文件系统中主要增加了一下功能: 功能增加 1)Ext4Ext3的向前兼容和向后兼容。 也就是说,Ext4 文件系统可以mount 为Ext3 文件系统,当然Ext4的一些特性就是失去了。Ext3文件系统可以mount为Ext4...

    在Ext4 文件系统中主要增加了一下功能:

    功能增加

    1)Ext4 和Ext3的向前兼容和向后兼容。 也就是说,Ext4 文件系统可以mount 为Ext3 文件系统,当然Ext4的一些特性就是失去了。Ext3文件系统可以mount为Ext4文件系统,旧的文件就没有Ext4文件系统的特性,新创建的文件有Ext4文件系统的特性,这可以允许Ext3文件系统在线迁移到Ext4文件系统上。

    2)增加了timestamp 的精度,从秒级到纳秒级。


    可扩展性

    1)文件容量的限制的突破

    文件系统的容量突破1 exabyte, 单个文件突破Files within ext4 may be up to 16TB in size (assuming 4KB blocks), which is eight times the limit in ext3.

    2)Extent的概念引入

    Ext3文件系统的管理是以block为文件系统的基本单位,通过3级 indirect block 指针来管理一个文件的block。 空闲block是通过bitmap来分配。

    Ext4是通过Extent为为文件系统的基本单位。 一个文件的Extent用constant depth extent tree(好像是Hash Tree)来管理。

    特别注意的是这里的Extent是连续的几个Block,并不固定为几个block


    性能优化

    预分配

    延迟分配

    多块分配


    展开全文
  • Ext4EXT4_IOC_GROUP_ADD命令用于增加块组来扩展文件系统的大小,它通过向文件系统中加入新的块组的方式来扩展文件系统的大小。单次能扩展的最大范围是向文件系统增加一个完整的块组(128MB,4KB数据块计算
  • Ext4文件系统在线扩展大小的本质是将文件系统的数据块个数...从功能上来看是扩展文件系统最后一个块组(EXT4_IOC_GROUP_EXTEND)与增加块组扩展文件系统(EXT4_IOC_GROUP_ADD)两种方式的结合,但是处理上稍微有点不
  • ioctl.c 源码功能概述 ...Ext4的ioctl提供给用户以下接口,以方便用户更改文件系统的各种设置和状态: (1) EXT4_IOC_GETFLAGS: 获取inode的标志位,用户获取当前的inode标志位信息; (2) EXT4_IOC_S
  • Ext4文件系统的特色

    2013-03-20 15:01:37
    Ext4文件系统(第四扩展文件系统)是Linux系统下的日志文件系统,是Ext3文件系统的后继版本。 Ext4原始的开发目标是一系列的向下兼容Ext3、移除其64位限制与提升其性能的延伸包。然而,某些Linux开发者因稳定性原因...
  • ext4文件系统第四代

    千次阅读 2014-03-12 11:54:18
    ext4(第四扩展文件系统文件系统是Linux系统下的日志文件系统,是ext3文件系统的后继版本。 Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能: 1. 与 Ext3 兼容。 执行若干条命令,就能从 Ext3 在线...
  • Ext4文件系统Ext3文件系统性能对比

    千次阅读 2011-03-03 13:54:00
    转自http://bbs.deepin.org/thread-1139382-1-1.html<br />  我对Ubuntu9.04中新加入的EXt4文件系统 一直非常好奇,今天没事就找了找相关的资料跟大家分享一下,EXT4EXT3相比具有哪些改进。更多请...
  • 学习笔记:EXT4文件系统特性

    千次阅读 2018-07-15 10:30:27
     1 EB = 1024 * 1024 TBblock size: 4 bytes向下兼容ext4向下兼容于ext3与ext2,因此可以将ext3和ext2的文件系统挂载为ext4分区。由于某些ext4的新功能可以直接运用在ext3和ext2上,直接挂载即可提升少许性能。ext...
  • 让CentOS支持ext4文件系统

    万次阅读 2015-02-02 15:01:34
    CentOS默认是支持ext4文件系统的,不过需要用户自己动手配置一下,配置完毕后,你的操作系统就可以使用ext4文件系统
  • Linux ext2, ext3, ext4 文件系统解读[4]

    千次阅读 2017-04-26 23:21:28
    ext2 ext3 ext4 文件系统的区别: ext2为非日志文件系统,即在文件系统的运行期间不会记录写操作的日志,这就有一个很大的弊端,即文件系统只能单纯依靠Inode和Data Block的Bitmap来确定数据写入的状态。 ...
  • EXt4 文件系统

    千次阅读 2013-04-02 16:45:00
    Linux 支持几个不同的文件系统。这些文件系统中,一些是专用的网络文件...目前(2008年),这一类文件系统包括 ext2、ext3、ReiserFS、XFS 和 Journaled File System (JFS)。但是文件系统一直在不断设计和开发中,
  • ext2、ext3、ext4文件系统区别

    千次阅读 2016-05-15 00:20:12
    Linux ext2/ext3文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引...
  • 剖析ext4文件系统

    千次阅读 2012-01-07 22:07:08
    简介: 第 4 个扩展文件系统,即 ext4,是下一代的日志文件系统,它与上一代文件系统 ext3 是向后兼容的。尽管 ext4 目前还不是标准文件系统,但它将成为大部分下一代 Linux® 发行版的默认文件系统。了解 ext4...
  • xfs和ext4文件系统大小调整

    千次阅读 2020-07-17 07:22:07
    resize2fs命令 针对的是ext2、ext3、ext4文件系统xfs_growfs命令 针对的是xfs文件系统 1、ext2/ext3/ext4文件系统的调整命令是resize2fs(增大和减小都支持) 1 2 3 4 5 lvextend...
  • Linux EXT4文件系统简介

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

    千次阅读 2013-09-25 09:46:10
    从本篇博客起,我们开始研究现代文件系统ext4,说其现代是因为其相比传统文件系统,有着更现代化的设计。这些先进的特性体现在本文所要叙述的以下方面。  Ext4是Linux文件系统的一次革命。在很多方面,Ext4相...
  • EXT4文件系统 mount 参数翻译

    万次阅读 2012-12-11 20:26:49
     ext4文件系统是一个先进水平的ext3文件系统,其中包括了可扩展性和可靠性  支持大型文件系统的增强。  选项journal_dev, noload, data, commit, orlov, oldalloc, [no]user_xattr [no]acl, bsddf, minixdf, ...
  • 三、EXT4文件系统的特点 1、更大的文件系统和更大的文件 Ext3文件系统最多只能支持32TB的文件系统和2TB的文件,根据使用的具体架构和系统设置,实际容量上限可能比这个数字还要低,即只能容纳2TB的文件系统和16GB的...
  • 本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外。整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等。感兴趣的看官敬...
  • ext3和ext4文件系统来窥探空间和文件大小的演算法则 学习操作系统就不得不研究磁盘以及磁盘文件系统,磁盘是底层物理设备,而文件系统则是管理磁盘的上层工具,文件系统规划了磁盘存放数据的格式,确定了一个操作...
  • Ext4文件系统架构分析(一)

    千次阅读 2015-03-26 15:27:24
    本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外。整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等。感兴趣的看官敬...
  • Linux EXT4文件系统特点

    千次阅读 2011-02-19 13:36:00
    Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4Ext4Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能...
  • ext4文件系统新特性

    千次阅读 2013-02-23 19:21:11
    Ext4是Linux文件系统的 一次革命。... Ext2的改进主要在于日志方面,但是Ext4相对于Ext3的的改进是更深层次的,是文件系统数据结构方面的优化。一个高效的、优秀的、可靠的和极具特 点的文件系统就此
  • EXT 文件系统历史, inode, 数据碎片

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,422
精华内容 30,168
关键字:

ext4文件系统增加