Raid

如何限制 btrfs RAID-0 配置文件中的數據條帶數量,以便更好地利用總可用空間?

  • February 12, 2022

問題背景

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 條帶化,如果它像我想要的那樣工作

……這就是實際發生的事情:

RAID-0 的 btrfs 預設條帶化

說明書是怎麼說的?

在仔細閱讀 mkfs.btrfs之後,我認為這是因為預設 RAID-0 配置文件將最小設備數設置為 2,但沒有上限。這意味著數據塊將在池中可以找到的盡可能多的設備上進行條帶化。這當然可以是一個合理的選擇,而且完全有道理。

在使用 btrfs 磁碟使用計算器時,我發現我可以通過將設備的最大數量設置為 2 來獲得我想要的結果。這仍然會將我的數據條帶化到兩個驅動器上以獲得額外的速度,但是將條帶化限制為兩個設備所以它可以使用更多的可用空間。對我來說,這是一個非常有益的權衡,我想我不是唯一一個這樣想的人。

問題

創建文件系統時,我沒有找到更改最大設備數的方法。

  • 這甚至可能嗎?
  • 如果是這樣,我該如何改變它?
  • 如果我改變它,其他工具會理解佈局嗎?

您不能開箱即用,但有一些運氣和努力可能會實現。

問題是,目前(從 btrfs-progs 5.7 開始),沒有辦法在mkfs.btrfs. 線上空間計算器還在 Preset 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再次弄亂了佈局,我不會太驚訝。

引用自:https://unix.stackexchange.com/questions/614493