Btrfs:未使用添加到 RAID1 的新設備
問題
我在我的 RAID1 陣列中添加了一個新驅動器,雖然它被列為陣列的一部分,但它並沒有被寫入新數據(儘管它是最大的驅動器並且是空的)。此外,
sudo btrfs fi usage
確實將其顯示為數組的一部分,但未在Data,RAID1
norMetadata,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,RAID1
or下列出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
網上類似的問題
- btrfs raid1 沒有使用所有磁碟?
- 表現如預期。由於現有驅動器有更多可用空間,因此它們在新磁碟之前被寫入。我的情況正好相反,新驅動器有更多的可用空間。
- Btrfs 將較小的驅動器添加到 RAID1
- 當磁碟當機時,使用者不得不採取完全不同的方法。
- 為什麼 btrfs 拒絕將元數據轉換為 RAID1
- 是由於特定 Btrfs 版本 (4.0) 中的回歸。但我在 4.4 和 4.15 上都嘗試了這些步驟。
- BTRFS 餘額已完成,但仍顯示以“單一”模式儲存的數據
- 建議添加“soft”參數轉換過濾器,並在
-mconvert=raid1,soft
之前單獨執行-dconvert=raid1,soft
。這個解決方案沒有解決我的問題。概括
顯然,我一定是做錯了什麼,但數小時的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
參數。