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利用率