存储那些事儿(五):BTRFS文件系统之Btree结构详解

   Btree数据结构可以说是BTRFS文件系统的基础。它提供了一个通用的方式去存储不同的数据类型。它仅仅存储3个数据类型:key, item和block header。

   btrfs_header的定义如下:

struct btrfs_header {
    u8 csum[32];
    u8 fsid[16];
    __le64 blocknr;
    __le64 flags;

    u8 chunk_tree_uid[16];
    __le64 generation;
    __le64 owner;
    __le32 nritems;
    u8 level;
}

 btrfs_disk_key的定义如下:

struct btrfs_disk_key {
    __le64 objectid;
    u8 type;
    __le64 offset;
}

  btrfs_item的定义如下:

struct btrfs_item {
    struct btrfs_disk_key key;
    __le32 offset;
    __le32 size;
}

   对于b-tree的非叶子节点,它仅仅保存了[Key, block-pointer]。而叶子(Leaf)节点则保存了[item, data]。data的大小是不固定的。leaf在开始的地方保存了items的一个数组。而在结尾则以反方向保存了data的数组。这两个数组是向中间增长的。结构体btrfs_item.offset保存了data的偏移量,而btrfs_item.size则保存了data的大小。下面的图可以形象的说明这个问题:

     item的data大小是不固定的。并且对于不同的数据结构,这个data的类型也是不一样的。struct btrfs_disk_key::type则说明了data的不同类别。

     btrfs_header保存了这个节点数据的一个checksum,拥有这个节点的文件系统的id,这个节点在树中的level,这个节点所占用的block数目。这些成员数据可以在读取数据的时候对元数据进行验证。对于指向这个btree 节点的所有者来说,它会存储generation的值,这能够保证元数据的正确性。

     对于指向下层节点的node指针来说,为了简化文件回写的逻辑,下层节点的checksum并不会被保存。generation在节点插入btree时已经被计算出了,但是checksum则仅仅在将这个数据块写回到disk时才会计算。因此,使用generation将会使得Btrfs检测到错误的回写。如果使用checksum,那么由于下层节点的checksum仅仅在会写到disk时才会计算,那么计算得到checksum后不得不修改上层指向该节点的checksum,非常低效。

     那么generation是怎么计算出来的?就是分配当前节点的transaction id。这样也使得增量备份变得简单。当然了,这个transaction id是被COW的transaction子系统使用的。

     对于struct btrfs_key.objectid来说,它唯一标识了该逻辑单元,或者叫object。BTRFS就是由这些objects构成的。当object创建时,一个未被其他object使用的object id就会赋给它。objectid可以说是key中最重要的元素。通过objectid,所有的object 都可以组织到b-tree中。

inode

    inode是存在struct btrfs_inode_item中的,其中key.offset == 0 并且 key.type == 1。inode的item肯定都是最前面;它们保存了传统文件和目录的状态信息。它相对来说很小,并且不包含内嵌的文件数据或者扩展的属性。这些信息都是保存到其他类型的item中的。

文件

    小文件如果可以放到一个leaf 节点的话,它是有可能会被放到扩展的item中的。在这种情况下,key.offset保存了文件数据的在extent中的offset;在btrfs_item.size保存了这个文件的大小。这种文件成为inline file,这种文件由于减少了寻址和IO,因此非常快。

    对于大文件来说,它们是存到extent中的。struct_file_extent_item存储了这个extent的generation number 和一个[ disk block, disk num blocks ]数对以记录这个文件存储到的磁盘位置。

尊重原创,转载请注明出处 anzhsoft: http://blog.csdn.net/anzhsoft/article/details/20382885

参考资料:

1. https://btrfs.wiki.kernel.org/index.php/Btrfs_design 

2. BTRFS: The Linux B-tree Filesystem - IBM Research

时间: 2024-08-03 01:18:04

存储那些事儿(五):BTRFS文件系统之Btree结构详解的相关文章

存储那些事儿(五) BTRFS文件系统之Btree结构详解

Btree数据结构可以说是BTRFS文件系统的基础.它提供了一个通用的方式去存储不同的数据类型.它仅仅存储3个数据类型:key, item和block header. btrfs_header的定义如下: struct btrfs_header { u8 csum[32]; u8 fsid[16]; __le64 blocknr; __le64 flags; u8 chunk_tree_uid[16]; __le64 generation; __le64 owner; __le32 nritem

Oracle内存结构详解(五) Oracle PGA

PGA(Program Global Area程序全局区)是一块包含一个服务进程的数据和控制信息的内存区域.它是Oracle在一个服务进程启动是创建的,是非共享的.一个Oracle进程拥有一个PGA内存区.一个PGA也只能被拥有它的那个服务进程所访问,只有这个进程中的Oracle代码才能读写它.因此,PGA中的结构是不需要Latch保护的. 我们可以设置所有服务进程的PGA内存总数受到实例分配的总体PGA(Aggregated PGA)限制. 在专有服务器(Dedicated Server)模式

MyBatis学习教程(五)-实现关联表查询方法详解_java

一.一对一关联  1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR() ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VAR

javascript学习笔记(五)原型和原型链详解_基础知识

私有变量和函数 在函数内部定义的变量和函数,如果不对外提供接口,外部是无法访问到的,也就是该函数的私有的变量和函数. 复制代码 代码如下: <script type="text/javascript">     function Test(){         var color = "blue";//私有变量         var fn = function() //私有函数         {         }     } </script

计算机系统的层次存储结构详解

1.存储器分类 (1) 按存储介质分类 介质 举例 特征 半导体存储器 TTL .MOS 易失 磁表面存储器 磁头.载磁体 非易失 磁芯存储器 硬磁材料.环状元件 非易失 光盘存储器 激光.磁光材料 非易失 (2)按存取方式分类 ①存取时间与物理地址无关(随机访问) 随机存储器 在程序的执行过程中可读可写 只读存储器 在程序的执行过程中只读 ②存取时间与物理地址有关(串行访问) 顺序存取存储器 磁带 直接存取存储器 磁盘 (3) 按在计算机中的作用分类 2.存储器的层次结构 (1)存储器三个主要

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频

跟我学jquery(五)jquery中的ajax详解 .

Ajax让用户页面丰富起来, 增强了用户体验. 使用Ajax是所有Web开发的必修课. 虽然Ajax技术并不复杂, 但是实现方式还是会因为每个开发人员的而有所差异.jQuery提供了一系列Ajax函数来帮助我们统一这种差异, 并且让调用Ajax更加简单. Ajax 最常见的用法就是把一块 HTML 代码加载到页面的某个区域中去.为此,只需简单地选择所需的元素,然后使用 load() 函数即可. 然后如果要用普通的ajax的话会使用大量的代码来实现.下面我们就来看一下jquery中的ajax. 一

linux下Btrfs文件系统学习

一.基础简介    Btrfs(又名:B-tree, Butter FS, Better FS),GPL授权, Oracle从2007研发,写实复制更新机制 CoW,其主要是为了取代ext2,ext3,ext4,其主要功能有例如我们现在去修改一个文件A,COW机制是先将目标文件A复制一份为文件B,那么我们修改文件时是修改的复制文件B,相当于对源文件A做了快照,如对文件B修改操作失误,可以有效的恢复源文件A.    多物理卷支持:btrfs可由多个底层物理卷组成,内建支持RAID(即支持条带.mi

Btrfs文件系统在Linux中的创建及其特性

Btrfs文件系统在Linux中的创建及其特性 Btrfs(B-tree file system,B-tree文件系统)是针对Linux开发的一个新的CoW(copy-on-write,写时复制)文件系统.它最初是由甲骨文公司在2007年着手开始开发的,并在2014年8月正式发布其稳定版.开发Btrfs的目的在于解决Linux文件系统中缺少池.快照.校验和以及集成的跨多设备访问等问题,目标在于实现Linux的规模化存储.规模化不仅仅是指解决存储问题,也意味着通过简洁的界面提供对存储的管控和管理能