Featured image of post Btrfs RAID1 单盘故障后的恢复(一)

Btrfs RAID1 单盘故障后的恢复(一)

当 btrfs RAID1 中的一块盘发生故障后,将 RAID1 修改为单盘模式,以尽快恢复系统运行,高危操作,谨慎行事……

前言

上一篇文章中,我介绍了如何将 Ubuntu 系统从 ext4 分区就地迁移到 btrfs RAID1 上。虽然这个过程相当冒险,但幸运的是一切顺利,系统成功迁移到了 RAID1 分区上,并且运行正常。然而不幸的是,在平稳运行了近 10 个月之后,其中一块盘突然出现了故障,直接掉盘了。虽然系统本身仍然在运行,数据也未丢失,但部分服务(由于未知原因,可能是硬盘故障导致文件系统短暂不可用)受到了影响;并且在系统重启后,GRUB 也出现错误提示,无法正常引导系统了。

由于确实急需使用这台服务器,因此我决定首先以最快的速度将系统恢复到可用状态,即将 btrfs RAID1 修改为单盘模式,使用剩余的那块盘继续运行系统;然后再替换掉故障的那块盘,重新组建 RAID1。现将这个过程记录下来,不供模仿,仅资参考。

过程

准备工作

需要的内容:

  • Live 环境(推荐使用 Ubuntu 桌面版的安装盘);
  • 一台可以在过程中查找资料的设备;
  • 充足的时间和耐心;
  • 一点运气;

修改 btrfs RAID1 为单盘模式

首先启动到 Live 环境,打开终端,挂载还能访问的那块盘(在我这里是 /dev/nvme0n1p2);注意由于失去了一块盘,因此需要使用 -o degraded 选项来挂载:

sudo mkdir -p /mnt/btrfs
sudo mount -t btrfs -o degraded /dev/nvme0n1p2 /mnt/btrfs

挂载成功后,首先进入 /mnt/btrfs 目录,确认文件都在。此处一定要备份重要的数据,由于我在服务器上唯一有价值的数据就是一些 Git 仓库了,因此我只做了 git push,将它们推送到了远程仓库上,就算是备份了。

然后使用 btrfs device usage 命令查看当前的设备使用情况,确认已经掉盘了:

sudo btrfs device usage /mnt/btrfs

可以看见类似下面的输出:

missing device, ID: 1

/dev/nvme0n1p2, ID: 2
    Device size:        230.00GiB
    Device slack:           0.00B
    Data, RAID1:        148.00GiB
    Metadata, RAID1:     16.00GiB
    System, RAID1:       32.00MiB
    Unallocated:         65.97GiB

可以看见掉盘的是 btrfs RAID1 中的设备 ID 1,而设备 ID 2 仍然在正常使用中。接下来,我们需要将 btrfs RAID1 修改为单盘模式,使用剩余的那块盘继续运行系统。执行以下命令:

sudo btrfs balance start -dconvert=single -mconvert=single -f /mnt/btrfs

经过漫长的等待之后,执行以下命令查看 RAID1 的状态:

sudo btrfs device usage /mnt/btrfs

如果一切正常,应该能看到类似以下的输出:

missing device, ID: 1

/dev/nvme0n1p2, ID: 2
    Device size:        230.00GiB
    Device slack:           0.00B
    Data, single:       148.00GiB
    Metadata, single:    16.00GiB
    System, single:      32.00MiB
    Unallocated:         65.97GiB

注意到上面输出中 RAID1 已经全部变为 single。至此,我们已经成功将 btrfs RAID1 修改为单盘模式了。接下来移除掉盘的设备:

btrfs device delete missing /mnt/btrfs

执行完毕后再次查看设备使用情况,确认掉盘的设备已经被移除:

/dev/nvme0n1p2, ID: 2
    Device size:        230.00GiB
    Device slack:           0.00B
    Data, single:       148.00GiB
    Metadata, single:    16.00GiB
    System, single:      32.00MiB
    Unallocated:         65.97GiB

修复 GRUB 引导

GRUB 出现错误提示的原因,并不是它无法挂载降级后的 btrfs 文件系统,而是之前的 GRUB 配置文件中同时引用了两块盘,这导致 GRUB 无法找到已经掉盘的那块盘,从而报错。因此我们需要重新生成 GRUB 配置文件。

首先还是重新挂载 btrfs 分区,并且 chroot 回到原有的系统中(这里使用 UUID 挂载):

cd /mnt
sudo umount /mnt/btrfs
sudo mkdir -p /mnt/old
sudo mount -t btrfs -o noatime,compress=zstd:1,subvol=@ /dev/disk/by-uuid/ab2bbc1e-c476-4283-aea0-40ace705cbf9 /mnt/old
sudo mkdir -p /mnt/old/home
sudo mount -t btrfs -o noatime,compress=zstd:1,subvol=@home /dev/disk/by-uuid/ab2bbc1e-c476-4283-aea0-40ace705cbf9 /mnt/old/home
cd /mnt/old
sudo mount -o bind /dev dev
sudo mount -o bind /sys sys
sudo mount -o bind /proc proc
sudo chroot .

然后更新 GRUB 配置:

update-grub

检查 GRUB 配置文件,确认已经不包含掉盘的设备路径了:

grep "nvme1" /boot/grub/grub.cfg

重启系统

完成上述步骤后,重启系统,应该能够看到熟悉的 GRUB 菜单了,选择正常启动系统,应该能够成功进入系统了。

结语

至此,我们已经成功将 btrfs RAID1 修改为单盘模式,并且修复了 GRUB 引导,系统已经恢复到可用状态了。接下来我们还需要替换掉故障的那块盘,重新组建 RAID1,不过这部分内容就留在下一篇文章中再介绍了。

参考资料