将单驱动器系统转换为 RAID

来自 ArchWiki

本指南展示了如何在添加第二块硬盘后,将功能正常的单驱动器系统转换为 RAID 1 设置,而无需将数据临时存储在第三块硬盘上。该步骤也可以简化并适用于转换简单的非根分区和其他 RAID 级别。

提示: 您可以考虑使用 raider,它可以将单磁盘转换为 RAID 系统,只需一个两步命令。

场景

此示例假定预先存在的磁盘是 /dev/sda,它仅包含一个分区 /dev/sda1,用于整个系统。新添加的磁盘是 /dev/sdb

警告: 在继续操作之前备份重要数据。

准备新磁盘

磁盘分区

第一步是在新磁盘 /dev/sdb1 上创建 分区,它将用作 RAID 阵列的镜像。通常,此步骤不需要重新创建预先存在的驱动器的确切分区方案;RAID 甚至可以在整个磁盘上配置,并且稍后创建 分区逻辑卷

确保分区类型设置为 FD。有关更多信息,请参见 RAID#准备设备RAID#分区设备

创建 RAID 设备

接下来,创建一个降级的 RAID 阵列,仅使用新磁盘。请注意 missing 关键字是如何为第一个设备指定的:这将在稍后添加。

# mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/device
提示: 运行 fdisk -l 以查找您要使用的磁盘

在运行命令之前,将device替换为您想要使用的设备。

如果您想使用 Syslinux,则指定 --metadata=1.0(对于引导分区)。截至 Syslinux 6.03,Syslinux 尚不支持 mdadm 1.2。另请参见 软件 RAID 和 LVM

通过检查 /proc/mdstat 确保阵列已正确创建

# Personalities : [raid1]                                                                                                                                                                       
md0 : active raid1 sdb1[1]                                                                                                                                                                    
      2930034432 blocks super 1.2 [2/1] [_U]                                                                                                                                                  
      bitmap: 22/22 pages [88KB], 65536KB chunk                                                                                                                                               
                                                                                                                                                                                              
unused devices: <none>

创建文件系统

/dev/md0 设备上创建所需的文件 系统

复制数据到阵列

警告: 建议从另一个系统(例如 Live 镜像)复制数据,以最大程度地减少复制过程中数据更改的风险。或者,使用 systemctl isolate rescue.target 切换到单用户模式。

挂载阵列

# mount --mkdir /dev/md0 /mnt/new-raid

现在将数据从 /dev/sda1 复制到 /mnt/new-raid/,例如使用 rsync

在新磁盘上启动

更新引导加载器

在引导加载器中创建一个新条目,以从新磁盘中的 RAID 阵列加载系统。

GRUB legacy

本文或本节的实际准确性存在争议。

原因: 在 2015 年 9 月文章重新组织后,以下配置尚未验证。(在 Talk:Convert a single drive system to RAID 中讨论)

使用您喜欢的文本编辑器打开 /mnt/new-raid/boot/grub/menu.lst

--- SNIP ---
default   0
color light-blue/black light-cyan/blue

## fallback
fallback 1

# (0) Arch Linux
title  Arch Linux - Original Disc
root   (hd0,0)
kernel /vmlinuz-linux root=/dev/sda1

# (1) Arch Linux
title  Arch Linux - New RAID
root   (hd1,0)
#kernel /vmlinuz-linux root=/dev/sda1 ro
kernel /vmlinuz-linux root=/dev/md0 md=0,/dev/sda1,/dev/sdb1
--- SNIP ---

请注意,我们添加了 fallback 行,并在内核行上使用不同的 root 指令复制了 Arch Linux 条目。

如果您的 /mnt/new-raid/boot/grub/menu.lst 文件中存在 “kopt” 和 “groot” 部分,也请如下所示更新它们,因为这将使应用发行版内核更新更容易

- # kopt=root=UUID=fbafab1a-18f5-4bb9-9e66-a71c1b00977e ro
+ # kopt=root=/dev/md0 ro md=0,/dev/sda1,/dev/sdb1

## default GRUB root device
## e.g. groot=(hd0,0)
- # groot=(hd0,0)
+ # groot=(hd0,1)

有关更多信息,请参见 GRUB Legacy

GRUB

请参阅 GRUB#RAID

要从降级阵列启动系统,您需要 (1) 将 mdadm_udev hook 添加到 /etc/mkinitcpio.conf 中的 HOOKS(在 block 条目之后),以及 (2) 重新生成 initramfs生成新的配置文件。然后,您可以在 /boot/grub/grub.cfg 中添加一个菜单项,指向引导的 raid 分区。默认生成选项使用主引导条目并将剩余的引导条目放在子菜单中,这使操作变得复杂。要恢复为每个引导选项每行生成单个条目,只需添加

   GRUB_DISABLE_SUBMENU=y

/etc/default/grub 并重新生成 grub.cfg。现在您可以简单地添加一个条目,其中包含设备文件(例如 /dev/md0/dev/md1)或直接使用每个 raid 文件系统的 UUID。完成此操作后,将条目添加到从降级阵列启动的最简单方法是复制 “Arch Linux, with Linux linux” 条目,并将 UUID 更改为与 /dev/disk/by-uuid 中显示的阵列匹配。

注意: 另一种避免 uuid 混淆的替代方法是在创建降级阵列并将文件复制到每个相应的阵列(例如 //boot/home)后 chroot 到您的降级阵列。您可以将 mdadm_udev hook 添加到 /etc/mkinitcpio.conf,重新生成 initramfs。在 chroot 环境中安装引导加载程序并生成 grub.cfg。然后,如果您切换主驱动器进行引导,则可以引导降级阵列。

修改 fstab

您需要告诉磁盘上的 fstab 在哪里找到新设备。建议使用 持久块设备命名

/mnt/new-raid/etc/fstab
/dev/md0    /    ext4     defaults   0 1

重建 initramfs

Chroot 进入 RAID 系统

# mount --bind /sys /mnt/new-raid/sys
# mount --bind /proc /mnt/new-raid/proc
# mount --bind /dev /mnt/new-raid/dev
# chroot /mnt/new-raid/

如果 chroot 命令给您类似 chroot: failed to run command `/bin/zsh': No such file or directory 的错误,请改用 chroot /mnt/new-raid/ /bin/bash

记录 mdadm 的配置

编辑 /etc/mdadm.conf 并将 MAILADDR 行更改为您的电子邮件地址,如果您希望在 RAID 1 出现问题时收到电子邮件警报。

然后保存带有 UUID 的阵列配置,以便系统在启动时更容易找到 /dev/md0。如果您不这样做,则在启动时可能会收到 ALERT! /dev/md0 does not exist 错误

# mdadm --detail --scan >> /etc/mdadm.conf

重建 initcpio

按照 RAID#配置 mkinitcpio 进行操作。

在 RAID 阵列上安装引导加载器

本文或本节需要扩充。

原因: 支持更多引导加载器,简化。(在 Talk:Convert a single drive system to RAID 中讨论)

GRUB Legacy

启动 GRUB

# grub --no-floppy

然后我们找到我们的两个分区 - 当前分区 (hd0,0) (即第一块磁盘,第一个分区)和 (hd1,1) (即我们刚刚在上面添加的分区,在第二块磁盘的第二个分区上)。检查您在此处获得两个结果

grub> find /boot/grub/stage1
(hd0,0)
(hd1,1)

然后我们告诉 GRUB 假设新的第二块驱动器是 (hd0),即系统中的第一块磁盘(当它当前不是这种情况时)。但是,如果您的第一块磁盘发生故障并且您将其移除,或者您更改了 BIOS 中检测磁盘的顺序,以便您可以从第二块磁盘启动,那么您的第二块磁盘将成为系统中的第一块磁盘。MBR 将是正确的,您的新第二块驱动器将成为您的第一块驱动器,并且您将能够从此磁盘启动。

grub> device (hd0) /dev/sdb

然后我们将 GRUB 安装到新第二块驱动器的 MBR 上。检查“分区类型”是否检测为 “0xfd”,如下所示,以确保您拥有正确的分区

grub> root (hd0,1)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  16 sectors are embedded. succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,1)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
 Done
grub> quit

验证成功

重新启动计算机,确保它从新的 RAID 磁盘 (/dev/sdb) 而不是原始磁盘 (/dev/sda) 启动。您可能需要在 BIOS 中更改启动设备优先级才能执行此操作。

一旦磁盘上的引导加载器加载,请确保您选择启动您之前创建的新系统条目。

通过查看 mount 的输出,验证您已从 RAID 阵列启动。还要再次检查 mdstat,仅确认哪个磁盘在阵列中。

# mount
 /dev/md0 on / type ext4 (rw)

本文或本节的实际准确性存在争议。

原因: 在 2015 年 9 月文章重新组织后,以下命令的输出尚未验证。(在 Talk:Convert a single drive system to RAID 中讨论)
# cat /proc/mdstat
 Personalities : [linear] [raid0] [raid1] [raid5] [multipath] [raid6] [raid10]
 md0 : active raid1 sdb1[1]
      40064 blocks [2/1] [_U]
 
 unused devices: <none>

如果系统启动正常,并且上述命令的输出正确,则您正在按预期从降级的 RAID 阵列运行。

将原始磁盘添加到阵列

分区原始磁盘

将分区表从 /dev/sdb(新实现的 RAID 磁盘)复制到 /dev/sda(我们添加到阵列的第二块磁盘),以便两个磁盘具有完全相同的布局

# sfdisk -d /dev/sdb | sfdisk /dev/sda

替代方法:这会将 /dev/sdb 分区布局输出到文件,然后将其用作分区 /dev/sda 的输入。

# sfdisk -d /dev/sdb > raidinfo-partitions.sdb
# sfdisk /dev/sda < raidinfo-partitions.sdb

验证分区是否相同

# fdisk -l
注意: 如果您在尝试将分区添加到阵列时遇到错误
mdadm: /dev/sda1 not large enough to join array
您可能在分区此磁盘时看到了较早的警告消息,即内核仍然看到旧的磁盘大小:重新启动应该可以解决此问题,然后再次尝试添加到阵列。

将磁盘分区添加到阵列

# mdadm /dev/md0 -a /dev/sda1
 mdadm: hot added /dev/sda1

验证 RAID 阵列是否正在重建

# cat /proc/mdstat
 Personalities : [raid1] 
md0 : active raid1 sda1[2] sdb1[1]
      2930034432 blocks super 1.2 [2/1] [_U]
      [>....................]  recovery =  0.2% (5973824/2930034432) finish=332.5min speed=146528K/sec
      bitmap: 22/22 pages [88KB], 65536KB chunk

unused devices: <none>

参见