将单驱动器系统转换为 RAID
本指南展示了如何在添加第二块硬盘后,将功能正常的单驱动器系统转换为 RAID 1 设置,而无需将数据临时存储在第三块硬盘上。该步骤也可以简化并适用于转换简单的非根分区和其他 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
设备上创建所需的文件 系统。
复制数据到阵列
systemctl isolate rescue.target
切换到单用户模式。挂载阵列
# mount --mkdir /dev/md0 /mnt/new-raid
现在将数据从 /dev/sda1
复制到 /mnt/new-raid/
,例如使用 rsync。
在新磁盘上启动
更新引导加载器
在引导加载器中创建一个新条目,以从新磁盘中的 RAID 阵列加载系统。
GRUB legacy
使用您喜欢的文本编辑器打开 /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
中显示的阵列匹配。
/
、/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 阵列上安装引导加载器
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)
# 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>
参见
- Convert running system to RAID 5 — 使用 RAID 5 的示例