免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2026 | 回复: 2
打印 上一主题 下一主题

[Linux资讯] 有研究btrfs文件系统的同学吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-31 15:06 |只看该作者 |倒序浏览
有的化希望一起来研究一下它的内部结构,文件数据的组织方式,元数据的组织方式,以及空闲块的管理……

我想B+树 大家伙都很了解的……

这是文件系统的超级块吧
struct btrfs_super_block {
   u8 csum[BTRFS_CSUM_SIZE];
   
   u8 fsid[BTRFS_FSID_SIZE];   
   __le64 bytenr; /* this block number */
   __le64 flags;

   __le64 magic;
   __le64 generation;
   __le64 root;
   __le64 chunk_root;
   __le64 log_root;

   /* this will help find the new super based on the log root */
   __le64 log_root_transid;
   __le64 total_bytes;
   __le64 bytes_used;
   __le64 root_dir_objectid;
   __le64 num_devices;
   __le32 sectorsize;
   __le32 nodesize;
   __le32 leafsize;
   __le32 stripesize;
   __le32 sys_chunk_array_size;
   __le64 chunk_root_generation;
   __le64 compat_flags;
   __le64 compat_ro_flags;
   __le64 incompat_flags;
   __le16 csum_type;
   u8 root_level;
   u8 chunk_root_level;
   u8 log_root_level;
   struct btrfs_dev_item dev_item;

   char label[BTRFS_LABEL_SIZE];

   __le64 cache_generation;
   __le64 reserved[31];
   u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
   struct btrfs_root_backup super_roots[BTRFS_NUM_BACKUP_ROOTS];
} __attribute__ ((__packed__));

磁盘上的键 就靠它来索引数据(包括元数据),有不同类型的键 ,但是我实在不知道objectid是怎么创建的
struct btrfs_disk_key {
   __le64 objectid;
   u8 type;
   __le64 offset;
} __attribute__ ((__packed__));
CPU在内存中使用的键 和上面一样的。
struct btrfs_key {
   u64 objectid;
   u8 type;
   u64 offset;
} __attribute__ ((__packed__));

每个磁盘块都以这个结构 开始的

struct btrfs_header {
   u8 csum[BTRFS_CSUM_SIZE];
   u8 fsid[BTRFS_FSID_SIZE];
   __le64 bytenr;
   __le64 flags;

   u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
   __le64 generation;
   __le64 owner;
   __le32 nritems;
   u8 level;
} __attribute__ ((__packed__));

每个树中的结点都有一组指向下一层结点的指针
struct btrfs_key_ptr {
   struct btrfs_disk_key key;
   __le64 blockptr;
   __le64 generation;
} __attribute__ ((__packed__));

树中的结点
struct btrfs_node {
   struct btrfs_header header;
   struct btrfs_key_ptr ptrs[];
} __attribute__ ((__packed__));

结点中描述数据的项
一个磁盘块中可能有多个项
struct btrfs_item {
   struct btrfs_disk_key key;
   __le32 offset;
   __le32 size;
} __attribute__ ((__packed__));

最低层的叶子结点包含一个磁盘块头和 一组项

struct btrfs_leaf {
   struct btrfs_header header;
   struct btrfs_item items[];
} __attribute__ ((__packed__));

我也没搞清楚它们之间的关系是怎样的 望大家勇于讨论 有资料也行(官方的资料也没说的很清楚)

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
2 [报告]
发表于 2012-10-13 11:41 |只看该作者
nice, 最近开始看,有兴趣。

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
3 [报告]
发表于 2012-10-13 11:45 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP