问题背景
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 会导致可用空间不足。
插图
手册怎么说?
细读后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.c
btrfs-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。
根据您的需求,这可能是积极的或消极的。