Btrfs

如何替換 BTRFS RAID-1 文件系統中的設備?

  • September 20, 2021

我有一個有 2 條腿的 BTRFS RAID-1 文件系統。由於再次發生讀取錯誤,需要更換一個磁碟。

因此,計劃是:

  1. 添加第三條腿->結果應該是:3路鏡子
  2. 刪除有故障的磁碟-> 結果應該是:2 路鏡像

因此,我做了以下步驟:

btrfs dev add /dev/new_device /mnt/foo
btrfs balance /mnt/foo

我認為 btrfs 做了正確的事,即創建一個 3 路鏡像。

我猜另一種選擇是使用平衡過濾器。但是由於文件系統已經是 RAID-1 的,那應該沒有必要嗎?

我有點擔心,因為 abtrfs fi show列印了這個:

餘額開始前:

   Total devices 3 FS bytes used 2.15TiB
   devid    1 size 2.73TiB used 2.16TiB path /dev/left
   devid    2 size 2.73TiB used 2.16TiB path /dev/right
   devid    3 size 2.73TiB used 0.00B path /dev/new_device

平衡期間:

   Total devices 3 FS bytes used 2.15TiB
   devid    1 size 2.73TiB used 1.93TiB path /dev/left
   devid    2 size 2.73TiB used 1.93TiB path /dev/right
   devid    3 size 2.73TiB used 458.03GiB path /dev/new_device

我的意思是,這看起來像 btrfs 將現有 RAID-1 組的一半平衡到單個磁碟……對嗎?

因此,我的問題是,我是否需要指定平衡過濾器才能獲得三向鏡?

PS: btrfs 甚至支持 n 路鏡像嗎?btrfs wiki 中的一條註釋說它沒有 - 但也許它已經過時了?哦,男孩,cks 最近有一篇關於 2-way limit 的文章

目前,btrfs支持n-way mirrors

Btrfs 確實有一個特殊的 replace 子命令:

btrfs replace start /dev/left /dev/new_device /mnt/foo

在手冊頁的兩行之間閱讀btrfs-replace,該命令應該能夠使用現有的兩條腿——例如,對於兩條腿都有讀取錯誤的情況——但兩個錯誤集是不相交的。

btrfs replace 命令在後台執行 - 您可以通過status子命令檢查其狀態,例如:

btrfs replace status /mnt/foo
45.4% done, 0 write errs, 0 uncorr. read errs

或者,也可以將設備添加到 raid-1 文件系統,然後刪除現有分支:

btrfs dev add /dev/mapper/new_device /mnt/foo
btrfs dev delete /dev/mapper/right  /mnt/foo

應該快速返回,add因為它只是添加設備(發出btrfs fi show確認)。

以下delete應觸發剩餘設備之間的平衡,以便每個擴展在每個剩餘設備上可用。因此,該命令可能執行很長時間。此方法也適用於處理問題中描述的情況。

btrfs replace添加/刪除週期相比,系統日誌帶有低級資訊消息的垃圾郵件。此外,完成所需的時間要長得多(例如,在我的測試系統中,使用 3 TB SATA 驅動器,80 % FS 使用情況下要長 2-3 倍)。

最後,在實際更換之後,如果較新的設備比原來的設備大,您將需要btrfs fi resize在每個設備上發出一個以利用整個可用磁碟空間。對於replace頂部的範例,這看起來像:

btrfs fi resize <devid>:max /mnt/foo

wheredevid代表btrfs fi show返回的設備ID。

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