暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

深入浅出ext4文件系统之数据块组织和日志

671



作者时间QQ技术交流群
perrynzhou@gmail.com2022/10/01672152841







ext4
inode
数据块存储形式




  • ext4
    目前在kernel
    中的实现有两种分别是基于block
    基于extent
    基于block
    的方式存储文件数据块的元数据有direct block(直接数据块)
    indirect block(一级间接数据块,pointer to direct blocks)
    double indirect block(二级间接数据块,pointer to indirect blocks)
    triple indirect(三级间接数据块,pointer to double indirect blocks)
    .早期是采用这样方式存储,但是有2个弊端其一假设文件是10T文件,基于这样存储形式,整个文件的block元数据是非常多的(由于每个block大小固定);其二如果要读取这个大文件的中一部分数据,查找目标数据块的效率相对比较低。






  • 基于 extent
    存储形式本质采用b-tree
    数据结构存储,这个不同于基于 block
    方式,大文件的extent
    是采用偏移量+长度
    变长的形式记录数据块的位置,每个extent
    作为B-Tree
    的节点。根据这样的设计,超大文件的数据块在B-Tree
    树高度不会太高。这样设计有几个好处,第一是大文件的数据块的元数据存储大量减少(extent采用了变长方式存储);第二是B-Tree
    检索和查找的效率相对较高(比多个间接块好很多)。extent
    数据结构定义如下:


struct ext4_extent {
__le32 ee_block; /* first logical block extent covers */
__le16 ee_len; /* number of blocks covered by extent */
__le16 ee_start_hi; /* high 16 bits of physical block */
__le32 ee_start_lo; /* low 32 bits of physical block */
};
  • ext4
    磁盘inode
    结构中的i_block
    保存文件数据块
    元数据的B-Tree
    .






struct ext4_inode {
__le16 i_mode; /* File mode */
__le16 i_uid; /* Low 16 bits of Owner Uid */
__le32 i_size_lo; /* Size in bytes */
__le32 i_atime; /* Access time */
__le32 i_ctime; /* Inode Change time */
__le32 i_mtime; /* Modification time */
__le32 i_dtime; /* Deletion Time */

// 整个B-Tree的root,EXT4_N_BLOCKS = 15
__le32 i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
/******忽略*******/
};


ext4
journal
日志模式






  • journal
    日志模式中writeback
    模式性能最佳,journal
    模式性能最差,ordered
    日志模式是默认的日志模式

  • ext4
    中的日志是通过journal_start
    journal_stop
    来进行原子操作


Delayed Allocation
特性

  • Delayed Allocation
    在数据被写入的期间可以使用的特性,这个特性主要是延迟实际数据块的空间申请,当数据需要被flush到磁盘的时候实际申请。这样做能组织文件碎片和提供CPU利用率


文章转载自存储内核技术交流,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论