精华内容
下载资源
问答
  • EXt4 文件系统

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

    Linux 支持几个不同的文件系统。这些文件系统中,一些是专用的网络文件系统或为其他操作系统开发的文件系统,但绝大部分还是用作 Linux 本地文件系统 — 您可以将 Linux 根(/)和系统目录放在这种文件系统里。目前(2008年),这一类文件系统包括 ext2、ext3、ReiserFS、XFS 和 Journaled File System (JFS)。但是文件系统一直在不断设计和开发中,新的文件系统也将陆续问世。

    目前正在开发的最重要的 Linux 文件系统是 ext4 — 它是专门为 Linux 开发的原始的扩展文件系统(ext 或 extfs)的第四版。由于继承了以前版本,ext4 在不久的将来很可能会成为一个重要的 Linux 标准文件系统(51CTO编辑注:本文撰写于2008年,当时ext4尚处于试验阶段。截至到2010年6月,ext4目前已在多种发行版中被接受为默认文件系统之一,红帽的RHEL 6也将采用ext4作为默认文件系统,可以说ext4技术现在已经成熟)。

    Ext4 与 ext3 的对比

    扩展文件系统(ext 或 extfs)第四版产生的原因是开发人员在 ext3 中并入了新的高级功能。但在实现的过程出现了几个问题:

    • 一些新功能违背向后兼容性。
    • Ext3 代码变得更加复杂并难以维护。
    • 这些更改使原本十分可靠的 ext3 变得不可靠。

    由于这些原因,从 2006 年 6 月份开始,开发人员决定把 ext4 从 ext3 中分离出来进行独立开发。Ext4 的开发工作从那时起开始进行,但大部分 Linux 用户和管理员都不怎么注意这件事情。随着 2.6.19 内核在 2006 年 11 月的发布,ext4 第一次出现在主流内核里,但是它当时还处于试验阶段(现在还是),因此很多人都忽视了它。

    由于还处于开发阶段,从 2.6.24.4 内核开始,ext4 的功能列表就一直在变动。 Ext4 的当前和预期功能包括从 ext3 发展而来的功能,见下表:

    ◆大型文件系统

    ext4文件系统可支持最高1 Exbibyte的分区区与最大16 Tebibyte的文件。

    ◆Extents

    ext4引进了Extent文件存储方式,以取代ext2/3使用的block mapping方式。Extent指的是一连串的连续物理block,这种方式可以增加大型文件的效率并减少分裂文件。ext4支持的单一Extent,在单一block为4KB的系统中最高可达128MB[1]。单一inode中可存储4笔Extent;超过四笔的Extent会以Htree方式被索引。

    ◆向下兼容

    ext4向下兼容于ext3与ext2,因此可以将ext3和ext2的文件系统挂载为ext4分区区。由于某些ext4的新功能可以直接运用在ext3和ext2上,直接挂载即可提升少许效能。

    ext3文件系统可以部分向上兼容于ext4(也就是说ext4文件系统可以被挂载为ext3分区区)。然而若是使用到Extent技术的ext4将无法被挂载为ext3。

    ◆预留空间

    ext4允许对一文件预先保留软盘空间。目前大多数文件系统做到这点的方式是直接产生一个填满0的文件;ext4和XFS可以使用Linux内核中的一个新的系统调用“fallocate()”取得足够的预留空间。

    ◆延迟取得空间

    ext4使用一种称为allocate-on-flush的方式,可以在数据将被写入软盘(sync)前才开始取得空间;大多数文件系统会在之前便取得需要的空间。这种方式可以增加效能并减少文件分散程度。

    ◆突破32000子目录限制

    ext3的一个目录下最多只能有32000个子目录。ext4的子目录最高可达64000,且使用“dir_nlink”功能后可以达到更高(虽然父目录的link count会停止增加)。为了避免效能受到大量目录的影响,ext4默认打开Htree(一种特殊的B-tree)索引功能。该功能已经实现于Linux内核2.6.23版。

    ◆日志校验和

    Ext4使用校验和特性来提高文件系统可靠性,因为日志是磁盘上被读取最频繁的部分之一。这个特性还有一个好处就是可以安全地避免日志处理时磁盘I/O的等待,而稍微提高一些性能。日志校验和的技术源于威斯康辛大学的一篇名为IRON File Systems的研究论文(见第六节 transaction checksums校验和处理)[5]

    ◆在线磁盘整理

    对于在线磁盘整理工具有许多草案,但是这些草案都没有被包含在主流的内核当中。即使Ext4包含有许多避免磁盘碎片的技术,但是磁盘碎片还是难免会在一个长时间使用过的文件系统中存在。Ext4将会有一个具有磁盘整理功能的工具[来源请求].

    ◆快速文件系统检查

    Ext4将未使用的区块标记在inode当中,这样可以使诸如e2fsck之类的工具在磁盘检查时将这些区块完全跳过,而节约大量的文件系统检查的时间。这个特性已经在2.6.24版本的Linux内核中实现。

    (以上列表引用自维基百科)

    功能列表的一些功能在实际使用中不具备与 ext3 的向后兼容性 — 即可能无法使用 ext3 文件系统类型的代码挂载 ext4 文件系统。但是 ext4 保留了向前兼容性 — 您可以像挂载 ext4 文件系统一样挂载 ext3 文件系统。

    展开全文
  • 制作ext4文件系统

    千次阅读 2018-07-04 14:15:35
    原文地址:https://blog.csdn.net/zuoyioo7/article/details/74529255 制作ext4文件系统beaglebone对应硬件设备存储器均为emmc,并不是传统的nand flash,因此文件系统格式也不再是传统的yaffs或是...

    原文地址:https://blog.csdn.net/zuoyioo7/article/details/74529255

    制作ext4文件系统
    beaglebone对应硬件设备存储器均为emmc,并不是传统的nand flash,因此文件系统格式也不再是传统的yaffs或是jffs文件系统了。需要ext4文件系统。
    在debian用户目录下新建目录rootfs_tmp文件,用于临时挂载文件系统:
    mkdir -p rootfs_tmp
    复制代码
    制作一个128M(128x1024=131072)的ext4空白文件:
    dd if=/dev/zero of=rootfs.ext4 bs=1024 count=131072
    复制代码
    再将新建的rootfs.ext4文件格式化为ext4格式:
    sudo mkfs.ext4 rootfs.ext4
    复制代码
    将rootfs.ext4文件挂载到前面我们新建的临时目录rootfs_tmp,注意这里我们要使用mount –o loop的属性,表示我们要把rootfs.ext4当作硬盘分区挂载到rootfs_tmp:
    sudo mount -o loop rootfs.ext4 ./rootfs_tmp
    复制代码

    这时,我们就可以给rootfs.ext4填充内容了。执行如下指令拷贝文件系统内容:

    cd ./rootfs_tmp

    cp -avrf ../busybox_rootfs/* ./
    复制代码
    拷贝完后,卸载挂载的rootfs.ext4文件,即完成了文件系统的制作:

    sudo umount ./rootfs_tmp

    这样就完成ext4格式的rooffs文件系统的制作。

    补充:

    使用 ext4 做根文件系统制作根文件系统镜像# dd if=/dev/zero of=xxx.ext4 bs=1M count=256# mkfs.ext4 xxx.img# mount -o loop xxx.img /mnt/# cp rootfs/* /mnt/ -rf# sync# umount /mnt/

    展开全文
  • 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分成块组,每组...
  • 海思制作EXT4文件系统工具make_ext4fs

    千次阅读 2019-11-12 13:47:40
    针对海思falsh为emmc时,我们需要制作ext4文件系统,需要用到海思自带make_ext4fs制作文件系统,下面把该工具源码和使用分析一下。 2.源码分析 2.1 用法 static void usage(char *path) { fprintf(stderr, "%s ...
  • Ext4文件系统在线扩展大小的本质是将文件系统的数据块个数...从功能上来看是扩展文件系统最后一个块组(EXT4_IOC_GROUP_EXTEND)与增加块组扩展文件系统(EXT4_IOC_GROUP_ADD)两种方式的结合,但是处理上稍微有点不
  • make_ext4fs用于Android平台上制作ext4文件系统的镜像。用法举例: make_ext4fs -l 512M -s -a system system.ext4img system 之后再使用simg2img制作镜像。   有一个问题是,使用这样制作的...
  • 为了方便学习文件系统的原理和原始数据的分析,需要创建虚拟块设备并格式化为ext4文件系统; Linux创建虚拟块设备 losetup命令 -a 显示所有已经使用的回环设备状态 -d 卸除回环设备 -f 寻找第一个未使用的...
  • 超级块代表了整个文件系统,超级块是文件系统的控制块,有整个文件系统信息,一个文件系统所有的inode都要连接到超级块上,可以说,一...对于ext4文件系统,它的超级块信息与结构体super_block、ext4_super_block、e...
  • Ext4 文件系统学习

    千次阅读 2013-04-02 16:44:29
    Ext4 文件系统中主要增加了一下功能: ...Ext3文件系统可以mount为Ext4文件系统,旧的文件就没有Ext4文件系统的特性,新创建的文件有Ext4文件系统的特性,这可以允许Ext3文件系统在线迁移到Ext4文件系统上。
  • 学习笔记: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...
  • Ext4文件系统的特色

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

    千次阅读 2017-11-26 21:10:26
    EXT4文件系统ext4_fill_super() 一.概述  在磁盘挂载的时候文件系统需要从磁盘中读取超级块来填充内存中的结构,EXT4文件系统超级块的填充是由函数ext4_fill_super()来完成的。在EXT4文件系统中,磁盘上的超级...
  • EXT4文件系统的磁盘布局

    千次阅读 2017-11-11 16:08:46
    EXT4文件系统是从EXT2/EXT3文件系统上继承和发展而来的,EXT4也使用EXT2/EXT3的一些元数据的概念,如超级块,块组描述符,块组位图,节点位图,节点数据,在EXT2/EXT3中还有间接数据块,EXT4的节点如果不用content...
  • resize2fs命令 针对的是ext2、ext3、ext4文件系统xfs_growfs命令 针对的是xfs文件系统 1、ext2/ext3/ext4文件系统的调整命令是resize2fs(增大和减小都支持) 1 2 3 4 5 lvextend...
  • Linux ext2, ext3, ext4 文件系统解读[4]

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

    千次阅读 2019-06-14 10:25:13
    使用过Linux的同学应该对Ext4文件系统都有了解。在Linux文件系统中一切皆文件,同样目录也是文件的一种类型。熟悉Linux服务器的同学经常会看到如下内容,这个是某个目录的列表内容。每一行的前面形如drwxr-xr-x的...
  • Ext4文件系统Ext3文件系统性能对比

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

    千次阅读 2019-09-28 02:17:41
    Ext4文件系统修复 目录 一、 super block................................................................................................................................................. 二、查看...
  • 让CentOS支持ext4文件系统

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

    千次阅读 2016-01-22 10:26:39
    ext3-->ext4
  • ext3和ext4文件系统来窥探空间和文件大小的演算法则 学习操作系统就不得不研究磁盘以及磁盘文件系统,磁盘是底层物理设备,而文件系统则是管理磁盘的上层工具,文件系统规划了磁盘存放数据的格式,确定了一个操作...
  • 开始学习EXT4文件系统

    千次阅读 2015-03-26 15:31:55
    文件系统是个有意思的东西, 之前接触了FAT和NTFS(都是基于开源的项目, ...正好android上的文件系统也从YAFFS换成了EXT4,因此打算借此契机通读一下EXT4文件系统. http://zh.wikipedia.org/zh-sg/Ext4 上说Linux 2.
  • EXT4文件系统禁用日志功能

    千次阅读 2018-11-08 11:42:21
    ext4提供有很多特性,当然有一些是前一代文件系统ext3本身就具有的,比如日志功能,但有时候我们却并不需要这些特性,则我们可以禁用它们。ext4文件系统的日志功能就是在牺牲一定性能的情况下增强稳定性的一种手段,...
  • ext4文件系统错误处理机制

    万次阅读 2016-11-09 18:52:14
    ext4文件系统错误处理机制 4月 23rd, 2013 | Filed under FileSystem发表评论 目前内核对ext4文件系统错误处理机制分为三种:1.不处理;2.内核panic;3.错误分区remount成只读形式。处理机制的设定是在两个地方...
  • Ext4文件系统故障的解决方法分享

    千次阅读 2017-03-08 17:04:15
    这种故障在Ext3、Ext4文件系统常有发生,好在.journal日志文件留有缓冲,恢复时可以从.journal日志文件里找到相应信息,并粘贴回相应位置,达到重建原文件的目的。Linux系统的硬盘的第一个扇区是MBR扇区,从MBR分区...
  • 本文将介绍Linux系统中的fsync和fdatasync的功能和区别,并以Ext4文件系统为例,详细分析内核如何将文件数据同步到磁盘。
  • 如何制作Ext4文件系统镜像

    千次阅读 2015-10-24 17:54:34
    如何制作Ext4文件系统镜像将来有一天,在一个目录上右击,会有一个选项是「生成Ext4镜像」。但是目前还没有,记录一下步骤。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 234,729
精华内容 93,891
关键字:

ext4文件系统