bcachefs 的快照实现

这段时间在断断续续地看 bcachefs 的相关内容,这里记录一下快照的实现细节。

数据结构

简要介绍一下涉及的主要数据结构。

copy-on-write(COW) b+tree(参考资料 1)

这是 bcachefs 的核心数据结构,其中的每个节点都比较大,典型的节点大小是 256KB。之所以用这么大的节点,是因为对节点的修改方式是 append-only 的(术语叫 log-structured)。如果要删除其中的某个 item,并不是把它直接从树中删除,而是在节点最后追加一个类型为 KEY_TYPE_whiteout 的相同 key 的 item。这样当查找该 item 的时候,找到这个带有 KEY_TYPE_whiteout 的 key 时,就知道该元素被删除了,从而跳过该 item 的处理。当节点满了之后可能需要分裂并引发对从当前节点到根节点的修改,这时就是常规的 COW 操作了(参考资料 2)。因为节点都比较大,同时对于链路上的节点大部分是 append 操作,不会引发 COW,因此并不会导致太多的写放大。

对于文件系统中的组成部分,如 inode/dirent/extent 等,会分别存放在各自的 COW b+tree …

阅读全文…

bcachefs 调试环境搭建

记录一下调试 bcachefs 的环境搭建。

编译内核的时候要打开 bcachefs 相关的选项,选为 built-in

下载 bcachefs-tools,根据文档编译。因为主机上的内核还没有 bcachefs 的支持,而且我把 bcachefs 作为根文件系统方便调试,因此编译时要打开 fuse 方便拷数据(需要额外安装 libfuse3-dev):

BCACHEFS_FUSE=1 make -j`nproc`

然后制作 rootfs:

truncate -s 1073741824 /path/to/bcachefs.raw
/path/to/bcachefs-tools/target/release/bcachefs format /path/to/bcachefs.raw
/path/to/bcachefs-tools/target/release/bcachefs fusemount /path/to/bcachefs.raw mnt

挂载到 mnt 之后就可以开始往里拷执行环境了(tar 解压备份的系统到 mnt 中)。…

阅读全文…