很早写的一篇关于在 Red Flag Server 上如何编译 RAID卡驱动的文章,现在发布出来,以备后用。
文章中参考了一些网上的资料,加上自己动手实际操作,算是一个驱动编译的实例,如有什么错误,烦请指正,谢谢!
——————————————————————————————————————————————-

下面是在 DC5.0SP2 x86_64系统上编译IBM X3950 RAID卡驱动:

操作系统:DC5.0 SP2 x86_64
系统核心:2.6.9-42.7AX
涉及机型:IBM X3950

1、下载所需的驱动源码,本案例选用IBM X3950 RAID驱动源码包 ibm_dd_aacraid_1.1.5.2449_rhel4_32-64.tgz
2、解压,并进入SRPM目录中安装源码包,
[php][root@localhost SRPM]# ls
adpt-aacraid-1.1.5.2449-0.src.rpm
[root@localhost SRPM]# rpm -ivh adpt-aacraid-1.1.5.2449-0.src.rpm
1:adpt-aacraid-smp ########################################### [100%]
[/php]
3、在/usr/src/redflag/SOURCES 里会有一个 aacraid_source.tgz 压缩包,将其解压。(为了以后的操作方便,建议在此处最好新建一个文件夹,用来解压aacraid_source.tgz包)
[php][root@localhost SRPM]# cd /usr/src/redflag/SOURCES/
[root@localhost SOURCES]# mkdir 123
[root@localhost SOURCES]# cp aacraid_source.tgz ./123/
[root@localhost SOURCES]# cd 123
[root@localhost 123]# tar -zxvf aacraid_source.tgz
[/php]
4、进入 /usr/src/kernel/2.6.9-42.7AX-x86_64 单核心目录下,使用命令[php] make SUBDIRS=<dir> [/php] 进行编译,其中 dir 就是驱动源码的目录;
[php][root@localhost 2.6.9-42.7AX-x86_64]# make SUBDIRS=/usr/src/redflag/SOURCES/123/
LD /usr/src/redflag/SOURCES/123/built-in.o
CC [M] /usr/src/redflag/SOURCES/123/linit.o
……
LD [M] /usr/src/redflag/SOURCES/123/aacraid.ko
[/php]

5、在 /usr/src/redflag/SOURCES/123 文件夹中可以找到已经编译好的 aacraid.ko 模块文件,将其提取出来,然后执行 make clean 命令,如果此命令不能运行成功,那么我们可以将这个新建的123目录删除或清空,以免影响后面其他核心的编译,然后重新解压缩 aacraid_source.tgz包,这也就是为什么要在第三步中新建123文件夹的原因,仅属于个人操作习惯。

6、在不同的核心目录下执行上述的编译步骤,并且新建不同的核心目录,将制作出来的aacraid.ko模块文件分别放进对应的目录当中,如下所示:
[php]
2.6.9-42.7AX
2.6.9-42.7AX/i686/aacraid.ko
2.6.9-42.7AX/x86_64/aacraid.ko
2.6.9-42.7AXsmp
2.6.9-42.7AXsmp/i686/aacraid.ko
2.6.9-42.7AXsmp/x86_64/aacraid.ko
2.6.9-42.7AXlargesmp
2.6.9-42.7AXlargesmp/i686/aacraid.ko
2.6.9-42.7AXlargesmp/x86_64/aacraid.ko
[/php]
需要注意的是,i686的驱动模块要在32位系统中进行编译。

7、将制作好的驱动进行打包;
[php][root@localhost 1]# ls
2.6.9-42.7AX 2.6.9-42.7AXsmp 2.6.9-42.7AXlargesmp
[root@localhost 1]# find 2.6.* |cpio -H crc -o |gzip -9 > modules.cgz
[/php]
在一个驱动包里面,会有modinfo、modules.cgz、modules.dep、pcitable、rhdd 这五个文件, modules.cgz 文件已经制作完毕,下面该制作modinfo、modules.dep、pcitable、rhdd四个文件。

8、modinfo
该文件用于驱动程序的描述,文件格式是:
[php]
Version 0

<module-name> 是硬件内核驱动的名称(不包含路径名也不包括扩展名)。

<module-type> 是硬件种类,目前仅支持网络设备和SCSI 设备,网络设备用eth 表示,SCSI/RAID类设备用scsi表示,前面必须插入tab 符或空格。

"<description>" 是该驱动模块的简单说明,前面也必须插入tab 符或空格,同时必须用双引导将说明内容括起来。
[/php]
除了注释行以外(以”#” 号开头),首行必须是”Version 0″;

例如该驱动的modinfo内容如下:
[php]
Version 0

megaraid_sas

scsi

"Dell PERC2, 2/Si, 3/Si, 3/Di, Adaptec Advanced Raid Products, HP NetRAID-4M, IBM ServeRAID & ICP SCSI driver"
[/php]

9、modules.dep

该文件用于描述本模块对其他模块的依赖关系。如果该模块依赖其它模块则需要在文件中这样描述:
[php]
<target-module>: <depeding-module>

其中:
<target-module> 是本驱动模块的名称,

<depending-module> 是被依赖模块的名称。该文件格式和内核依赖关系
[/php]
在modinfo显示的信息中,我们可以看到 megaraid_sas 该驱动模块依赖于scsi_mod这个模块:
[php][root@hanlu Desktop]# modinfo aacraid.ko
filename: aacraid.ko
version: 1.1-5[2449]custom-IBM 10CD3DC5CC463300A8EA632
license: GPL
description: Dell PERC2, 2/Si, 3/Si, 3/Di, Adaptec Advanced Raid Products, HP NetRAID-4M, IBM ServeRAID & ICP SCSI driver
depends: scsi_mod
vermagic: 2.6.9-42.7AX gcc-3.4
alias: pci:v00009005d00000288sv*sd*bc*sc*i*
alias: pci:v00009005d00000286sv*sd*bc*sc*i*
alias: pci:v00009005d00000285sv*sd*bc*sc*i*
……
[/php]
所以modules.dep文件的内容应该写成如下:
[php]
megaraid_sas: scsi_mod
[/php]

10、pcitable

该文件用于硬件设备的描述,以便用户更好的识别该硬件。这些描述信息用户可以使用命令lspci -n 列出,也可以直接查看文件/proc/bus/pci/devices。

文件格式如下:
[php]
<Vender-ID> <Device-ID> "<driver-name>" "<description>"
[/php]
上述各项的表示如下:
[php]
<Vender-ID>:硬件厂商代码

<Device-ID>:设备代码

<driver-name>:"硬件驱动名"

<description>:"硬件设备驱动描述"
[/php]
例如:
[php]
0x1000 0x0411 "megaraid_sas" "LSI|MegaRAID"

0x1028 0x0015 "megaraid_sas" "LSI|MegaRAID"

0x1000 0x0413 "megaraid_sas" "LSI|MegaRAID"

0x1000 0x0060 "megaraid_sas" "LSI|MegaRAID"
[/php]

11、rhdd

该文件是设备驱动软盘标志文件。文件中可以写入任何一行不以空格开头的字符串,如该驱动的rhdd内容是:
[php]
[root@localhost 1]# cat rhdd

megaraid_sas-v00.00.03.03 driver disk for DC5.0 SP2 (i686&x86_64)
[/php]

modinfo、modules.cgz、modules.dep、pcitable、rhdd 五个文件制作完毕后,修改文件的权限,统一给成 755 的权限。最后,可以制作.img文件,正式使用了。

制作一个软盘映象的过程是:

1、建立img文件
dd if=/dev/zero of=xxx.img bs=512 count=2880
2、格式化
mkfs.ext3 xxx.img
3、挂载
mount -o loop xxx.img /mnt/cdrom
4、将modinfo、modules.cgz、modules.dep、pcitable、rhdd五个文件直接拷贝到挂载的目录下;
cp modinfo modules.cgz modules.dep pcitable rhdd /mnt/cdrom
5、卸载
umount /mnt/cdrom

此时,驱动程序制作完毕。

安装驱动时也非常简单,具体步骤如下:
1、将驱动存放在U盘中,该U盘不能是NTFS格式;
2、使用安装光盘引导启动,在boot:处插入U盘,并输入 linux dd 回车;
3、选择U盘盘符,一般是sda设备,然后找U盘中的驱动程序,进行加载。
加载完成后,继续安装系统即可。RAID必须在安装系统前做好,不然,加了RAID卡驱动也不能识别到盘。