Bcachefs
Bcachefs 是新一代的写时复制(CoW)文件系统,旨在提供类似 Btrfs 与 ZFS 的功能,同时让代码更简洁,文件系统更稳定、速度更快,以及使用 GPL 兼容的许可证。
Bcachefs 基于 Bcache,两者都主要由 Kent Overstreet 开发。
安装[编辑 | 编辑源代码]
自 2024 年 1 月内核发布 6.7 版本起,Bcachefs 已被合并到上游,因此可以直接安装 linux包 或是 linux-zen包 来使用。其他的内核软件包可能基于低于 6.7 版本的内核,所以可能会需要额外的补丁才能使用 Bcachefs。
bcachefs-tools包 是 Bcachefs 用户空间的工具。
配置[编辑 | 编辑源代码]
单盘[编辑 | 编辑源代码]
# bcachefs format /dev/sdX # mount -t bcachefs /dev/sdX /mnt
多盘[编辑 | 编辑源代码]
与 RAID0 类似,Bcachefs 默认会将数据条带化存储 (stripe)。数据冗余由 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
Bcachefs 支持混合使用不同的储存设备。如果储存设备的大小不同,为了让每个储存设备以相同的速率填满数据,文件系统在某些储存设备上会使用更大的条带。如果储存设备的速度不同,对冗余数据的读取请求会被发往 IO 延迟最低的设备。如果有些储存设备比其他更可靠(例如硬件 RAID),可以通过 --durability=2 device
来把上面的每份数据副本算成两份。
SSD 缓存[编辑 | 编辑源代码]
Bcachefs 有三个储存目标(storage targets): background、foreground 和 promote。对文件系统进行的写入优先使用 foreground,然后随着时间推移移动至 background。对文件系统的读取会缓存在 promote 上。
推荐的一种配置是使用一组 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。
配置[编辑 | 编辑源代码]
大多数选项都可以在使用 bcachefs format
格式化时,在挂载时 (mount -o option=value
),或是通过 sysfs (echo X > /sys/fs/bcachefs/UUID/options/option
) 设置。格式化时的设置与通过 sysfs 更改的设置会被保存到文件系统的超级块中,成为设备的默认选项。挂载时的选项会覆盖这些默认值。
一些可用选项举例如下:
选项 | 描述 |
---|---|
metadata_checksum | 指定用于元数据写入的校验和 (checksum)算法。默认情况下,算法为 crc32c。可以从none 、crc32c 、crc64 、xxhash 中选择其一。
|
data_checksum | 指定用于数据写入的校验和 (checksum)算法,与metadata_checksum 具有相同的默认值和选项。
|
compression | 指定用于(前台)压缩的算法。默认情况下此选项为none 。可以从none 、lz4 、gzip 、zstd 中选择其一。
|
background_compression | 指定用于后台压缩的算法,与compression 具有相同的默认值和选项。
|
str_hash | 指定用于directory entries和 xattrs 的哈希函数。可以从crc32c 、crc64 和siphash 中选择其一。
|
nocow | 在可能的情况下,所有写入都将就地完成。快照 (snapshot) 和 reflink 仍会导致 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
移除设备[编辑 | 编辑源代码]
首先请确保至少设备上有两份元数据(设备移除(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
之间的区别很重要,因为“所需副本”(replicas required)值设定了立即写入副本数量的下限,而“副本”(replicas)值设定了最终写入副本的目标数量。提示和技巧[编辑 | 编辑源代码]
请查看 Systemd/Journal 以获取更多有用的错误信息。
标志顺序[编辑 | 编辑源代码]
一些 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
故障排除[编辑 | 编辑源代码]
32 位程序无法查看目录内容[编辑 | 编辑源代码]
部分 32 位程序可能无法获取 Bcachefs 目录中的内容,这是由于执行 readdir(3) syscall 时文件系统返回的数据不兼容所导致。[1]
要解决这个问题,可以暂时使用不同的文件系统供程序读写,比如 tmpfs。
swapfile 包含空洞或其他不支持的扩展[编辑 | 编辑源代码]
Bcachefs 目前不支持交换文件。
多设备 fstab[编辑 | 编辑源代码]
systemd 目前存在一个错误,无法在启动时使用 fstab 中用冒号分隔的设备挂载多设备 bcachefs 文件系统。在执行 mount -a 时可以正常工作,但无法在启动时加载。
# /dev/nvme0n1:/dev/nvme1n1:/dev/sda:/dev/sdb /mnt bcachefs defaults,nofail 0 0
要在启动时挂载多设备文件系统,必须在 fstab 中使用 OLD_BLKID_UUID
。
# OLD_BLKID_UUID=10176fc9-c4fa-4a30-9fd0-a756d861c4cd /mnt bcachefs defaults,nofail 0 0
文件系统 UUID / 外部 UUID 可以通过以下任意一种方法找到:
# bcachefs fs usage # bcachefs show-super device
挂载加密设备错误[编辑 | 编辑源代码]
对于使用 --encrypted
选项创建的设备,当 bcachefs unlock /dev/sdXY
后挂载失败时,出现
ERROR - bcachefs::commands::cmd_mount: Fatal error: Required key not available
可以通过手动将密钥链接到会话来解决这个问题[2]:
# keyctl link @u @s # mount /dev/sdXY /mnt Enter passphrase:
不需要输入 mount 要求的密码(按回车键
即可)。