如何限制 btrfs RAID-0 配置文件中的数据条带数量,以便更好地利用总可用空间?

如何限制 btrfs RAID-0 配置文件中的数据条带数量,以便更好地利用总可用空间?

问题背景

btrfs 的一大优点是它能够有效地使用不同大小的驱动器,但我刚刚了解到它的默认 RAID-0(条带)配置文件并非如此。

我想对三个驱动器使用 RAID-0:8、4 和 4 TB,并希望获得总共 16 TB:8 TB 的前半部分可以用第一个 4 TB 驱动器进行条带化,第二个可以用条带化。一半可以使用第二个 4 TB 驱动器进行条带化。

然而,根据(非常有用)Btrfs 磁盘使用计算器我只会获得 12 TB:每个块都会在所有三个驱动器上进行条带化,这样在我的 8 TB 驱动器上就会留下 4 TB 未使用的空间。这个问题的回答里也提到了使用具有不同驱动器大小的 btrfs RAID0 会导致可用空间不足

插图

这就是我期望发生的事情:
RAID-0 的 btrfs 条带化(如果它像我希望的那样工作)

......这就是实际发生的事情:
btrfs RAID-0 的默认条带化

手册怎么说?

细读后mkfs.btrfs我认为这是因为默认的 RAID-0 配置文件设置了最低限度设备数量为 2,但没有上限。这意味着数据块将在池中可以找到的尽可能多的设备上进行条带化。这当然是一个合理的选择,而且完全有道理。

在使用 btrfs 磁盘使用计算器时,我发现我可以通过设置来获得我想要的最大限度设备数量为 2。这仍然会将我的数据分条到两个驱动器上以获得一些额外的速度,但将分条限制为两个设备,以便它可以使用更多的可用空间。对我来说,这是一个非常有利的权衡,而且我想我并不是唯一一个这么想的人。

问题

我没有找到办法改变创建文件系统时的最大设备数。

  • 这可能吗?
  • 如果是这样,我该如何改变它?
  • 如果我改变它,其他工具会理解布局吗?

答案1

你无法直接做到这一点,但如果有一些运气和努力,这是可能的。

问题是,目前(从 btrfs-progs 5.7 开始),无法在mkfs.btrfs.在线空间计算器还在预设 RAID 级别下包含对此效果的注释:

请注意,这些是目前 btrfs 支持的唯一参数设置。

我尝试了mkfs.btrfs两个驱动器、btrfs device add第三个驱动器和btrfs balance(使用 8+4+4 GiB LV 作为“驱动器”)的各种组合。不幸的是,虽然我经常设法在 FS 上存储超过 12 GiB 的数据,但我从未接近过所需的 16 GiB。根据btrfs device usage,我总是会得到一些混合在 2 和 3 个驱动器上条带化的块。

也就是说,它可能mkfs.btrfs通过修改代码可以使用自定义条带计数。块布局btrfs_alloc_chunk()volume.cbtrfs-progs 中设置。该函数调用init_alloc_chunk_ctl()将 RAID 预设转换为条带计数。min_stripes对于 RAID0,设置为 2,num_stripes(这是实际用于创建块的条带计数)设置为min(ctl->max_stripes, ctl->total_devs)。这里,max_stripes是在 中设置的与块类型相关的限制btrfs_alloc_chunk()

因此,您可以修改该例程以限制num_stripes到所需的值 (2),并使用此类修改mkfs.btrfs来创建一个按您想要的方式运行的文件系统。我没有时间彻底测试这个假设,因此您有可能会遇到内核或 btrfs-progs 中的错误,但恕我直言,它很有可能起作用。毕竟,当您使用未修改的工具和添加/删除设备(如我上面的测试)时,您所追求的磁盘布局仍然经常发生,因此原则上应该支持它。但如果稍后device add/balance再次弄乱布局,我不会太惊讶。

答案2

对此类参数的需求已被注册为值得实施的项目想法:

https://btrfs.wiki.kernel.org/index.php/Project_ideas#Limits_on_number_of_stripes_.28stripe_width.29

截至 2022 年 2 月 12 日,没有人声称正在研究它,也没有任何补丁发送到邮件列表。

答案3

这回答了您的问题,但没有回答标题中提出的问题:

在 Linux 5.15 中,btrfs 允许在单个驱动器上进行 RAID0(“退化 raid”)。这允许您使用完整的 16TB,尽管性能分布可能不是最佳的:

第一个 12TB 的条带宽度为 3(如问题中所示),最后一个 4TB 的条带宽度为 1。

根据您的需求,这可能是积极的或消极的。

相关内容