在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)

**

在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)

本文介绍如何在现有系统上加装一块硬盘,实现软RAID1,无论哪块硬盘损坏,系统都能启动。

1. 现有系统
现有系统为CentOS 7.6,配有一块硬盘/dev/sda,/dev/sda安装有正在运行的系统,其分区信息如下:
/dev/sda1 /boot Ext2
/dev/sda2 /   Ext4
/dev/sda3 /home Ext4
/dev/sda4 保留
/dev/sda5 swap Ext4
准备加装一块相同的硬盘/dev/sdb。下面是实现RAID1之后的分区信息:
/dev/md1 /dev/sda1 /dev/sdb1 /boot Ext4
/dev/md2 /dev/sda2 /dev/sdb2 /   Ext4
/dev/md3 /dev/sda3 /dev/sdb3 /home Ext4
/dev/sda4 /dev/sdb4 保留
/dev/md5 /dev/sda5 /dev/sdb5 swap Ext4

2. 准备/dev/sdb
先在/dev/sdb上创建RAID1,再把/dev/sda的内容拷贝到RAID1,最后将/dev/sda加到RAID1阵列。

  1. 将/dev/sda的分区表拷贝到/dev/sdb,保证两块硬盘布局完全相同。
    sfdisk -d /dev/sda | sfdisk --force /dev/sdb
    在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)
  2. 将/dev/sdb的分区类型改为Linux raid autodetect
    fdisk /dev/sdb
    Command (m for help): <-- p
    Command (m for help): <-- t
    Partition number (1-4): <-- 1,2,3,5
    Hex code (type L to list codes): <-- L
    Hex code (type L to list codes): <-- fd
    Command (m for help): <-- wq
    在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)
  3. 清空/dev/sdb
    mdadm --zero-superblock /dev/sdb1
    mdadm --zero-superblock /dev/sdb2
    mdadm --zero-superblock /dev/sdb3
    mdadm --zero-superblock /dev/sdb5
    如果/dev/sdbX以前没有安装过RAID,会显示如下错误信息:
    [[email protected] ~]# mdadm --zero-superblock /dev/sdb1
    mdadm: Unrecognised md component device - /dev/sdb1
    [[email protected] ~]# mdadm --zero-superblock /dev/sdb2
    mdadm: Unrecognised md component device - /dev/sdb2
    [[email protected] ~]# mdadm --zero-superblock /dev/sdb3
    mdadm: Unrecognised md component device - /dev/sdb3
    [[email protected] ~]# mdadm --zero-superblock /dev/sdb5
    mdadm: Unrecognised md component device - /dev/sdb5
    否则不显示任何信息。

3. 在/dev/sdb上创建RAID

  1. 在/dev/sdb上创建RAID阵列,此时还不能加入/dev/sda,命令如下:
    mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb1
    mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb2
    mdadm --create /dev/md3 --level=1 --raid-disks=2 missing /dev/sdb3
    mdadm --create /dev/md5 --level=1 --raid-disks=2 missing /dev/sdb5
    在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)
    cat /proc/mdstat
    在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)

  2. 在RAID上创建文件系统:
    mkfs.ext2 /dev/md1
    mkfs.ext4 /dev/md2
    mkfs.ext4 /dev/md3
    mkswap /dev/md5

  3. 创建 RAID配置文件/etc/mdadm.conf :
    mkdir /etc/mdadm
    mdadm --examine --scan > /etc/mdadm/mdadm.conf
    cat /etc/mdadm/mdadm.conf

4. 把现有系统切换到/dev/sdb

  1. 挂载RAID分区,swap分区不用挂载
    mkdir /mnt/md1
    mkdir /mnt/md2
    mkdir /mnt/md3

mount /dev/md1 /mnt/md1
mount /dev/md2 /mnt/md2
mount /dev/md3 /mnt/md3

mount
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda2 on / type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda3 on /home type ext4 (rw,relatime,seclabel,data=ordered)
/dev/md1 on /mnt/md1 type ext4 (rw,relatime,seclabel,data=ordered)
/dev/md2 on /mnt/md2 type ext4 (rw,relatime,seclabel,data=ordered)
/dev/md3 on /mnt/md3 type ext4 (rw,relatime,seclabel,data=ordered)

  1. 修改 /etc/fstab,设备名换成/dev/mdX
    vi /etc/fstab
    在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)
  2. 修改 GRUB 启动脚本
    cp /etc/grub.d/40_custom /etc/grub.d/09_swraid1_setup
    vi /etc/grub.d/09_swraid1_setup

[[email protected] grub.d]# cat 09_swraid1_setup

menuentry ‘CentOS Linux (3.10.0-957.el7.x86_64) 7 (RAID1)’ --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option ‘gnulinux-3.10.0-957.el7.x86_64-advanced-aaf08b27-9a37-4e66-a7c2-86cd0fdc9a9e’ {
load_video
set gfxpayload=keep
insmod diskfilter
insmod raid5rec
insmod raid6rec
insmod mdraid1x
insmod mdraid09
insmod mdraid09_be
insmod gzio
insmod part_msdos
insmod ext2
set root=’(md/1)’
linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/md2 ro quiet
initrd16 /initramfs-3.10.0-957.el7.x86_64.img
}

vi /etc/default/grub
[[email protected] grub.d]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="(seds,release.(sed 's, release .*,g’ /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT=“console”
GRUB_CMDLINE_LINUX=“crashkernel=auto rhgb quiet rd.auto=1”
#GRUB_DISABLE_RECOVERY=“true”
GRUB_DISABLE_LINUX_UUID=true

grub2-mkconfig –o /boot/grub2/grub.cfg
vi /boot/grub2/grub.cfg
menuentry ‘CentOS Linux (3.10.0-957.el7.x86_64) 7 (RAID1)’ --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option ‘gnulinux-3.10.0-957.el7.x86_64-advanced-aaf08b27-9a37-4e66-a7c2-86cd0fdc9a9e’ {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod ext2
insmod diskfilter
insmod raid5rec
insmod raid6rec
insmod mdraid1x
insmod mdraid09
insmod mdraid09_be
set root=’(md/1)’
linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/md2 ro crashkernel=auto rhgb quiet LANG=en_US.UTF-8 rd.auto=1
initrd16 /initramfs-3.10.0-957.el7.x86_64.img
}

更新initramfs:
mv /boot/initramfs-uname -r.img /boot/initramfs-uname -r.img_orig
dracut --mdadmconf --fstab --add=“mdraid” --add-drivers=”raid1” -f /boot/initramfs-uname -r.img uname -r

把现有系统复制到/dev/sdb:
cp -dpRxZ / /mnt/md2
cp -dpRxZ /boot/* /mnt/md1
cp -dpRxZ /home/* /mnt/md3

5. Preparing GRUB (Part 1)
grub2-install --root-directory=/ /dev/sda
grub2-install --root-directory=/ /dev/sdb

reboot

问题1:dracut-initqueue[240]: Waring: /dev/md2 does not exist
解决要点:
dracut --mdadmconf --fstab --add=“mdraid” --add-drivers=”raid1” -f /boot/initramfs-uname -r.img uname -r

/boot/grub2/grub.cfg:
linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/md2 ro crashkernel=auto rhgb quiet LANG=en_US.UTF-8 rd.auto=1

问题2:输入正确的口令,不能登录。
禁用selinux,启动系统。
在grub的启动选项加上selinux=0
[[email protected] ~]# getsebool –a
getsebool: SELinux is disabled Preparing /dev/sda
发现不是/dev/md2,执行如下操作:
cd /
genhomedircon
touch /.autorelabel
reboot

如果一切正常,/dev/md1、/dev/md2、/dev/md3会正常挂载。
cat /proc/mdstat
在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)
修改/dev/sda分区类型为Linux raid autodetect:
[[email protected] ~]# fdisk /dev/sda
在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)
现在可以把 /dev/sda1, /dev/sda2, /dev/sda3 ,/dev/sda5加入RAID阵列:
mdadm --add /dev/md1 /dev/sda1
mdadm --add /dev/md2 /dev/sda2
mdadm --add /dev/md3 /dev/sda3
mdadm --add /dev/md5 /dev/sda5
加好之后看一下,可以看到系统正在同步…
cat /proc/mdstat
等同步完成。

调整 /etc/mdadm/mdadm.conf 以适合新环境:
mdadm --examine --scan > /etc/mdadm/mdadm.conf
cat /etc/mdadm/mdadm.conf

6. Preparing GRUB (Part 2)
grub2-set-default " CentOS Linux (3.10.0-957.el7.x86_64) 7 (RAID1)"
mv /boot/initramfs-uname -r.img /boot/initramfs-uname -r.img_orig
dracut --mdadmconf --fstab --add=“mdraid” --add-drivers=”raid1” -f /boot/initramfs-uname -r.img uname -r

reboot

至此,已完成RAID1在现有系统CentOS 7.6上的安装。

7. 测试
模拟一块硬盘失效。
模拟/dev/sdb3失效
mdadm /dev/md3 -f /dev/sdb3

mdadm -D /dev/md3
在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)
可以看到/dev/sdb3已经标记为损坏

mdadm /dev/md3 -r /dev/sdb3 移除
mdadm /dev/md3 -a /dev/sdc3 加入替换盘/dev/sdc3

重新启动系统成功

8. 替换损坏的硬盘
假设/dev/sda损坏
8.1 从所有RAID阵列移除/dev/sda
mdadm /dev/md1 -f /dev/sda1
mdadm /dev/md2 -f /dev/sda2
mdadm /dev/md3 -f /dev/sda3
mdadm /dev/md5 -f /dev/sda5

mdadm /dev/md1 -r /dev/sda1
mdadm /dev/md2 -r /dev/sda2
mdadm /dev/md3 -r /dev/sda3
mdadm /dev/md5 -r /dev/sda5

8.2 关机,切断电源,换上新的硬盘。
poweroff

8.3 重新上电开机
fdisk –l
在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)
老的硬盘被挂在了/dev/sda,新加的硬盘被挂在/dev/sdb了。

8.4 拷贝分区信息
sfdisk -d /dev/sda | sfdisk --force /dev/sdb

8.5 删除/dev/sdb上以前的 RAID信息
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
mdadm --zero-superblock /dev/sdb3
mdadm --zero-superblock /dev/sdb5

8.6 将/dev/sdb加入RAID 阵列
mdadm -a /dev/md1 /dev/sdb1
mdadm -a /dev/md2 /dev/sdb2
mdadm -a /dev/md3 /dev/sdb3
mdadm -a /dev/md5 /dev/sdb5

8.7 看一下,系统正在同步,耐心等待完成同步……
cat /proc/mdstat
在现有系统上实现软RAID1 (CentOS 7.6-GRUB2)
8.8 安装bootloader
grub2-install --root-directory=/ /dev/sda
grub2-install --root-directory=/ /dev/sdb

至此,大功告成!