zoukankan      html  css  js  c++  java
  • 基于Extent 的文件存储(fiemap)

           现代很多文件系统都采用了 extent 替代 block 来管理磁盘。 Extent 就是一些连续的 block,一个 extent 由起始的 block 加上长度进行定义。

           Extent 能有效地减少元数据开销。为了进一步理解这个问题,我们还是看看 ext2 中的反面例子。

           ext2/3 以 block 为基本单位,将磁盘划分为多个 block 。为了管理磁盘空间,文件系统需要知道哪些 block 是空闲的。 Ext 使用 bitmap 来达到这个目的。 Bitmap 中的每一个 bit 对应磁盘上的一个 block,当相应 block 被分配后,bitmap 中的相应 bit 被设置为 1 。这是很经典也很清晰的一个设计,但不幸的是当磁盘容量变大时,bitmap 自身所占用的空间也将变大。这就导致了扩展性问题,随着存储设备容量的增加,bitmap 这个元数据所占用的空间也随之增加。而人们希望无论磁盘容量如何增加,元数据不应该随之线形增加,这样的设计才具有可扩展性。

           下图比较了 block 和 extent 的区别:采用 extent 的 btrfs 和采用 bitmap 的 ext2/3

    采用extent的btrfs和采用bitmap的ext2/3

           在 ext2/3 中,10 个 block 需要 10 个 bit 来表示;在 btrfs 中则只需要一个元数据。对于大文件,extent 表现出了更加优异的管理性能。

           Extent 是 btrfs 管理磁盘空间的最小单位,由 extent tree 管理。 Btrfs 分配 data 或 metadata 都需要查询 extent tree 以便获得空闲空间的信息。

           注:EXT4文件系统也采用了基于extend的文件存储

    extend数据结构:(基于linux3.2内核)

    struct fiemap_extent {
    	__u64 fe_logical;  /* logical offset in bytes for the start of
    			    * the extent from the beginning of the file */
    	__u64 fe_physical; /* physical offset in bytes for the start
    			    * of the extent from the beginning of the disk */
    	__u64 fe_length;   /* length in bytes for this extent */
    	__u64 fe_reserved64[2];
    	__u32 fe_flags;    /* FIEMAP_EXTENT_* flags for this extent */
    	__u32 fe_reserved[3];
    };
    
    struct fiemap {
    	__u64 fm_start;		/* logical offset (inclusive) at
    				 * which to start mapping (in) */
    	__u64 fm_length;	/* logical length of mapping which
    				 * userspace wants (in) */
    	__u32 fm_flags;		/* FIEMAP_FLAG_* flags for request (in/out) */
    	__u32 fm_mapped_extents;/* number of extents that were mapped (out) */
    	__u32 fm_extent_count;  /* size of fm_extents array (in) */
    	__u32 fm_reserved;
    	struct fiemap_extent fm_extents[0]; /* array of mapped extents (out) */
    };

    主要函数:

    int fiemap_fill_next_extent(struct fiemap_extent_info *fieinfo, u64 logical,
    			    u64 phys, u64 len, u32 flags)
    int __generic_block_fiemap(struct inode *inode,
    			   struct fiemap_extent_info *fieinfo, loff_t start,
    			   loff_t len, get_block_t *get_block)



     

  • 相关阅读:
    Annotation
    injector
    Java容器(container)
    build tool(构建工具)maven和gradle安装方法
    version control(版本控制)
    函数式编程
    URI与URL
    超文本传输协议HTTP
    annotation的理解
    Injection
  • 原文地址:https://www.cnblogs.com/youngerchina/p/5624646.html
Copyright © 2011-2022 走看看