Bcachefs

来自 Arch Linux 中文维基

Bcachefs 是新一代的写时复制(CoW)文件系统,旨在提供类似 BtrfsZFS 的功能,同时让代码更简洁,文件系统更稳定、速度更快,以及使用 GPL 兼容的许可证。

Bcachefs 基于 Bcache,两者都主要由 Kent Overstreet 开发。

安装[编辑 | 编辑源代码]

自 2024 年 1 月内核发布 6.7 版本起,Bcachefs 已被合并到上游,因此可以直接安装 linux 或是 linux-zen 来使用。其他的内核软件包可能基于低于 6.7 版本的内核,所以可能会需要额外的补丁才能使用 Bcachefs。

bcachefs-tools 是 Bcachefs 用户空间的工具。

配置[编辑 | 编辑源代码]

单盘[编辑 | 编辑源代码]

# bcachefs format /dev/sda
# mount -t bcachefs /dev/sda /mnt

多盘[编辑 | 编辑源代码]

与 RAID0 类似,Bcachefs 默认会将数据条带化存储 (stripe)。数据冗余由 replicas 选项进行处理。 对 2 个存储设备使用 --replicas=2 相当于 RAID1,对 4 个存储设备使用 --replicas=2 相当于 RAID10,以此类推。

# bcachefs format /dev/sda /dev/sdb --replicas=n
# mount -t bcachefs /dev/sda:/dev/sdb /mnt

Bcachefs 支持混合使用不同的储存设备。如果储存设备的大小不同,为了让每个储存设备以相同的速率填满数据,文件系统在某些储存设备上会使用更大的条带。如果储存设备的速度不同,对冗余数据的读取请求会被发往 IO 延迟最低的设备。如果有些储存设备比其他更可靠(例如硬件 RAID),可以通过 --durability=2 device 来把上面的每份数据副本算成两份。

SSD 缓存[编辑 | 编辑源代码]

Bcachefs 有三个储存目标(storage targets): background、foreground 和 promote。对文件系统进行的写入优先使用 foreground,然后随着时间推移移动至 background。对文件系统的读取会缓存在 promote 上。

注意: 这只是对一个单一储存池而言的优先级。如果 foreground 满了,则系统会直接向 background 写入,或者如果两个都满了则会试着写入 promote。文件系统的元数据会优先写入 foreground,但也有可能会写入三个目标中的任意一个。在移除缓存设备时请小心,因为它们可能仍旧储存了数据。请参见 #移除设备

推荐的一种配置是使用一组 SSD 作为 foreground 和 promote,使用一组 HDD 作为 background(也就是回写缓存)。

# bcachefs format \
    --label=ssd.ssd1 /dev/sda \
    --label=ssd.ssd2 /dev/sdb \
    --label=hdd.hdd1 /dev/sdc \
    --label=hdd.hdd2 /dev/sdd \
    --label=hdd.hdd3 /dev/sde \
    --label=hdd.hdd4 /dev/sdf \
    --replicas=2 \
    --foreground_target=ssd \
    --promote_target=ssd \
    --background_target=hdd
# mount -t bcachefs /dev/sda:/dev/sdb:/dev/sdc:/dev/sdd:/dev/sde:/dev/sdf /mnt

如果想配置直写缓存,和上面操作基本一致,不过要对每个 SSD 设备设置 --durability=0 device。 如果想配置绕写缓存,只需把 HDD 设为 foreground,把 SSD 设为 promote。

配置[编辑 | 编辑源代码]

这篇文章的某些内容需要扩充。

原因: 缺少应该使用什么选项的细节。 (在 Talk:Bcachefs 中讨论)

大多数选项都可以在使用 bcachefs format 格式化时,在挂载时 (mount -o option=value),或是通过 sysfs (echo X > /sys/fs/bcachefs/UUID/options/option) 设置。格式化时的设置与通过 sysfs 更改的设置会被保存到文件系统的超级块中,成为设备的默认选项。挂载时的选项会覆盖这些默认值。

注意: 要使用 sysfs 必须先挂载文件系统。除了 fsck 以外,所有的操作都可以在文件系统挂载状态下进行。
  • 数据校验和 (data_checksum)、元数据校验和 (metadata_checksum),可选:none、crc32c、crc64、xxhash
  • 前台压缩 (compression)、后台压缩 (background_compression),可选:none、lz4、gzip、zstd
  • 存储组配置:foreground_target、background_target、promote_target

以下内容可以通过 bcachefs setattr file --option=value 按每个文件或目录进行设置:

  • 数据冗余数 (data_replicas)
  • 数据校验和 (data_checksum)
  • 前台压缩 (compression)、后台压缩 (background_compression)
  • 存储组配置:foreground_target、background_target、promote_target
注意: 目前储存设备用量显示的是未压缩时的大小。除此之外,压缩功能一切正常。

更改设备所属储存组[编辑 | 编辑源代码]

# echo group.drive_name > /sys/fs/bcachefs/filesystem_uuid/dev-X/label
注意: 需要重新挂载才能生效。

添加设备[编辑 | 编辑源代码]

# bcachefs device add --label=group.drive_name /mnt /dev/device

若这是某储存组中的第一个设备,则需要修改储存目标的设置才能使用。以下例子添加了一个缓存设备。

# echo new_group > /sys/fs/bcachefs/filesystem_uuid/options/promote_target
# echo new_group > /sys/fs/bcachefs/filesystem_uuid/options/foreground_target
# echo old_group > /sys/fs/bcachefs/filesystem_uuid/options/background_target
注意: 只有新的写入会被分散到新添加的设备中去。已经写入的内容不会改变,除非储存设备的占用达到一个阈值,从而触发重新平衡(rebalance/restripe)。目前无法手动触发重新平衡。

移除设备[编辑 | 编辑源代码]

首先请确保至少设备上有两份元数据(设备移除(evacuate)功能似乎对元数据不奏效)。如果数据和元数据都已经有冗余了,可以跳过这一步。

# echo 2 > /sys/fs/bcachefs/UUID/options/metadata_replicas
# bcachefs data rereplicate /mnt
# bcachefs device set-state device readonly
# bcachefs device evacuate device

若想移除设备:

# bcachefs device remove device
# bcachefs data rereplicate /mnt

提示和技巧[编辑 | 编辑源代码]

这篇文章的某些内容需要扩充。

原因: 关于自动挂载的内容可能会有些用处。 (在 Talk:Bcachefs 中讨论)

请查看 Systemd/Journal 以获取更多有用的错误信息。

故障排除[编辑 | 编辑源代码]

32 位程序无法查看目录内容[编辑 | 编辑源代码]

部分 32 位程序可能无法获取 Bcachefs 目录中的内容,这是由于执行 readdir(3) syscall 时文件系统返回的数据不兼容所导致。[1]

要解决这个问题,可以暂时使用不同的文件系统供程序读写,比如 tmpfs

另请参阅[编辑 | 编辑源代码]