Bcachefs

出自 ArchWiki

Bcachefs 是下一代 CoW 文件系统,旨在提供来自 BtrfsZFS 的功能,并具有更简洁的代码库、更高的稳定性、更快的速度和 GPL 兼容的许可证。

它基于 Bcache 构建,主要由 Kent Overstreet 开发。

安装

截至 kernel 6.7 (2024 年 1 月),Bcachefs 已合并到上游 内核 中,因此可在 linuxlinux-zen 软件包中找到。其他内核软件包可能基于低于 6.7 的版本,并且需要 Bcachefs 的特殊补丁。

Bcachefs 用户空间工具可从 bcachefs-tools 获取。

设置

单驱动器

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

多驱动器

默认情况下,Bcachefs 条带化数据,类似于 RAID0。冗余通过 replicas 选项处理。2 个驱动器使用 --replicas=2 相当于 RAID1,4 个驱动器使用 --replicas=2 相当于 RAID10,依此类推。

# bcachefs format /dev/sdX /dev/sdY --replicas=n
# mount -t bcachefs /dev/sdX:/dev/sdY /mnt

支持异构驱动器。如果它们的大小不同,则在某些驱动器上将使用更大的条带,以便它们都以相同的速率填满。如果它们的速度不同,则复制数据的读取将发送到 IO 延迟最低的驱动器。如果某些驱动器比其他驱动器更可靠(例如,硬件 raid 设备),则可以设置 --durability=2 device 以将该设备上的每个数据副本计为 2 个副本。

加密的根文件系统

Bcachefs 支持使用 ChaCha20Poly1305 的全文件系统加密。要格式化加密的文件系统

# bcachefs format --encrypted /dev/sdX

对于根文件系统,将 bcachefs 添加到 /etc/mkinitcpio.conf 配置文件中的 HOOKS 数组,以便在启动或从休眠状态恢复时提示解锁文件系统。

SSD 缓存

Bcachefs 具有 3 个存储目标:后台、前台和提升。写入文件系统的操作优先考虑前台驱动器,然后随着时间的推移将其移动到后台。读取操作缓存在提升驱动器上。

注意: 这些仅是单个大型池的优先级指南。如果前台已满,则写入将直接转到后台;如果前台和后台都已满,则写入将直接转到提升。元数据将优先选择前台,但可以写入到任何目标。移除缓存驱动器时要小心,因为它可能仍包含数据。请参阅 #移除设备

推荐的配置是为前台和提升使用 ssd 组,为后台(回写缓存)使用 hdd 组。

# 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 组,提升目标设置为 ssd 组。

挂载

默认的挂载方式是在挂载指令中指定每个设备。

# mount -t bcachefs /dev/sdA:/dev/sdB:/dev/sdC:/dev/sdD:/

mount.bcachefs 命令支持通过 UUID 挂载文件系统,UUID 在文件系统创建时由 bcachefs format 显示。

# mount.bcachefs UUID=f66d108f-83d2-4679-b50b-7d5e710f6a2b /mnt/

配置

本文或本章节需要扩充。

原因: 缺少关于应使用哪些选项的详细信息(在 Talk:Bcachefs 中讨论)

大多数选项可以设置

  • bcachefs format 期间,
  • 格式化后使用 bcachefs set-fs-option
  • 在挂载时使用 mount -o option=value
  • 或通过 sysfs,例如,echo X > /sys/fs/bcachefs/UUID/options/option

挂载选项会覆盖其他方法设置的选项,这些选项会将其保存到文件系统的超级块中。

注意: 文件系统必须挂载才能使 sysfs 可用。除了 fsck 之外的所有操作都可以在实时文件系统上进行。

一些可用选项的示例包括

Bcachefs 选项
选项 描述
metadata_checksum 指定用于元数据写入的校验和算法。默认情况下,算法为 crc32c。您可以选择以下算法之一:nonecrc32ccrc64xxhash
data_checksum 指定用于数据写入的校验和算法,与 metadata_checksum 共享相同的默认值和选项。
compression 指定用于(前台)压缩的算法。默认情况下,此选项为 none。您可以选择以下算法之一:nonelz4gzipzstd
background_compression 指定用于(后台)压缩的算法,与 compression 共享相同的默认值和选项。
str_hash 指定用于目录条目和 xattrs 的哈希函数。您可以选择以下函数之一:crc32ccrc64siphash
nocow 所有写入操作将在可能的情况下就地完成。快照和重链接仍将导致写入操作为 COW,此选项隐式禁用数据校验和、压缩和加密。
encrypted 在文件系统上启用 加密 (chacha20/poly1305);将提示输入密码。

更多选项可以在 bcachefs 文档中找到。

以下选项也可以使用 bcachefs setattr file --option=value 在每个目录或每个文件的基础上设置。如果您在目录上设置它,它将递归地传播选项。

注意: 重新平衡线程尚未在后台调整副本。这意味着,如果您更改文件上的副本选项,则必须手动运行 rereplicate 命令以确保旧文件遵循新规则。
  • data_replicas
  • data_checksum
  • compression, background_compression
  • foreground_target, background_target, promote_target

要检查哪些选项处于活动状态,您可以执行 getfattr -d -m 'bcachefs_effective\.' directory/file

注意: 磁盘使用情况报告目前显示未压缩的大小。压缩在其他方面是完整的。

更改设备的组

设备的组可以通过 sysfs 更改。

# 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
注意: 只有新的写入操作才会跨添加的设备进行条带化。现有操作将保持不变,直到磁盘使用率达到某个阈值,此时将触发磁盘重新平衡。目前无法手动触发重新平衡/重新条带化。

移除设备

首先确保至少有 2 个元数据副本(Evacuate 似乎不适用于元数据)。如果您的数据和元数据已经复制,您可以跳过此步骤。

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

设置状态 ro,表示 只读

要移除设备

# bcachefs device remove device
# bcachefs data rereplicate /mnt

复制

元数据和数据副本可以根据用户所需的冗余级别单独配置。有五个与副本相关的选项

  • --replicas=X 同时设置元数据和数据副本的数量。
  • --metadata_replicas=X 设置最终将写入的元数据副本的数量。
  • --data_replicas=X 设置最终将写入的数据副本的数量。
  • --metadata_replicas_required=X 设置在元数据被视为“已写入”之前必须写入的元数据副本的数量。
  • --data_replicas_required=X 设置在数据被视为“已写入”之前必须写入的数据副本的数量。
注意

本文或本章节的事实准确性存在争议。

原因: _required 后缀用于定义 mount -o degraded 选项使用的限制。 [1] (在 Talk:Bcachefs 中讨论)

--[meta]data_replicas_required--[meta]data_replicas 之间的区别很重要,因为 required 副本值设置了立即写入的副本数量的下限,而副本值设置了最终将写入的副本的目标数量。

压缩

压缩通过 --compression= 选项设置。也可以设置压缩级别。例如,要设置 zstd 压缩级别 5,您可以使用 --compression=zstd:5

子卷

Bcachefs 支持子卷和快照,其用户空间界面与 Btrfs 类似。可以创建一个新的空子卷,也可以将其创建为另一个子卷的快照。快照是可写的,并且可以再次快照,从而创建快照树。

创建快照非常廉价:它们不像 Btrfs 那样基于 COW btree 的克隆,而是基于 btree 中各个键的版本控制。可以创建成千上万甚至数百万个快照,唯一的限制是磁盘空间。

创建子卷

要创建新的空子卷

# bcachefs subvolume create /path/to/subvolume

删除子卷

要删除现有的子卷或快照

# bcachefs subvolume delete /path/to/subvolume

创建现有子卷的快照

要创建现有子卷的快照

# bcachefs subvolume snapshot /path/to/source /path/to/dest

子卷也可以在删除所有内容后使用普通的 rmdir 删除,就像使用 rm -rf 一样。

包括递归快照创建和递归列出子卷的方法等功能仍待实现。

技巧与窍门

本文或本章节需要扩充。

原因: 关于自动挂载的信息将很有用(在 Talk:Bcachefs 中讨论)

查看 日志 以获取更有用的错误消息。

标志排序

某些 bcachefs format 标志是根据其参数顺序设置的,并且仅影响在标志切换后出现的驱动器。例如,如果您希望 SSD 具有 --durability=0 并启用 --discard,而 HDD 使用默认值,请确保按以下顺序传递参数

# bcachefs format \
    --label=hdd.hdd1 /dev/sdC \
    --label=hdd.hdd2 /dev/sdD \
    --label=hdd.hdd3 /dev/sdE \
    --label=hdd.hdd4 /dev/sdF \
    --durability=0 --discard \
    --label=ssd.ssd1 /dev/sdA \
    --label=ssd.ssd2 /dev/sdB \
    --replicas=2 \
    --foreground_target=ssd \
    --promote_target=ssd \
    --background_target=hdd

格式化后设置副本

可以在格式化后使用 set-fs-option 设置副本计数。

# bcachefs set-fs-option --metadata_replicas=2 --data_replicas=2 /dev/sdX

之后,您需要告诉 bcachefs 确保所有文件都有一个副本,方法是

# bcachefs data rereplicate /mnt

故障排除

32 位程序无法查看目录内容

某些 32 位程序可能无法检索 Bcachefs 中目录的内容,这是因为当执行 readdir(3) 系统调用时,文件系统返回的数据不兼容。 [2]

可以通过临时使用不同的文件系统(例如 tmpfs)来解决此问题,以供此类程序读取和写入。

交换文件包含空洞或其他不支持的范围。

Bcachefs 目前不支持 交换文件

多设备 fstab

目前 systemd 中存在一个错误,使其无法在启动时使用 fstab 中用冒号分隔的设备来挂载多设备 bcachefs 文件系统。当执行 mount -a 时,它将起作用,但不会在启动时挂载。但是,自 bcachefs-tools 版本 1.7.0 以来,可以使用一个设备节点挂载多设备阵列;这允许使用正常的 UUID 说明符。

# UUID=10176fc9-c4fa-4a30-9fd0-a756d861c4cd     /mnt   bcachefs defaults,nofail 0 0

文件系统 UUID / 外部 UUID 可以通过以下任一方式找到

# bcachefs fs usage /mnt
# bcachefs show-super /dev/sdXY

挂载加密设备时出错

当使用 --encrypted 选项创建的设备的挂载在 bcachefs unlock /dev/sdXY 后失败,并出现以下错误时

ERROR - bcachefs::commands::cmd_mount: Fatal error: Required key not available

可以通过手动将密钥链接到会话来解决此问题[3]

# keyctl link @u @s
# mount /dev/sdXY /mnt
Enter passphrase:

不需要重新输入 mount 查询的密码(按 Enter 键即可)。

参见