btrfs 的一大优点是它能够有效地使用不同大小的驱动器,但我刚刚了解到它的默认 RAID-0(条带化)配置文件并非如此。
\n我想对三个驱动器使用 RAID-0:8、4 和 4 TB,并希望获得总共 16 TB:8 TB 的前半部分可以用第一个 4 TB 驱动器进行条带化,第二个可以用条带化。一半可以使用第二个 4 TB 驱动器进行条带化。
\n然而,根据(非常有用的)btrfs 磁盘使用计算器,我只会获得 12 TB:每个块将在所有三个驱动器上进行条带化,这在我的 8 TB 驱动器上留下了 4 TB 未使用的空间。在问题的答案中也提到了这一点使用具有不同驱动器大小的 btrfs RAID0 会导致可用空间不足。
\n仔细阅读mkfs.btrfs后,我发现这是因为默认 RAID-0 配置文件将最小设备数量设置为 2,但没有上限。这意味着数据块将在池中可以找到的尽可能多的设备上进行条带化。这当然是一个合理的选择,而且完全有道理。
\n在使用 btrfs 磁盘使用计算器时,我发现可以通过将最大设备数量设置为 2 来获得我想要的结果。这仍然会将我的数据条带化到两个驱动器上以获得一些额外的速度,但将条带化限制为两个设备,因此它可以使用更多的可用空间。对我来说,这是一个非常有利的权衡,而且我想我并不是唯一一个这么想的人。
\n我没有找到在创建文件系统时更改最大设备数量的方法。
\n你无法直接做到这一点,但如果有一些运气和努力,这是可能的。
问题是,目前(从 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()
块布局在 btrfs-progs中设置volume.c
。该函数调用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
再次弄乱布局,我不会太惊讶。
归档时间: |
|
查看次数: |
870 次 |
最近记录: |