1 前言
在安装Linux操作系统过程中,有时会遇到安装盘中自带设备驱动版本较老,不支持最新的RAID控制器(如MegaRAID SAS 9265-8i),导致系统安装时,找不到硬盘,系统无法继续安装。此时我们需要更新安装盘中带的驱动,或者使用使用驱动安装盘(一般为img文件)来更新驱动。
本文主要介绍如何制作Redhat Linux驱动安装盘和如何更新安装盘中的驱动,并介绍常见故障的处理办法。
第一步首先创建img文件,这样我们就可以向里面加入我们的驱动文件。
1、使用dd,创建一个与驱动盘设备大小一致的文件
[root@localhost ~]# dd if=/dev/zero bs=1k count=$NEW_INITRD_SIZE of=/root/initrd_new.img
$NEW_INITRD_SIZE对于软驱来说,为1440。对于其他USB设备来说,要$NEW_INITRD_SIZE一定要与该设备容量大小一致,不然系统安装时,无法识别和读取USB里面的文件。
2、使用mkefs,将创建img文件格式化
#mke2fs /root/initrd_new.img
下面是操作实例:
[root@localhost ~]# mke2fs /root/initrd_new.img
mke2fs 1.39 (29-May-2006)
/root/initrd_new.img is not a block special device.
Proceed anyway? (y,n) y
2.2 驱动盘主要文件
驱动安装盘里的主要文件如下(最简单的方式是下载一个LSI提供的驱动img文件,参考这个文件里面内容即可):
modinfo:驱动版本描述
modules.cgz:安装Redhat Linux时所需要的驱动。我们自己的驱动就放在这个压缩包中。
modules.dep:我们的驱动依赖关系。
pcitable:我们的驱动所能处理的PCI设备。大多数的Redhat Linux将会读取这个文件,若该类型的PCI设备存在,就会自动加载我们的驱动。
disk-info:该安装盘的描述信息。
rhdd:安装盘的描述信息。
modules.alias:
上面文件除modules.cgz为压缩文件外,其他都为文本文件。最重要的文件有三个modules.cgz、modules.dep和pcitable,下面分别介绍三个文件。
2.2.1 modules.cgz
制作modules.cgz文件步骤如下:
1、创建临时目录,如MegaRAID_SAS
[root@localhost ~]# mkdir MegaRAID_SAS
2、在临时目录中创建驱动对应的内核版本号目录
[root@localhost ~]# mkdir 2.6.18-2.6.18-308.el5.PAE
[root@localhost ~]# mkdir 2.6.18-308.el5
[root@localhost ~]# mkdir 2.6.18-308.el5xen
3、在对应的内核版本号目录下,创建目录。
[root@localhost 2.6.18-308.el5]# mkdir i686 x86_64
[root@localhost 2.6.18-308.el5]# ls
i686 x86_64
4、将驱动文件拷贝到相应的CPU架构目录下
如32位系统的驱动模块拷贝到i686目录中。
*注:驱动文件的版本要与内核版本一致。可使用modinfo来检验。
5、将find ./* |cpio -H crc -ov |gzip -c9 >/root/modules.cgz上面的目录和文件打包成modules.cgz
这两个文件内容和格式都非常简单。
1. modules.dep
是文本文件,列出模块依赖关系即可。
2、pcitable
[root@localhost temp]# cat pcitable
0x1000 0x0411 “megaraid_sas” “LSI|MegaRAID”
0x1028 0x0015 “megaraid_sas” “LSI|MegaRAID”
0x1000 0x0413 “megaraid_sas” “LSI|MegaRAID”
0x1000 0x0060 “megaraid_sas” “LSI|MegaRAID”
2.2.3 modinfo
按照下面格式写出模块信息即可。
[root@localhost temp]# cat modinfo
Version 0
megaraid_sas
scsi
“LSI Logic megaraid_sas Driver ver v00.00.06.12”
[root@localhost temp]#
在2.2节中,我们介绍了驱动盘里的主要文件和制作步骤。现在需要将这些文件拷贝到img文件中。
将2.1节制作的img文件mount到一个目录中,然后就可以将文件拷贝进去了。
#mount new_initr.img -o loop temp/
img文件中的最终内容如下:
root@localhost temp]# ls
disk-info lost+found modinfo modules.cgz modules.dep pcitable rhdd
1、插入USB软驱到单板上,使用dmesg命令看软盘的设备名(若系统只有一块硬盘,则软盘通常为/dev/sdb;系统有两块硬盘的话,软件设备名为/dev/sdc,以此类推)
2、将上面的镜像文件new_initr.img同步到软件上
dd if=/root/new_initr.img .dd of=<软盘设备名>
这样我们的驱动安装盘就大功告成了。
*注:软盘的容量只有1.38M,有时软盘显得太小。也可以使用U盘来制作驱动安装盘,原理和制作步骤和上面一样。
3 系统安装盘驱动更新
更新系统安装盘中的驱动,需要更改光盘ISO文件。更新驱动,需要修改两个地方:
(1)系统安装所用到的initrd.img文件
该文件一般在ISO文件isolinux/目录下,用作系统安装最小系统的启动。也是在这里识别到硬盘的。
(2)内核RPM包
RHEL ISO中,内核RPM包一般在Packages/目录下。如kernel-2.6.32-131.0.15.el6.i686.rpm。
3.1 安装initrd.img文件更新
如何修改内核initrd文件,请参考http://ilinuxkernel.com/?p=40 。在initrd文件中,我们需要将编译好最新设备驱动更新到文件modules.cgz中。制作和修改modules.cgz方法前面已有介绍。
以MegaRAID SAS控制器驱动为例,下载到的文件为megaraid_sas-v00.00.06.12-1-rhel50-u8-all.img。将img文件中的内容拷贝出来,做以下更新。
这里强调修改modules.cgz中的内容:
(1)找到设备驱动所在的位置,用最新编译好的驱动替换
注意:编译好的模块,内核版本号一定要和原有驱动内核版本号相同。如megaraid_sas。
(2)img文件中的pcitable、modules.alias数据全部添加到原有modules.cgz目录下对应文件。
3.2 内核RPM包更新
需要将kernel安装包中的驱动更新,或在安装完成后,重启机器前,更新驱动,并重新生成内核intird文件。
4 常见故障排除
前面制作好了驱动盘,安装时可能还会出现找不到硬盘设备。
还是找不到设备或硬盘的原因主要有两种:
(1)驱动盘的格式和文件不对,导致系统安装程序无法找到想要的驱动。
(2)modules.alias文件的数据未更新,导致找不到设备;
(3)驱动里面的pci table不全,导致无法找不到设备;
(4)自己(改动)的驱动使用的某些符号在内核中找不到。
判断是上面哪一种原因的方法是:安装界面在提示插入驱动盘后,我们就可以使用Ctrl + Alt + F2、Ctrl + Alt + F3、Ctrl + Alt + F4切换不同终端。这样我们就可以获取相关信息。其中一个终端会开启bash,另外一个终端显示内核日志信息(这是最重要的信息来源,比如可以查看我们驱动是否使用了内核不存在的符号);还有一个终端是显示系统安装脚本执行情况(从这里我们可以看到是否找到我们的驱动盘、我们的驱动是否成功加载)。
求问,怎么编译和内核相对应的驱动?
来学习,在这里能学到很多以前不知道的东西,谢谢大神分享……
请参考下面两篇文档:http://ilinuxkernel.com/?p=250 和 http://ilinuxkernel.com/?p=9
若有疑问或问题,欢迎留言。我尽力快速回复。
谢谢。