Bcachefs
Bcachefs 是下一代 CoW 文件系统,旨在提供来自 Btrfs 和 ZFS 的功能,并具有更简洁的代码库、更高的稳定性、更快的速度和 GPL 兼容的许可证。
它基于 Bcache 构建,主要由 Kent Overstreet 开发。
安装
截至 kernel 6.7 (2024 年 1 月),Bcachefs 已合并到上游 内核 中,因此可在 linux 和 linux-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/
配置
大多数选项可以设置
- 在
bcachefs format
期间, - 格式化后使用
bcachefs set-fs-option
, - 在挂载时使用
mount -o option=value
, - 或通过 sysfs,例如,
echo X > /sys/fs/bcachefs/UUID/options/option
。
挂载选项会覆盖其他方法设置的选项,这些选项会将其保存到文件系统的超级块中。
一些可用选项的示例包括
选项 | 描述 |
---|---|
metadata_checksum | 指定用于元数据写入的校验和算法。默认情况下,算法为 crc32c。您可以选择以下算法之一:none 、crc32c 、crc64 、xxhash 。 |
data_checksum | 指定用于数据写入的校验和算法,与 metadata_checksum 共享相同的默认值和选项。 |
compression | 指定用于(前台)压缩的算法。默认情况下,此选项为 none。您可以选择以下算法之一:none 、lz4 、gzip 、zstd 。 |
background_compression | 指定用于(后台)压缩的算法,与 compression 共享相同的默认值和选项。 |
str_hash | 指定用于目录条目和 xattrs 的哈希函数。您可以选择以下函数之一:crc32c 、crc64 和 siphash 。 |
nocow | 所有写入操作将在可能的情况下就地完成。快照和重链接仍将导致写入操作为 COW,此选项隐式禁用数据校验和、压缩和加密。 |
encrypted | 在文件系统上启用 加密 (chacha20/poly1305);将提示输入密码。 |
更多选项可以在 bcachefs 文档中找到。
以下选项也可以使用 bcachefs setattr file --option=value
在每个目录或每个文件的基础上设置。如果您在目录上设置它,它将递归地传播选项。
- 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
设置在数据被视为“已写入”之前必须写入的数据副本的数量。
--[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
一样。
包括递归快照创建和递归列出子卷的方法等功能仍待实现。
技巧与窍门
查看 日志 以获取更有用的错误消息。
标志排序
某些 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
键即可)。