Bcachefs 是新一代的写时复制(CoW)文件系统,它的目标是提供类似 Btrfs 与 ZFS 的功能,同时让代码更简洁,文件系统更稳定、速度更快,以及使用 GPL 兼容的许可证。
Bcachefs 基于 Bcache,两者都主要由 Kent Overstreet 开发。
安装
Bcachefs 已经于 2024 年 1 月被合并入了上游 6.7 版本的内核,因此可以直接安装linux包来使用。其他的内核软件包可能基于低于 6.7 版本的内核,所以可能会需要额外的补丁才能使用 Bcachefs。
bcachefs-tools包 是 Bcachefs 用户空间的工具。
配置
单设备
# bcachefs format /dev/sda # mount -t bcachefs /dev/sda /mnt
多设备
Bcachefs 默认会把数据条带化存储(stripe),这与 RAID0 的行为类似。数据冗余由 replicas 选项进行处理。 对两个储存设备使用 --replicas=2
等同于 RAID1,对四个储存设备使用 --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 上。
推荐的一种配置是使用一批 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
如果想配置透写缓存,和上面操作基本一致,不过要对每个 SDD 设备设定 --durability=0 device
。
如果想配置绕写缓存,只需把 HDD 设为 foreground,把 SSD 设为 promote。
配置
大多文件系统的选项都可以在使用 bcachefs format
格式化时,在挂载时(mount -o option=value
),或是通过 sysfs (echo X > /sys/fs/bcachefs/UUID/options/option
)进行修改。格式化时的设置与通过 sysfs 更改的设置会被保存到文件系统的超级块中,成为设备的默认选项。挂载时的选项会覆盖默认选项。
- 数据校验和(data_checksum)、元数据校验和(metadata_checksum),可选:none、crc32c、crc64
- 前台压缩(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
移除设备
首先请确保至少设备上有两份元数据(设备移除(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
提示和技巧
请查看 Systemd/Journal 以获取更多有用的错误信息。