#btrfs #debugging

bin+lib btrd

btrfs 调试器

12 个版本

0.5.3 2023年10月23日
0.5.2 2022年5月19日
0.5.0 2021年10月21日
0.4.2 2021年8月16日
0.1.1 2021年4月29日

#299文件系统

每月 26 次下载

GPL-2.0 许可证

245KB
6K SLoC

btrd

btrd 是一个 (发音 "buttered") btrfs 调试器。

btrd 是一个 REPL 调试器,它可以帮助检查挂载的 btrfs 文件系统。btrd 特别适用于探索磁盘结构,并且对所有磁盘类型都有全面的了解。

演示

$ sudo btrd
btrd (the btrfs debugger) v0.1.0
Type 'help' for help

(btrd) filesystem "/mnt/btrfs"
(btrd) k = key(BTRFS_DEV_TREE_OBJECTID, BTRFS_ROOT_ITEM_KEY, 0, 0)
(btrd) print k
struct _btrfs_ioctl_search_key {
    .min_objectid = 4,
    .max_objectid = 18446744073709551615,
    .min_type = 132,
    .max_type = 255,
    .min_offset = 0,
    .max_offset = 18446744073709551615,
    .min_transid = 0,
    .max_transid = 18446744073709551615,
}

(btrd) res = search(BTRFS_ROOT_TREE_OBJECTID, k)
(btrd) len(res)
297

(btrd) res[0]
struct btrfs_root_item {
    .inode = struct btrfs_inode_item {
        .generation = 1,
        .transid = 0,
        .size = 3,
        .nbytes = 16384,
<...>
        .sequence = 0,
        .reserved = [
            0,
            0,
            0,
            0,
        ],
        .atime = struct btrfs_timespec {
            .sec = 0,
            .nsec = 0,
        },
<...>

(btrd) print res[0].inode.nbytes
16384

(btrd) typeof(res[0])
"struct btrfs_root_item"

(btrd) keyof(res[0])
struct btrfs_key {
    .objectid = 4,
    .type = 132,
    .offset = 0,
}

构建

$ git clone https://github.com/danobi/btrd.git
$ cd btrd
$ cargo build --release
$ sudo ./target/release/btrd

语言特性

btrd 的脚本语言不是一种恶搞,而是一种动态类型语言,专门针对文件系统调试。以下是一些语言特性

类型

  • 字符串
  • 整数(所有整数在内部都表示为 i128)
  • 布尔值
  • 数组(不能由用户实例化)
  • 结构体(不能由用户定义/实例化)
  • 函数(一等支持;不能由用户定义)

表达式

  • 二元表达式(如 +-/%>>&&== 等)
  • 一元表达式(如 -~!
  • 括号
  • 函数调用
  • 结构体字段访问
  • 数组索引
  • 类型转换(如 (struct btrfs_root) physical_bytenr

控制流

  • while
  • for(基于范围的循环)
  • if/else

不支持,也不会支持

  • 浮点数

依赖关系

~6–14MB
~161K SLoC