问题
mdadm 工具用于使用两个设备映射器多路径设备创建软件 RAID 镜像:
# /sbin/mdadm /dev/md0 --create --verbose --level=1 --raid-devices=2 /dev/mapper/ocrp1 /dev/mapper/ocrmirrorp1
然后确认设置:
# /sbin/mdadm --detail /dev/md0 ... Number Major Minor RaidDevice State 0 253 2 0 active sync /dev/dm-2 1 253 3 1 active sync /dev/dm-3
由于显示了实际的多路径设备名称 (/dev/dm-N),因此还验证了更友好名称 (/dev/mapped/ocrp1) 的映射:
# /bin/ls -l /dev/mpath/ lrwxrwxrwx 1 root root 7 Apr 23 11:15 ocrp1 -> ../dm-2 lrwxrwxrwx 1 root root 7 Apr 23 11:15 ocrmirrorp1 -> ../dm-3
# /bin/ls -l /dev/mapper/ brw-rw---- 1 root disk 253, 2 Apr 23 11:15 ocrp1 brw-rw---- 1 root disk 253, 3 Apr 23 11:15 ocrmirrorp1
由于这些方便的名称映射到相同的多路径设备,因此该设置已被证明是正确的。
重新启动后,mdadm 显示以下内容:
# /sbin/mdadm --detail /dev/md0 ... Number Major Minor RaidDevice State 0 8 97 0 active sync /dev/sdg1 1 8 113 1 active sync /dev/sdh1
RAID 处于活动状态,但未按预期使用多路径设备。
解决方案
这实际上是一个时间问题。
在系统引导期间,/etc/rcN.d 脚本在检测到多路径设备并准备就绪之前启动 mdadm。
这本质上是一种竞争条件,因为更多的多路径设备需要更长的时间来识别,并且 mdadm 可能会在多路径处理完成之前运行。
解决方案是将必需的文件系统处理程序和设备添加到 /initrd 文件中,以便内核在启动时可以使用这些处理程序和设备。
这将允许内核更早地开始处理多路径设备。
注意:Linux 内核 /vmlinuz 文件只支持一些非常基础的设备。
文件系统处理程序和通用设备驱动程序分别编译并打包在 /initrd(初始 ramdisk)文件中。
GRUB 或者 jack 引导加载程序必须首先将 /initrd 文件的内容放入内存,然后加载内核。
然后内核使用初始 ramdisk 获取访问根文件系统所需的设备驱动程序。
然后内核切换到使用实际的根文件系统并释放 /initrd 内存镜像使用的内存。
这种巧妙的方法允许为一个内核镜像提供为每个系统量身定制的设备驱动程序集,而不会浪费系统内存来保存从未使用的设备驱动程序和文件系统处理程序代码。
要构建包含多路径支持的自定义 /initrd 文件,请使用以下技术:
- 创建一个新的 initrd 文件,包括 multipath、device-mapper-multipath 和 HBA 驱动程序:
# /sbin/mkinitrd -v /root/initrd-mp.img 2.6.18-prep --with=multipath --with=dm-multipath --with=lpfc --omit-raid-modules
要在 CentOS/RHEL 6 和 7 上做同样的事情,请看下面的帖子。
- 验证文件 /etc/mdadm.conf 是否为 RAID 设备配置:
# /bin/cat /etc/mdadm.conf DEVICE /dev/mapper/* ARRAY /dev/md0 uuid=ccfe8a98:ea584ff2:2fad9d51:305ea2da devices=/dev/mapper/ocrp1,/dev/mapper/ocrmirrorp1 level=raid1
- 将新的 ramdisk 镜像复制到引导加载程序所需的引导位置:
# /bin/cp /root/initrd-mp.img /boot/
- 在引导加载程序配置文件 /boot/grub/grub.conf 中添加一个新条目以使用新的 ramdisk 镜像:
title MDADM-MP root (hd0,0) kernel /vmlinuz-2.6.18-8.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet initrd /initrd-mp.img
注意:根据需要更改示例 GRUB 节。
内核版本和根设备肯定会与此示例不同。
当使用 CentOS/RHEL 7 和 grub2 时,请参阅下面的帖子以了解确切的步骤。
- 重新启动系统并从 GRUB 菜单中选择 MDADM-MP 条目。
提示:如果我们仍然没有看到正在使用的多路径设备,我们将需要添加一个启动脚本来运行 mdadm 作为最后的引导步骤。
如果我们不想编写完整的 /etc/init.d/ 服务脚本,执行此操作的一种方法是将必要的命令添加到 /etc/rc.local。