Btrfs磁盤故障、沒法卸載與重置

按照《Linux上的新一代文件系統-Btrfs實踐 》將一臺機器的兩個磁盤轉爲btrfs格式後,將其加載到GlusterFS。其中raid1兩塊磁盤之一出現故障後沒法恢復,致使數據丟失。linux

一、問題描述

複製數TB的數據到該數據集,運行一段時間後,其中一個磁盤出現故障,Ubuntu系統自動將該磁盤以只讀模式掛載,致使沒法寫入,複製進程自動終止。網絡

  • 根據Btrfs的手冊,使用btfrs devvice remove操做將故障盤卸載,可是一直提示卸載失敗。
  • 最後不得不將btrfs的raid1兩塊磁盤所有重置,致使數據丟失。
  • 所以,目前btrfs的raid1模式並無起到鏡像模式下單盤失效恢復的做用,是不可用的

二、處理過程

搜索網絡,RAID1組成的兩塊磁盤,若是其中之一 /dev/sda 失效,但另一塊 /dev/sdc 是好的。ui

  • 在系統文件 /etc/fstab中關閉自動掛載,重啓。咱們但願btrfs忘掉該磁盤組,可是這裏有一個bug,即使已經拔出,但系統仍然試圖使用其中的驅動器。
  • 如今磁盤組已經 unmounted,執行下面的命令來去除失效的的磁盤設備:spa

    echo 1 | sudo tee /sys/block/sda/device/delete.net

    替換 sda 爲失敗的磁盤設備名稱,這將致使磁盤設備從系統中去除 (能夠經過命令 dmesg來檢查),而後內核沒法訪問該磁盤。code

    替代方式:拔出驅動器!blog

  • 加載磁盤組,使用 -o degraded 模式。可是,加載失敗!
    • 但個人系統在執行 mount -t btrfs /dev/sda /bpool 時失敗,提示沒法找到設備(已經移除了嘛),而後mount -t btrfs /dev/sdb /bpool提示,dev/sdb爲沒法認識的文件格式(這個確定是btrfs格式啊,以前與/dev/sda一塊兒使用makefs.btrfs來建立的bpool磁盤組)。
  • 若是加載成功,執行再平衡操做操做。執行sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint。 該命令將從新組織正常磁盤上的 extents ,並轉換爲 single (non-RAID)模式。
    • 這將消耗將近一天的時間,取決於磁盤的速度和大小。 (mine had ~700 GiB, and rebalanced at a rate of 11GiB chunk per minute) 。
    • 幸運的是,該操做能夠暫停,並且磁盤保持在線。
  • 完成之後,執行sudo btrfs device remove missing /bpool來從raid1磁盤組中移除失效設備。
  • 再次執行平衡操做: sudo btrfs balance start -mconvert=dup /mountpoint ,恢復元數據。將耗費數分鐘的時間。
  • 完成!如今磁盤組以 single 模式運行。
  • 移除失效的磁盤。

其中原始方法參考了:進程

三、更多問題的解決

  • Help, btrfs tried to write to my faulty disk, errored out, and forced it readonly!
    • Did you follow step 1, and reboot before continuing? It's likely that btrfs still thinks the drive you spun down is present. Rebooting will cause btrfs to forget any errors, and will let you continue.
相關文章
相關標籤/搜索