如何在一个可分割的软件 RAID1 上安装 CentOS 5 及 6

究竟可分割的软件 RAID1 是什么?

精简答案:它是一个可以如普通硬盘般被分割的 mdadm 磁盘数组

一直以来,使用 mdadm 磁盘数组的传统方法是:在组成磁盘数组的硬盘上个别创建分区;将这些分区类型设置为 0xfd(自动检测的 linux 磁盘数组);利用这些分区创建一个磁盘区;将它格式化为某种文件系统并使用它。假如你需要数个文件系统在磁盘数组上,你必须创建数个 RAID 磁盘区,意思就是你必须在数组中的每个硬盘上创建完全相同的分区,及创建多个 RAID 磁盘区。相比起来,一个真正的磁盘数组控制器容许你创建一个 RAID 磁盘区,而它可以如普通硬盘般被分割。

因此由 mdadm 2.6 起,它容许你创建可分割的 RAID 碟碟区。这些 RAID 磁盘区的设备名称是 /dev/md_dX,而其上的分区名称是 /dev/md_dXpY。当 mdadm 组合可分割式磁盘数组的磁盘区时,它会自动为其上的分区在 dev 目录内置立记录。

为何你会想将系统案装在一个可分割的软件 RAID1 上?

如果你将系统安装在一个可分割的软件磁盘阵例上,你可以将整个硬盘作为磁盘数组内的成员设备。由于 RAID1 是一个镜像,就算某一个硬盘失效了,你仍可以用其它硬盘来开机,而无须做任何特别步骤如保存开机程序。当你需要维修一个有故障的 RAID 磁盘区,而磁盘数组的成员是整个硬磁,你只需放入新的硬盘及执行 mdadm --add 便可以了;你无须进行分割或做其它事情。

安装程序

这份指引描述如何由零开始将 CentOS 5 及 6 安装在一个可分割的磁盘数组上。然而,你亦可以将现有非 RAID 的安装移植到一个可分割的磁盘数组上 —— 你只需在现有硬磁上找到未被分割的空间,又或者调整最尾一个分区的尺寸来释放一些空间。请依从这份指引的第三步来进行移植。

在这份教学文档内,我们会假设你的系统拥有两个硬盘:/dev/sda/dev/sdb

第 1 部份:创建数组、挂载及 chroot

CentOS 5 及 6 通用的步骤

  1. 利用标准的安装程序将 CentOS 安装在第一个硬磁 /dev/sda 上。在安装时请选择手动式分割,并剩下最少一个单元的未分割空间在硬盘的末端。你迟些便能够赎回大部份的空间。你须要预留这个空间给 mdadm,因它会将中继数据存储在 RAID 磁盘区的最后一个数据块内。

  2. 利用 CentOS 的安装碟开机并进入修复模式。安装程序会询问是否需要挂载现存的 CentOS 安装,而你必须拒绝。
  3. 在 mdadm 的降级模式下,以 /dev/sda 创建软件磁盘数组:

    mdadm --create --metadata=0.90 --level=1 --raid-devices=2 /dev/md_d0 /dev/sda missing
    
  4. 将镜像磁盘 /dev/sdb 加入磁盘数组,并检查 /proc/mdstat 看看是否已经开始创建磁盘数组:

    mdadm --add /dev/md_d0 /dev/sdb
    cat /proc/mdstat
    
  5. 现在你必须手动地挂载系统并 chroot 到里面来更改开机设置:

    mkdir /mnt/sysimage
    mount /dev/md_d0p1 /mnt/sysimage
    mount -o bind /dev /mnt/sysimage/dev
    mount -o bind /selinux /mnt/sysimage/selinux
    mount -t proc none /mnt/sysimage/proc
    mount -t sysfs none /mnt/sysimage/sys
    chroot /mnt/sysimage
    

    由现在开始,所有步骤都在 chroot 环境下进行。

第 2 部份:设置系统由 RAID 开机

CentOS 5 的步骤

  1. 创建 /etc/mdadm.conf

    mdadm --detail --scan > /etc/mdadm.conf 
  2. 编辑 /etc/fstab。你必须将所有 LABEL= 的挂载转为明确的设备名称,例如:/dev/md_d0p1/dev/md_d0p2……

  3. 编辑 /etc/grub.conf,将 root=LABEL=…… 改为 root=/dev/md_d0p1(或者你的设置内的相应分区)。

  4. 现在你必须修正 mkinitrd 脚本。请从 这页下载修正档并执行以下指令:

    cd /sbin
    cp mkinitrd mkinitrd.dist
    patch -p0 < /tmp/mkinitrd-md_d0.patch
    

详情请参阅这个相关的错误报告

  1. 停止 yum 更新 mkinitrd 组件。在 /etc/yum.conf 内加入
    exclude=mkinitrd*
    
  2. 创建新的 initrd 映像:
    cd /boot
    mv initrd-2.6.18-128.el5.img initrd-2.6.18-128.el5.img.bak
    mkinitrd /boot/initrd-2.6.18-128.el5.img 2.6.18-128.el5
    

假若你将来需要更新 mkinitrd 组件,但检测可分割磁盘数组的错误仍未被矫正,你必须将以上的修正再次应用在 mkinitrd,然后重新创建 initrd。

CentOS 6 的步骤

  1. 创建 /etc/mdadm.conf:

    mdadm --detail --scan > /etc/mdadm.conf
    
  2. 编辑 /etc/fstab:你必须把所有采用 UUID= 的挂载改为设备名称,例如 /dev/md_d0p1/dev/md_d0p2、……

  3. 编辑 /etc/grub.conf,以 root=/dev/md_d0p1(或对应你设置内的分区)代替 root=UUID=……。你也要把内核的 rd_NO_MD 选项删除(存在的话),否则开机时便不会找到任何 md 设备(RAID)。

  4. 创建新的 initramfs 映像:
    cd /boot
    mv initramfs-2.6.32-220.el6.x86_64.img initramfs-2.6.32-220.el6.x86_64.img.bak
    dracut /boot/initramfs-2.6.32-220.el6.x86_64.img 2.6.32-220.el6.x86_64
    

第三部份:重新开机

  1. 现在你唯一要做的就是定时检查 /proc/mdstat,看看磁盘数组是否在重建中。当重建完成后,你便可以安全地重新开机。

  2. 你亦可以选择性地调整你的磁盘数组上的最后一个分区,来赎回仍未分割的空间。

Translation of revision 8

zh/HowTos/Install On Partitionable RAID1 (last edited 2012-05-08 15:40:57 by TimothyLee)