Btrfs

Btrfs:未使用添加到 RAID1 的新設備

  • January 12, 2022

問題

我在我的 RAID1 陣列中添加了一個新驅動器,雖然它被列為陣列的一部分,但它並沒有被寫入新數據(儘管它是最大的驅動器並且是空的)。此外,sudo btrfs fi usage確實將其顯示為數組的一部分,但未在Data,RAID1norMetadata,RAID1部分下列出(請參見下面的輸出)。

儘管我能找到的每個指南都顯示我正確地將新設備添加到現有 RAID1 陣列,但事實並非如此。

序幕

那些熟悉 RAID 但不需要 Btrfs 實現的人可能會認為您無法使用奇數磁碟執行 RAID1,這是可以理解的。但 Btrfs 實際上並不是傳統的“RAID1”,它是另一回事。可以說它更靈活,並且可以使用任意數量的任何大小的磁碟> 1,確保每個塊都寫入任何兩個不同的磁碟(通常從具有最多可用空間的磁碟開始),並且(據說)很好。它明確支持使用奇數個磁碟。是一個關於此的範例問題。

腳步

首先,我從一個功能正常、最近平衡的 4 磁碟 Btrfs RAID1 陣列開始。(使用 1x4tb、2x8tb 和 1x10tb 驅動器。)所有四個磁碟都是數據和元數據 RAID1 陣列的一部分(請參見下面的輸出)。

然後我通過以下方式添加了一個新的 10tb 磁碟:

sudo btrfs device add -f /dev/sdj /mnt/btrfs/ba07
sudo btrfs balance start /mnt/btrfs/ba07  ### As later noted, I also ran this with RAID1 conversion filters.

之後,這裡的輸出sudo btrfs fi usage /mnt/btrfs/ba07似乎表明它實際上不是數組的一部分:

Overall:
   Device size:                  36.38TiB
   Device allocated:             17.19TiB
   Device unallocated:           19.19TiB
   Device missing:                  0.00B
   Used:                         16.73TiB
   Free (estimated):              9.82TiB      (min: 9.82TiB)
   Data ratio:                       2.00
   Metadata ratio:                   2.00
   Global reserve:              512.00MiB      (used: 96.53MiB)

Data,RAID1: Size:8.58TiB, Used:8.35TiB
  /dev/sdf        5.68TiB
  /dev/sdg        5.53TiB
  /dev/sdh        3.57TiB
  /dev/sdi        2.38TiB

Metadata,RAID1: Size:18.00GiB, Used:14.21GiB
  /dev/sdf        8.00GiB
  /dev/sdg       17.00GiB
  /dev/sdh        4.00GiB
  /dev/sdi        7.00GiB

System,RAID1: Size:32.00MiB, Used:1.47MiB
  /dev/sdh       32.00MiB
  /dev/sdj       32.00MiB

Unallocated:
  /dev/sdf        1.59TiB
  /dev/sdg        1.73TiB
  /dev/sdh        5.52TiB
  /dev/sdi        1.26TiB
  /dev/sdj        9.09TiB

注意條目Data,RAID1並且Metadata,RAID1不包括新磁碟,/dev/sdj.

故障排除步驟

在黑暗中拍攝,我試過:

sudo btrfs filesystem resize max /mnt/btrfs/ba07

sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07

結果是一樣的,磁碟沒有在Data,RAID1or下列出Metadata,RAID1

最近,我嘗試了下面 EarthMind 評論中的提示,並結合了以下建議:

btrfs device delete /dev/sdj /mnt/btrfs/ba07              #Succeeded
btrfs device add    /dev/sdj /mnt/btrfs/ba07              #Succeeded
btrfs balance start -mconvert=raid1,soft /mnt/btrfs/ba07  #Tip said to do these balances separately, metadata first
btrfs balance start -dconvert=raid1,soft /mnt/btrfs/ba07

所有步驟立即完成,並且在後台沒有任何操作;大概這是因為我已經多次執行平衡變體,並且在刪除之前沒有數據可以在 sdj 上移動。

sudo btrfs fi usage顯示了同樣的事情:/dev/sdj 不是數據或元數據 RAID1 的一部分。

由於精神錯亂的定義通常被定義為一遍又一遍地做同樣的事情期望不同的結果,我目前正在這樣做:

sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07

無論出於何種原因,似乎實際上是在做某事。(但不是單獨完成,即使我之前多次嘗試過完全相同的命令。)具體來說,/dev/sdj 似乎正在進行寫入,這是這裡的全部目標。現在宣布勝利還為時過早,因為這可能需要數小時到數天才能完成。具體來說,這部分輸出btrfs fi usage /mnt/btrfs/ba07似乎很有希望:

Data,RAID1: Size:8.40TiB, Used:8.36TiB
  /dev/sdf        5.56TiB
  /dev/sdg        5.45TiB
  /dev/sdh        3.47TiB
  /dev/sdi        2.31TiB
  /dev/sdj       19.00GiB

最後一行 /dev/sdj 正在增長。

附加資訊

系統資訊:

$ btrfs --version
btrfs-progs v4.15.1

$ uname -r
4.15.0-54-generic

$ lsb_release -d
Description:    Ubuntu 18.04.2 LTS

網上類似的問題

概括

顯然,我一定是做錯了什麼,但數小時的Google搜尋和實驗到目前為止沒有產生任何結果,除了“它做得正確並且’應該’工作”。

在從陣列中刪除並重新添加磁碟之後,它暫時似乎正在使用sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07,即使這是使用相同命令的第三次或第四次嘗試。我會在幾個小時或幾天內將其添加為答案,只要它完成:

#Repeat the third command below a few times if the whole thing doesn't work the first time.
#Note, don't specify "soft" parameter.
#If it's still not working, try the whole 3-line series of commands below multiple times.
#Because, software.

btrfs device delete /dev/sdj /mnt/btrfs/ba07
btrfs device add    /dev/sdj /mnt/btrfs/ba07
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07

我想出瞭如何在這種特殊情況下解決它(但不知道為什麼會發生)。我也不能確定它是否會“修復”上述問題末尾提到的類似問題。

無論哪種方式,這顯然似乎是 Btrfs 不希望的、無意的或充其量是未記錄的行為。(例如,您必須執行這些步驟才能讓 Btrfs 開始使用新添加的設備可能只是“未記錄”。至於為什麼它並不總是有效……是另一個問題。)

在這個(真實的)例子中:

  • /dev/sdj是要添加的設備,btrfs 不用於向其分發數據。
  • /mnt/btrfs/ba07是陣列的安裝位置。
btrfs device delete /dev/sdj /mnt/btrfs/ba07
btrfs device add    /dev/sdj /mnt/btrfs/ba07
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07

通常的免責聲明,請確保您的數據已備份。該device delete命令應該這樣做而不會失去數據(並且確實如此),並且只要其他磁碟上有足夠的空間來接收已刪除設備的數據(如果它甚至沒有被使用,顯然就是這種情況),但更好安全勝於遺憾。

如果它不起作用,並且假設您的陣列的其餘部分確實有數據並且新添加的磁碟是空的,那麼您會在btrfs balance start… 之後注意到:

  • 命令 ( btrfs balance start…) 可能會立即返回,
  • btrfs balance status /mountpoint沒有活動,並且
  • Data,RAID1輸出部分,btrfs fi usage沒有列出新設備。

如果它不起作用,請再次嘗試最後一個命令(btrfs balance start…)。

如果這仍然不起作用,請再次嘗試所有三個命令。

我不知道是否總是需要多次這樣做,或者在這種情況下為什麼需要這樣做。(在我的情況下,無論執行多少次,最後一個命令本身都不起作用。但是在刪除並重新添加設備之後,然後執行兩次平衡命令(有一些經過的時間和隨機不相關的命令之間),它第二次開始工作。

另請注意,在這種特殊情況下,即使經過多次嘗試,這些不起作用:

  • 在數據平衡之前單獨執行元數據平衡(如上述問題中記錄的類似問題中所建議的那樣)。
  • ,soft參數添加到-mconvert=raid1-dconvert=raid1參數。

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