场景说明
硬件:华为服务器携带RAID阵列卡
系统:RedHat6.5
系统安装到服务器的硬盘上,启动提示无法找到系统盘,中断退出。其实这主要是内核没有添加megaraid驱动的关系,而且光盘上提供的initrd虚拟根文件系统,也没有将megaraid打包进initrd之中。所以在安装的过程中,由于无法识别RAID卡,导致找不到硬盘,无法加载系统进内存,启动失败。
知识储备
Linux内核源码实际上有各大厂商提供的支持的RAID驱动的源码,内核源代码目录linux-2.6.11\drivers\scsi\megaraid下是RAID卡驱动,Kconfig.megaraid记录支持RAID卡的种类详细信息。
除了内核源码有RAID卡的驱动源码,在系统的/lib/module/`uname–r`/driver/scsi/目录下还有编译好的megaraid.ko驱动文件,这个时候如果使用dracut指令,通过添加RAID驱动到initrd,重新打包,就能够解决问题。
解决方案
系统环境:CentOS release 6.5 (Final)
内核版本:2.6.32-431.el6.x86_64
#dracut --add-driver megaraid.ko /boot/initrd.img
将在/boot目录下创建一个名为initrd.img文件的通用initramfs.这包含了你当前运行内核当前加载的全部内核模块,目前生成的虚拟文件大小是45MB。
详细操作
环境:CentOS release 6.5 (Final)+ 2.6.32-431.23.3.el6.x86_64。服务器上的系统盘,通过raid卡,连接到主板上,现在需要将系统安装到系统盘上,所以必须要先加载raid驱动,然后才能够让系统识别系统盘上的文件系统,挂载真正的根文件系统。
方案提供:
方案1:将raid驱动编译进内核
方案2:将raid驱动添加进initrd.img
将通过方案2实现。
步骤一:正常情况下,启动异常提示:
WARNING:at arch/x86/kernel/smp.c 118native_smp_send_reschedule +0x5c10x68c
dracut warning : No root device"Block:/dev/mapper/live -rw"
kernel panic
注明:可以通过在菜单中添加rdshell,获取控制台进行分析问题
步骤二:拷贝其他系统中的megaraid文件中的驱动,然后在init中,手动加载,并且拷贝insmod命令
1)解压initrd.img文件
2)拷贝megaraid文件夹
3)通过ldd insmod搜索需要的动态库
4)编辑init文件,加载驱动
5)重新打包initrd.
错误异常:
insmod: error inserting 'megaraid.ko': -1Required key not available
排查:内核版本不一致:
2.6.32-431.el6.x86_64,导致加载驱动失败,必须匹配上编译内核的版本
步骤三:到相同版本的机器上拷贝/lib/module/'uname -r'/kernel/driver/scsi/megaraid/,重新执行步骤二
出现异常:
dracut warning : No root device"Block:/dev/mapper/live -rw"
kernel panic
总结:通过rdshell获取kernel panic之后的控制台,发现模块已经正确加载,但是无法发现系统盘设备,想起根文件系统需要加载fat驱动。
#cd /dev/disk
can not find /dev/disk directory #说明还是没有检测到磁盘设备
正常情况下会生成如下的目录:
/dev/disk:
by-label by-id by-uuid 对设备进行映射
步骤四:在其他已经安装系统的机器上,执行depmod -a,建立驱动模块之间的依赖表,然后使用dracut指令通过添加raid驱动参数,重新生成一个initrd。替换到原来的initrd。启动成功
#depmod -a
说明:depmod 程序生成/lib/module/'uname -r'/modules.dep文件,记录下驱动模块之间的
依赖关系,同时也会针对当前的PCI等接口,生成map文件。这些文件为hotplug(热拔插)
设备检测程序提供了自动加载驱动的依据。
#dracut --add-driver megaraid.ko -v/initrd.img