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