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
分享到:
相关推荐
btrfs 文件系统快照清理工具。在 openSUSE 系统下使用 Btrfs 文件系统时,快照管理工具 snapper 会自动生成许多快照,而 snapper 自带的快照清理功能又不是很方便,因此便写了这个脚本,用以辅助 snapper 进行快照的...
bedup查找新文件和更改过的文件,以确保相同文件的多个副本共享磁盘上的空间。 它与btrfs进行了深度集成,因此扫描是渐进的且影响较小。要求您需要Python 3.3或更高版本,以及Linux 3.3或更高版本。 建议使用Linux ...
linux文件系统btrfs介绍,设计原理
btrfs Btrfs Go库
btrfs-snappy BTRFS 自动快照实用程序允许用户使用 crontab 设置 btrfs 子卷的自动快照。 使用中央配置文件,每个子卷都可以拥有独立的快照间隔和保留,而无需冗长的 crontab。 快速开始 下载主要的可执行文件并将...
btdu-btrfs的采样磁盘使用情况分析器 一些功能可能使难以估计正在使用什么磁盘空间: 子卷允许对整个文件系统树进行廉价的写时复制快照,而未经修改的数据将在快照之间共享文件和扩展区克隆允许创建文件或其部分的...
WinBtrfs是下一代Linux文件系统Btrfs的Windows驱动程序。 从头开始的重新实现,它不包含来自Linux内核的代码,并且可以在Windows XP以后的任何版本上使用。 它也作为免费操作系统一部分包含在内。 如果您的Btrfs...
这是补充btrfs文件系统的一组脚本,旨在自动执行一些维护任务。 这意味着擦洗,平衡,修剪或碎片整理。 每个任务都可以打开/关闭并独立配置。 选择默认配置值以使默认安装配置文件与根文件系统上的btrfs匹配。 ...
btrfs-borg Btrfs-borg制作快照,并使用Borg备份btrfs快照子卷的列表。 它也可以选择备份目录列表,而无需先为其创建快照。 它包括对由LXC的btrfs后端管理的容器的特殊支持。 最后,它支持构建不会备份的目录清单。...
次世代Linux文件系统Btrfs(上).pdf
Ext2、Ext3、Ext4、XFS、JFS、ReiserFS 和 Btrfs 的全面性能测试,对比结果如下:本次测试所使用的 Linux kernel 版本为 2.6.29-rc3,文件系统性能测试工具为 IOzone 3.318。 测试数据单位:Kbytes/sec 请作参考。
BTRFS出口商 用于BTRFS卷的Prometheus导出器。 如何 pip3 install btrfs flask FLASK_APP=btrfs_exporter.py STAT_URL=/metrics flask run --host=127.0.0.1 --port 9101 样本输出: $ curl localhost:9101/metrics...
存档到离线存储加密备份到非btrfs的存储通配符子卷(适用于docker和lxc容器) 交易记录全面的列表和统计数据输出解决并跟踪btrfs的父子关系和接收人关系列出备份之间的文件更改根据块区域计算准确的磁盘空间使用量...
btrfs快照差异 关于 btrfs-snapshots-diff.py是一个简单的Python3脚本,它显示了两个Btrfs快照之间的差异(显然来自同一子卷)。 使用btrfs send --no-data计算差异,解码流并显示差异。 用法 usage: btrfs-...
zfs->btrfs 迁移的注意事项 启动到 Linux Mint 17.1 Cinnamon live CD/USB 我正在使用以下安装座,您的可能有所不同: /dev/sda -> 大硬盘 /dev/sdb -> 一个带有 Ubuntu 安装程序的临时 U 盘 /dev/sdc -> 用于引导的...
openEuler内核源于Linux,Linux...文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构:即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统
WinBtrfs是一个用于下一代Linux文件系统Btrfs的Windows驱动程序
在BTRFS模式下,使用BTRFS文件系统的内置功能拍摄快照。 BTRFS快照仅在具有Ubuntu型子卷布局(带有@和@home子卷)的BTRFS系统上受支持。 时移类似于 , 和类的应用程序,但目标不同。 它旨在仅保护系统文件和设置。...
离线安装包,测试可用
btrfs-工作流程Btrfs工作流程文档和支持脚本补丁提交有关提交内核补丁的工作流程和信息。 fstests.md新测试的工作流程using-fstests.md有关如何设置,配置和使用fstests以及如何编写新测试的常规文档。 脚本/ *。 ...