Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3759082
  • 博文数量: 880
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 6155
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-11 09:12
个人简介

To be a better coder

文章分类

全部博文(880)

文章存档

2022年(5)

2021年(60)

2020年(175)

2019年(207)

2018年(210)

2017年(142)

2016年(81)

分类: LINUX

2018-09-18 15:54:37


场景说明

硬件:华为服务器携带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

阅读(1428) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~