我有一個磁碟在 RAID1 btrfs 中出現故障,因此寫入不確定,但讀取大部分都有效。如何更換它?
我有一個雙磁碟 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
那應該幾乎是即時的。