移植mpt3sas驱动

来源:互联网 发布:质检总局网络党校 编辑:程序博客网 时间:2024/06/15 01:50

Fullnat的lvs内核在华为的服务器上正常运行,但在浪潮的服务器上却报如下错误,不能正常启动。

[    103.5652276    ]  Kernel panic - not syncing: Attempted to kill init!

而6.5版本的红帽官方内核是能正常启动的。经排查,发现是浪潮服务器主板上用了SAS卡,但Fullnat的lvs内核中因为比较老,没有这个驱动(mpt3sas)

红帽内核中:lsmod | grep mpt3sas 有结果

find /home/lzt/Downloads/lvs_kernels/2/LVS/kernel -name mpt3sas 无结果

所以,需要将红帽内核中的mpt3sas驱动模块移植到lvs内核中


下载红帽内核的SPackages。以.src.rpm结尾的软件包是包含了源代码的rpm包,在安装时需要进行编译。但我们的目的只是为了获取mpt3sas驱动模块的源代码。

wget http://vault.centos.org/6.5/os/Source/SPackages/kernel-2.6.32-431.el6.src.rpm

rpm -ivh kernel-2.6.32-431.el6.src.rpm

cd /root/rpmbuild/SPECS/ (内核包的默认解压目录)

yum install rpm-build

rpmbuild -bp kernel.spec  (生成源代码。这一步可能还要解决依赖问题)

find /root/rpmbuild/ -name mpt3sas

cp /root/rpmbuild/BUILD/kernel-2.6.32-431.el6/linux-2.6.32-431.el7.centos.x86_64/drivers/scsi/mpt3sas kernel/drivers/scsi/ -r (将找到的mpt3sas驱动模块拷贝过去)


修改一些配置文件(对比原来的),将mpt3sas作为模块加入编译过程。

cd drivers/scsi/

emacs Kconfig

1918L: source "drivers/scsi/mpt3sas/Kconfig"


cd kernel/

make menuconfig


emacs  drivers/scsi/Makefile


然后就可以开始编译了。编译过程肯定会报错(如下),因为我们拷贝过来的mpt3sas驱动模块的源代码只是实现部分,它新增了一些变量和函数,在被移植的内核源代码中是没有的。需要按照报错信息,对比新旧内核源代码,将定义声明部分拷贝过来。

drivers/scsi/mpt3sas/mpt3sas_base.c: In function ‘_base_wait_on_iocstate’:

drivers/scsi/mpt3sas/mpt3sas_base.c:3000: error: implicit declaration of function ‘usleep_range’

drivers/scsi/mpt3sas/mpt3sas_base.c: In function ‘_base_reset_handler’:

drivers/scsi/mpt3sas/mpt3sas_base.c:4704: error: ‘USHRT_MAX’ undeclared (first use in this function)

drivers/scsi/mpt3sas/mpt3sas_base.c:4704: error: (Each undeclared identifier is reported only once

drivers/scsi/mpt3sas/mpt3sas_base.c:4704: error: for each function it appears in.)

make[3]: *** [drivers/scsi/mpt3sas/mpt3sas_base.o] Error 1

make[3]: *** Waiting for unfinished jobs....

drivers/scsi/mpt3sas/mpt3sas_config.c: In function ‘mpt3sas_config_done’:

drivers/scsi/mpt3sas/mpt3sas_config.c:260: error: ‘USHRT_MAX’ undeclared (first use in this function)

drivers/scsi/mpt3sas/mpt3sas_config.c:260: error: (Each undeclared identifier is reported only once

drivers/scsi/mpt3sas/mpt3sas_config.c:260: error: for each function it appears in.)

make[3]: *** [drivers/scsi/mpt3sas/mpt3sas_config.o] Error 1

drivers/scsi/mpt3sas/mpt3sas_transport.c: In function ‘_transport_convert_phy_link_rate’:

drivers/scsi/mpt3sas/mpt3sas_transport.c:104: error: ‘SAS_LINK_RATE_12_0_GBPS’ undeclared (first use in this function)

drivers/scsi/mpt3sas/mpt3sas_transport.c:104: error: (Each undeclared identifier is reported only once

drivers/scsi/mpt3sas/mpt3sas_transport.c:104: error: for each function it appears in.)

make[3]: *** [drivers/scsi/mpt3sas/mpt3sas_transport.o] Error 1

make[2]: *** [drivers/scsi/mpt3sas] Error 2

make[1]: *** [drivers/scsi] Error 2

make: *** [drivers] Error 2


可以利用下面的命令来查找声明(头文件)和定义(.c文件)

grep -rnIw usleep_range --include='*.h' .

grep -rnlw usleep_range --include='*.c' .


最后我们一共修改了如下文件,再次编译,安装,重启机器,选择lvs内核,发现错误已经解决。

./include/linux/delay.h

./kernel/timer.c

./include/linux/kernel.h

./include/scsi/scsi_transport_sas.h

./drivers/scsi/scsi_transport_sas.c

原创粉丝点击