Linux

我有一個磁碟在 RAID1 btrfs 中出現故障,因此寫入不確定,但讀取大部分都有效。如何更換它?

  • September 24, 2016

我有一個雙磁碟 btrfs 文件系統,數據和元數據都在 RAID1 中(通過 btrfs 功能,而不是 mdraid)。這些磁碟是 USB3 驅動器,頂部有 dm-crypt。其中一個磁碟出現故障(它有數千個壞扇區,並且寫入經常超時)。我已經獲得了第三個 USB 驅動器來替換出現故障的驅動器,我該如何更換它?

事實證明這是皇家皮塔餅。首先,重要的是要注意 btrfs 現在有一個正確的替換命令,這比添加新的,刪除失敗要好得多。

首先,首先對新磁碟進行分區並在其上設置 dm-crypt。繼續解鎖它。

如果您的磁碟沒有寫入超時(顯然每個需要 360 秒!),您可以做一個簡單的操作:

btrfs replace start -r /dev/mapper/luks-BAD-disk-uuid              \
                      /dev/mapper/luks-NEW-disk-uuid /mount/path

但是,這將導致對壞磁碟進行一些例行寫入,如果這些導致超時——您將看到大約 30 秒的快速複製,然後是 6-12 分鐘的空閒時間,等待超時。

為了避免對其進行寫入,可以使用設備映射器設置快照。讀取將轉到底層的壞設備(讀取大部分都可以);寫入將轉到寫時複製 (COW) 儲存。首先,您需要一個適當大的塊設備來儲存 COW。我為它創建了一個新的邏輯卷 ( Watt-sdj1_dmsnap)。任何塊設備都應該可以工作——即使是循環設備也應該沒問題。我個人建議使用持久性,以防萬一出現問題,但如果您生活危險並且有足夠的 RAM,則 RAM 磁碟可以工作。

我的將需要約 1.7GB 的 COW 空間(從 3TB 驅動器中移出 2.24 TiB)。我建議對 COW 空間大方一些;用完可能是一件壞事,一旦完成,您就可以將其全部釋放。

接下來,您需要解除安裝 btrfs 文件系統(如果已安裝),並鎖定(停止)dm-crypt 設備。我將快照置於加密之下,因為我不希望將未加密的數據寫入磁碟。

就我而言,分區是/dev/sdj1. 首先,為避免任何錯誤,請將其設置為只讀:

blockdev --setro /dev/sdj1
blockdev --setro /dev/sdj

(您可以稍後使用 將其重新設置--setrw)。現在,實際設置快照:

dmsetup create sdj_divert --table "0 $(blockdev --getsz /dev/sdj1) snapshot /dev/sdj1 /dev/mapper/Watt-sdj1_dmsnap PO 8"

為了快速解釋這意味著什麼,設備映射表的格式為:start-sector number-of-sectors target-type target-arguments。起始扇區為0;扇區的數量與 sdj1 的大小相同(畢竟我們想做整個事情);目標類型是快照。快照目標有幾個參數:source-dev cow-dev mode chunk-size。我們提供了一個源設備/dev/sdj1;COW 設備是我創建的邏輯卷;模式 PO 表示持久(元數據寫入磁碟,因此可以在重新啟動後設置備份)和overflow(如果我們對快照寫入很多,恢復是可能的)。塊大小是快照的粒度;如果我們寫入一個字節,該字節周圍的整個塊將被複製(並佔用快照中的空間)。8 是 4K,所以不會有對齊問題。

現在,最後,再次解鎖設備——但不是解鎖/dev/sdj1,而是解鎖/dev/mapper/sdj_divert。然後繼續並再次掛載 btrfs 文件系統。

dmsetup status sdj_divert您可以使用;檢查快照使用情況 這應該給出類似的東西(但斜線之前的數字要低得多):

0 5860524928 snapshot 914216/545259520 3568

前三項是起始扇區、扇區數和目標類型。下一個數字是使用的扇區數(斜線之前),然後是總扇區數(斜線之後)。所以這只是所用空間的一小部分。最後一個數字是用於元數據的扇區數,它已經包含在使用的數字中。

btrfs replace start現在,最後,您可以在答案頂部使用那個簡單的命令。那將立即返回;通過執行查看狀態btrfs replace status /mount/path

替換完成後,確認壞設備已從文件系統中刪除(例如,btrfs fi show /mount/path),然後您可以鎖定/關閉故障驅動器,然後刪除快照(dmsetup remove sdj_divert)。然後您可以釋放 COW 空間(在擦除它之後,如果您偏執的話)。

最後一步,在技術上是可選的:我的替換設備更大,但 btrfs 還沒有使用額外的空間。為了使它對 btrfs 可用,在btrfs fi show輸出中查找 devid,然後執行

btrfs fi resize DEVID:max /mount/path

那應該幾乎是即時的。

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