使用软件 RAID 镜像您的系统驱动器

没有什么可以天长地久。 当涉及到 PC 中的硬件时,大部分都可以轻松更换。 但是,您的 PC 中有一个特殊的硬件组件不像其他硬件组件那样容易更换——您的硬盘驱动器。

驱动器镜像

您的硬盘驱动器存储您的个人数据。 您的某些数据可以通过计划的备份作业自动备份。 但是这些作业会扫描要备份的文件以进行更改,并且尝试扫描整个驱动器将非常耗费资源。 此外,如果您的驱动器出现故障,您自上次备份以来所做的任何更改都将丢失。 驱动器镜像 是维护整个硬盘驱动器的辅助副本的更好方法。 通过驱动器镜像,可以实时维护硬盘驱动器上所有数据的辅助副本。

将硬盘实时镜像到辅助硬盘的另一个好处是它可以 提高计算机的性能. 因为磁盘 I/O 是计算机的主要性能之一 瓶颈,性能提升可能相当显着。

请注意,镜像不是备份。 如果您的物理驱动器之一发生故障,它只会保护您的数据不丢失。 驱动镜像本身不能防止的故障类型包括:

上述某些问题可以通过可与驱动器镜像结合使用的其他文件系统功能来解决。 解决上述类型故障的文件系统功能包括:

本指南将演示一种使用多磁盘和设备管理 (mdadm) 工具集镜像系统驱动器的方法。 只是为了好玩,本指南将展示如何在不使用任何额外启动媒体(CD、USB 驱动器等)的情况下进行转换。 有关与多设备驱动程序相关的概念和术语的更多信息,您可以浏览 md 手册页:

$ man md

步骤

  1. 采用 sgdisk 对您添加到计算机的额外驱动器进行(重新)分区
    $ sudo -i
    # MY_DISK_1=/dev/sdb
    # sgdisk --zap-all $MY_DISK_1
    # test -d /sys/firmware/efi/efivars || sgdisk -n 0:0:+1MiB -t 0:ef02 -c 0:grub_1 $MY_DISK_1
    # sgdisk -n 0:0:+1GiB -t 0:ea00 -c 0:boot_1 $MY_DISK_1
    # sgdisk -n 0:0:+4GiB -t 0:fd00 -c 0:swap_1 $MY_DISK_1
    # sgdisk -n 0:0:0 -t 0:fd00 -c 0:root_1 $MY_DISK_1

    – 如果您将在第 12 步中用于镜像后半部分的驱动器小于此驱动器,则您将需要调整最后一个分区的大小,以使所有分区的总大小不大于比你的第二个驱动器的大小。
    – 本指南中的一些命令以测试是否存在 efivars 目录为前缀。 这是必要的,因为根据您的计算机是基于 BIOS 还是基于 UEFI,这些命令会略有不同。

  2. 采用 mdadm 创建使用新分区存储数据的 RAID 设备
    # mdadm --create /dev/md/boot --homehost=any --metadata=1.0 --level=1 --raid-devices=2 /dev/disk/by-partlabel/boot_1 missing
    # mdadm --create /dev/md/swap --homehost=any --metadata=1.0 --level=1 --raid-devices=2 /dev/disk/by-partlabel/swap_1 missing
    # mdadm --create /dev/md/root --homehost=any --metadata=1.0 --level=1 --raid-devices=2 /dev/disk/by-partlabel/root_1 missing
    # cat << END > /etc/mdadm.conf
    MAILADDR root
    AUTO +all
    DEVICE partitions
    END
    # mdadm --detail --scan >> /etc/mdadm.conf

    – missing 参数告诉 mdadm 创建一个缺少成员的数组。 您将在第 14 步中添加镜像的另一半。
    – 你应该配置 发送邮件 因此,如果驱动器发生故障,您将收到通知。
    – 您可以配置 进化监视本地邮件假脱机.

  3. 采用 德拉克特 更新 initramfs
    # dracut -f --add mdraid --add-drivers xfs

    – Dracut 会将您在上一节中创建的 /etc/mdadm.conf 文件包含在您的 initramfs 中,除非您在构建 initramfs 时将 hostonly 选项设置为 no。 如果您在将 hostonly 选项设置为 no 的情况下构建 initramfs,那么您应该手动包含 /etc/mdadm.conf 文件,手动指定 RAID 阵列的 UUID 以在引导时使用 rd.md.uuid 内核参数进行组装,或指定 rd.auto 内核参数以在引导时自动组装和启动所有 RAID 阵列。 本指南将演示 rd.auto 选项,因为它是最通用的。

  4. 格式化 RAID 设备
    # mkfs -t vfat /dev/md/boot
    # mkswap /dev/md/swap
    # mkfs -t xfs /dev/md/root

    – 新的 引导加载程序规范 声明“如果操作系统安装在带有 GPT 磁盘标签的磁盘上,并且尚不存在 ESP 分区,则应创建一个新的大小合适(假设为 500MB)的 ESP 并将其用作 $BOOT”和“$BOOT 必须是VFAT(16 或 32)文件系统”。

  5. 重新启动并设置 rd.auto、rd.break 和单内核参数
    # reboot

    – 您可能需要 设置你的root密码 在重新启动之前,您可以在步骤 7 中进入单用户模式。
    – 看 ”对 GRUB 2 菜单进行临时更改” 了解如何在使用 GRUB 2 引导加载程序的计算机上设置内核参数。

  6. 采用 龙壳 复制根文件系统
    # mkdir /newroot
    # mount /dev/md/root /newroot
    # shopt -s dotglob
    # cp -ax /sysroot/* /newroot
    # rm -rf /newroot/boot/*
    # umount /newroot
    # exit

    – 为此设置了 dotglob 标志 bash 会话,以便 通配符 将匹配隐藏文件。
    – 文件从引导目录中删除,因为它们将在下一步复制到单独的分区。
    – 此复制操作是从 dracut shell 完成的,以确保在复制文件时没有进程正在访问文件。

  7. 使用单用户模式复制非根文件系统
    # mkdir /newroot
    # mount /dev/md/root /newroot
    # mount /dev/md/boot /newroot/boot
    # shopt -s dotglob
    # cp -Lr /boot/* /newroot/boot
    # test -d /newroot/boot/efi/EFI && mv /newroot/boot/efi/EFI/* /newroot/boot/efi && rmdir /newroot/boot/efi/EFI
    # test -d /sys/firmware/efi/efivars && ln -sfr /newroot/boot/efi/fedora/grub.cfg /newroot/etc/grub2-efi.cfg
    # cp -ax /home/* /newroot/home
    # exit

    – 可以在上一节所示的 dracut shell 中运行这些命令,而不是在单用户模式下执行。 我已经演示了如何使用单用户模式来避免解释如何从 dracut shell 挂载非 root 分区。
    – 用于引导目录的 cp 命令的参数略有不同,因为 VFAT 文件系统不支持符号链接或 Unix 样式的文件权限。
    – 在极少数情况下,已知 rd.auto 参数会导致 LVM 无法组装,因为 比赛条件. 如果您在进入单用户模式时看到有关交换或主分区无法挂载的错误,只需重复步骤 5 重试,但省略 rd.break 参数,这样您将直接进入单用户模式。

  8. 在新驱动器上更新 fstab
    # cat << END > /newroot/etc/fstab
    /dev/md/root / xfs defaults 0 0
    /dev/md/boot /boot vfat defaults 0 0
    /dev/md/swap swap swap defaults 0 0
    END

  9. 在新驱动器上配置引导加载程序
    # NEW_GRUB_CMDLINE_LINUX=$(cat /etc/default/grub | sed -n 's/^GRUB_CMDLINE_LINUX="(.*)"/1/ p')
    # NEW_GRUB_CMDLINE_LINUX=${NEW_GRUB_CMDLINE_LINUX//rd.lvm.*([^ ])}
    # NEW_GRUB_CMDLINE_LINUX=${NEW_GRUB_CMDLINE_LINUX//resume=*([^ ])}
    # NEW_GRUB_CMDLINE_LINUX+=" selinux=0 rd.auto"
    # sed -i "/^GRUB_CMDLINE_LINUX=/s/=.*/="$NEW_GRUB_CMDLINE_LINUX"/" /newroot/etc/default/grub

    – 此过程完成后,您可以重新启用 selinux。 但你将不得不 重新标记您的文件系统 第一的。

  10. 在新驱动器上安装引导加载程序
    # sed -i '/^GRUB_DISABLE_OS_PROBER=.*/d' /newroot/etc/default/grub
    # echo "GRUB_DISABLE_OS_PROBER=true" >> /newroot/etc/default/grub
    # MY_DISK_1=$(mdadm --detail /dev/md/boot | grep active | grep -m 1 -o "/dev/sd.")
    # for i in dev dev/pts proc sys run; do mount -o bind /$i /newroot/$i; done
    # chroot /newroot env MY_DISK_1=$MY_DISK_1 bash --login
    # test -d /sys/firmware/efi/efivars || MY_GRUB_DIR=/boot/grub2
    # test -d /sys/firmware/efi/efivars && MY_GRUB_DIR=$(find /boot/efi -type d -name 'fedora' -print -quit)
    # test -e /usr/sbin/grub2-switch-to-blscfg && grub2-switch-to-blscfg --grub-directory=$MY_GRUB_DIR
    # grub2-mkconfig -o $MY_GRUB_DIR/grub.cfg ;
    # test -d /sys/firmware/efi/efivars && test /boot/grub2/grubenv -nt $MY_GRUB_DIR/grubenv && cp /boot/grub2/grubenv $MY_GRUB_DIR/grubenv
    # test -d /sys/firmware/efi/efivars || grub2-install "$MY_DISK_1"
    # logout
    # for i in run sys proc dev/pts dev; do umount /newroot/$i; done
    # test -d /sys/firmware/efi/efivars && efibootmgr -c -d "$MY_DISK_1" -p 1 -l "$(find /newroot/boot -name shimx64.efi -printf '/%Pn' -quit | sed 's!/!!g')" -L "Fedora RAID Disk 1"

    – grub2-switch-to-blscfg 命令是可选的。 它仅支持 Fedora 29+。
    – 上面的 cp 命令应该不是必需的,但在当前版本的 grub 中似乎存在一个错误,导致它写入 $BOOT/grub2/grubenv 而不是 UEFI 系统上的 $BOOT/efi/fedora/grubenv。
    – 您可以在运行上述 grub2-mkconfig 命令后立即使用以下命令验证 grub.cfg 文件的内容:

    # sed -n '/BEGIN .*10_linux/,/END .*10_linux/ p' $MY_GRUB_DIR/grub.cfg

    – 如果正确检测到 RAID 阵列,您应该会在上述命令的输出中看到对 mdraid 和 mduuid 的引用。

  11. 从新驱动器启动
    # reboot

    – 如何选择新驱动器取决于系统。 它通常需要按下其中一个 F12, F10, Esc键 或者 德尔 当您听到 系统正常 BIOS 哔声代码.
    – 在 UEFI 系统上,新驱动器上的引导加载程序应标记为“Fedora RAID 磁盘 1”。

  12. 从旧驱动器中删除所有卷组和分区
    # MY_DISK_2=/dev/sda
    # MY_VOLUMES=$(pvs | grep $MY_DISK_2 | awk '{print $2}' | tr "n" " ")
    # test -n "$MY_VOLUMES" && vgremove $MY_VOLUMES
    # sgdisk --zap-all $MY_DISK_2

    警告:在执行此操作之前,您要确保新驱动器上的一切正常。 验证您的旧驱动器不再被使用的一个好方法是尝试在没有连接旧驱动器的情况下启动您的计算机。
    – 如果您愿意,您可以将另一个新驱动器添加到您的计算机,而不是擦除旧驱动器。

  13. 在旧驱动器上创建新分区以匹配新驱动器上的分区
    # test -d /sys/firmware/efi/efivars || sgdisk -n 0:0:+1MiB -t 0:ef02 -c 0:grub_2 $MY_DISK_2
    # sgdisk -n 0:0:+1GiB -t 0:ea00 -c 0:boot_2 $MY_DISK_2
    # sgdisk -n 0:0:+4GiB -t 0:fd00 -c 0:swap_2 $MY_DISK_2
    # sgdisk -n 0:0:0 -t 0:fd00 -c 0:root_2 $MY_DISK_2

    – 分区的大小和类型匹配很重要。 我更喜欢使用 parted 命令来显示分区表,因为它支持设置显示单位:

    # parted /dev/sda unit MiB print
    # parted /dev/sdb unit MiB print

  14. 使用 mdadm 将新分区添加到 RAID 设备
    # mdadm --manage /dev/md/boot --add /dev/disk/by-partlabel/boot_2
    # mdadm --manage /dev/md/swap --add /dev/disk/by-partlabel/swap_2
    # mdadm --manage /dev/md/root --add /dev/disk/by-partlabel/root_2

  15. 在旧驱动器上安装引导加载程序
    # test -d /sys/firmware/efi/efivars || grub2-install "$MY_DISK_2"
    # test -d /sys/firmware/efi/efivars && efibootmgr -c -d "$MY_DISK_2" -p 1 -l "$(find /boot -name shimx64.efi -printf "/%Pn" -quit | sed 's!/!!g')" -L "Fedora RAID Disk 2"

  16. 使用 mdadm 测试电子邮件通知是否正常工作
    # mdadm --monitor --scan --oneshot --test

一旦您的驱动器完成同步,您应该能够在重新启动计算机时选择任一驱动器,您将收到相同的实时镜像操作系统。 如果任一驱动器出现故障,mdmonitor 将发送电子邮件通知。 从驱动器故障中恢复现在只需用新驱动器更换坏驱动器并运行一些 sgdisk 和 mdadm 命令来重新创建镜像(步骤 13 到 15)。 如果驱动器发生故障,您将不再需要担心丢失任何数据!

视频演示

将 UEFI PC 转换为 RAID1

将 BIOS PC 转换为 RAID1

  • 提示:将上述视频的质量设置为 720p 以获得最佳观看效果。