如何替換 BTRFS RAID-1 文件系統中的設備?
我有一個有 2 條腿的 BTRFS RAID-1 文件系統。由於再次發生讀取錯誤,需要更換一個磁碟。
因此,計劃是:
- 添加第三條腿->結果應該是:3路鏡子
- 刪除有故障的磁碟-> 結果應該是:2 路鏡像
因此,我做了以下步驟:
btrfs dev add /dev/new_device /mnt/foo btrfs balance /mnt/foo
我認為 btrfs 做了正確的事,即創建一個 3 路鏡像。
我猜另一種選擇是使用平衡過濾器。但是由於文件系統已經是 RAID-1 的,那應該沒有必要嗎?
我有點擔心,因為 a
btrfs 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
where
devid
代表btrfs fi show
返回的設備ID。