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

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

使用两块更大的固态硬盘,重建 btrfs RAID1,恢复系统的冗余能力,数据为重,小心处理……

前言

上一篇文章中,在双盘 btrfs RAID1 发生单盘故障后,我通过将剩余的那块盘转换为单盘模式的方式,成功恢复了系统的可用性。虽然系统暂时恢复了,但此时它已经失去了冗余能力,如果再发生一次故障就会导致数据丢失了。因此必须尽快重新组建 RAID1,保证系统的冗余能力。

由于 250 GB 的固态在 2026 年已经很罕见了,因此我从库存中翻出了两块 1 TB 的固态硬盘,准备使用它们来替换掉之前的两块 250 GB 的盘,重新组建 RAID1。现将这个过程记录下来,不供模仿,仅资参考。

过程

准备工作

需要的内容:

  • 两块更大的 SSD;
  • 充足的时间和耐心;
  • 细心的操作;

更换硬盘

首先需要将两块新的 SSD 安装到服务器上,移除故障的那块盘。开机确认它们都能被正确识别,并确认新盘和旧盘的设备路径。在我的服务器上,两块新盘分别是 /dev/nvme0n1/dev/nvme1n1,而旧盘是 /dev/nvme2n1

重新组建 RAID1

首先在两块新盘上创建分区,和最初的两块盘一样,创建一个 EFI 分区和一个用于 btrfs 的分区。创建完成后,将两块新盘的 btrfs 分区加入到当前的 btrfs 文件系统中:

sudo btrfs device add /dev/nvme0n1p2 /dev/nvme1n1p2 /

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

Performing full device TRIM /dev/nvme0n1p2 (930.46GiB) ...
Performing full device TRIM /dev/nvme1n1p2 (952.82GiB) ...

然后使用 btrfs balance 命令将数据重新分布到两块新盘上,重新组建 RAID1:

sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /

当 balance 完成后,使用 sudo btrfs device usage / 命令查看当前的设备使用情况,确认 RAID1 已经重新组建好了:

/dev/nvme2n1p2, ID: 2
   Device size:           230.00GiB
   Device slack:              0.00B
   Unallocated:           230.00GiB

/dev/nvme0n1p2, ID: 3
   Device size:           930.46GiB
   Device slack:            3.50KiB
   Data,RAID1:            150.00GiB
   Metadata,RAID1:         16.00GiB
   System,RAID1:           32.00MiB
   Unallocated:           764.43GiB

/dev/nvme1n1p2, ID: 4
   Device size:           952.82GiB
   Device slack:              0.00B
   Data,RAID1:            150.00GiB
   Metadata,RAID1:         16.00GiB
   System,RAID1:           32.00MiB
   Unallocated:           786.79GiB

在我的服务器上,旧盘 /dev/nvme2n1p2 仍然在列表中,但它已经没有任何数据了,剩余空间也全部是未分配的了。这时就可以安全地移除掉旧盘了:

sudo btrfs device remove 2 /

更新引导配置

虽然 RAID1 已经重新组建好了,但此时两块新盘上还没有引导程序了,因此需要重新安装 GRUB 引导程序。首先在两块新盘上创建 EFI 分区,并将它们挂载到 /boot/efi/boot/efi2 目录下,然后安装 GRUB:

sudo mkdir -p /boot/efi
sudo mkdir -p /boot/efi2
sudo umount /boot/efi
sudo umount /boot/efi2
sudo mount /dev/nvme0n1p1 /boot/efi
sudo mount /dev/nvme1n1p1 /boot/efi2
grub-install --target=x86_64-efi --efi-directory=/boot/efi --recheck
grub-install --target=x86_64-efi --efi-directory=/boot/efi2 --recheck

然后更新 /etc/fstab 文件,由于替换硬盘并不影响 btrfs 分区的 UUID,因此不需要修改 btrfs 分区的配置;但是需要更新 EFI 分区的配置,改为新的 SSD 的 EFI 分区:

UUID=<uuid of the new SSD EFI partition A> /boot/efi vfat defaults 0 1
UUID=<uuid of the new SSD EFI partition B> /boot/efi2 vfat defaults 0 1

最后,更新 GRUB 配置:

update-initramfs -u
update-grub

这样,整个系统就已经成功迁移到新的 SSD 上了。

重启

关闭服务器,移除掉旧盘,重新开机,如果一切正常的话,应该能正常启动到系统中了。

结语

通过前文和本文的操作,我们成功解决了 btrfs RAID1 的单盘故障,并且将系统迁移到了一对更大的 SSD 上。整个过程其实并不复杂,但需要非常小心地操作,特别是做好数据备份和电源保障。这次的经历也证明了在服务器上使用 RAID1 的重要性,虽然它不等于完整的备份,但至少能在单盘故障时保证系统的可用性,给我们足够的时间来进行恢复和迁移,也能够为重要的数据增加一层保险。希望这篇文章能对遇到类似问题的朋友有所帮助。