我的磁碟在 RAID1 btrfs 中出現故障,因此寫入不穩定,但讀取大部分工作。如何更換?

我的磁碟在 RAID1 btrfs 中出現故障,因此寫入不穩定,但讀取大部分工作。如何更換?

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

答案1

這原來是皇家皮塔餅。首先,需要注意的是,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"

為了快速解釋這意味著什麼,設備映射器表的格式如下:起始扇區 扇區數 目標類型 目標參數。起始扇區為0;扇區數與 sdj1 的大小相同(畢竟我們想要完成整個事情);目標類型是快照。快照目標有幾個參數:來源開發 牛隻開發者 模式 區塊大小。我們提供的源設備為/dev/sdj1; COW 設備是我創建的邏輯磁碟區; PO 模式意味著p持久性(元資料寫入磁碟,因此可以在重新啟動後進行備份)並且verflow(如果我們向快照寫入大量數據,則可以進行恢復)。塊大小是快照的粒度;如果我們寫入一個位元組,該位元組周圍的整個區塊都將被複製(並消耗快照中的空間)。 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

那應該幾乎是即時的。

相關內容