Btrfs磁盘故障、无法卸载与重置

原创
2019/02/15 13:47
阅读数 1.2K

按照《Linux上的新一代文件系统-Btrfs实践 》将一台机器的两个磁盘转为btrfs格式后,将其加载到GlusterFS。其中raid1两块磁盘之一出现故障后无法恢复,导致数据丢失。

1、问题描述

复制数TB的数据到该数据集,运行一段时间后,其中一个磁盘出现故障,Ubuntu系统自动将该磁盘以只读模式挂载,导致无法写入,复制进程自动终止。

  • 根据Btrfs的手册,使用btfrs devvice remove操作将故障盘卸载,但是一直提示卸载失败。
  • 最后不得不将btrfs的raid1两块磁盘全部重置,导致数据丢失。
  • 因此,目前btrfs的raid1模式并没有起到镜像模式下单盘失效恢复的作用,是不可用的

2、处理过程

搜索网络,RAID1组成的两块磁盘,如果其中之一 /dev/sda 失效,但另外一块 /dev/sdc 是好的。

  • 在系统文件 /etc/fstab中关闭自动挂载,重启。我们希望btrfs忘掉该磁盘组,但是这里有一个bug,即便已经拔出,但系统仍然试图使用其中的驱动器。
  • 现在磁盘组已经 unmounted,执行下面的命令来去除失效的的磁盘设备:

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

    替换 sda 为失败的磁盘设备名称,这将导致磁盘设备从系统中去除 (可以通过命令 dmesg来检查),然后内核无法访问该磁盘。

    替代方式:拔出驱动器!

  • 加载磁盘组,使用 -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 模式运行。
  • 移除失效的磁盘。

其中原始方法参考了:

3、更多问题的解决

  • 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.
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部