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.
相关文章
相关标签/搜索