银河麒麟高级服务器操作系统V10SP2(X86)RAID卡驱动编译与系统集成实战

银河麒麟高级服务器操作系统V10SP2(X86)RAID卡驱动编译与系统集成实战
1. 环境准备与驱动编译基础在国产化服务器环境中更新RAID卡驱动首先要确保基础环境配置正确。我遇到过不少因为环境问题导致编译失败的案例这里分享几个关键检查点。操作系统版本确认是第一步。银河麒麟V10SP2的X86架构和ARM架构驱动包不通用务必用以下命令核对nkvers典型输出应包含类似信息############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Sword) Kernel: 4.19.90-24.4.v2101.ky10.x86_64 Build: Kylin Linux Advanced Server release V10 (SP2)/(Sword)-x86_64-Build09/20210524开发工具链安装常被忽略。实测中发现缺gcc、make、kernel-devel等组件会导致编译脚本报错yum install -y gcc make kernel-devel-$(uname -r) rpm-build特别注意kernel-devel版本必须与当前运行内核完全一致否则会出现头文件不匹配问题。驱动源码包通常有两种获取方式官方提供的压缩包如07.726.02.00-1_Driver_Linux.tgz厂商提供的SRPM源码包解压时要注意目录结构。有次我遇到编译失败最后发现是解压时用了绝对路径导致权限问题。建议这样操作mkdir -p ~/raid_driver cd ~/raid_driver tar xf 07.726.02.00-1_Driver_Linux.tgz tar xf megaraid_sas-07.726.02.00-src.tar.gz2. 驱动编译实战与问题排查进入解压后的目录你会看到几个关键文件compile.sh自动化编译脚本Makefile手动编译配置.c源文件驱动核心代码自动化编译是最简单的方式./compile.sh但这里有个坑脚本可能会报clean.sh not found错误。这是脚本编写不严谨导致的不影响实际编译。可以手动执行make -C /lib/modules/$(uname -r)/build M$(pwd) modules编译常见错误处理经验报错Invalid module format检查kernel-devel版本是否匹配报错implicit declaration of function可能是内核API变更需要修改源码报错missing header files安装对应内核头文件包编译成功后用modinfo验证生成的.ko文件modinfo ./megaraid_sas.ko | grep version正确输出应显示新驱动版本号如version: 07.726.02.00。3. 驱动打包与系统集成生产环境更推荐使用RPM包管理驱动。这里分享两种打包方法方法一直接制作RPM包mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} cp megaraid_sas.ko ~/rpmbuild/SOURCES/ # 编写spec文件示例模板见下文 rpmbuild -bb megaraid_sas.spec典型spec文件内容Name: megaraid_sas Version: 07.726.02.00 Release: 1%{?dist} Summary: MegaRAID SAS Driver License: GPLv2 URL: http://www.broadcom.com Source0: megaraid_sas.ko %description Broadcom MegaRAID SAS Driver for Kylin V10SP2 %install mkdir -p %{buildroot}/lib/modules/%{kernel_version}/kernel/drivers/scsi/megaraid install -m 755 %{SOURCE0} %{buildroot}/lib/modules/%{kernel_version}/kernel/drivers/scsi/megaraid/ %post /sbin/depmod -a %files /lib/modules/%{kernel_version}/kernel/drivers/scsi/megaraid/*方法二手动替换驱动适合快速测试# 压缩驱动文件 xz -z megaraid_sas.ko # 备份旧驱动 mkdir -p /root/driver_backup mv /lib/modules/$(uname -r)/kernel/drivers/scsi/megaraid/megaraid_sas.ko.xz /root/driver_backup/ # 安装新驱动 cp megaraid_sas.ko.xz /lib/modules/$(uname -r)/kernel/drivers/scsi/megaraid/4. 系统镜像更新与验证驱动替换后必须更新initramfs否则重启后驱动不会加载dracut --force --kver $(uname -r)这个命令我踩过坑如果漏掉--kver参数可能会更新错误内核版本的镜像。最后更新模块依赖关系depmod -a验证步骤检查驱动版本modinfo megaraid_sas | grep -E ^version|filename加载测试modprobe -r megaraid_sas modprobe megaraid_sas dmesg | grep megaraid重启后检查journalctl -b | grep megaraid遇到启动失败时可以进入救援模式从备份恢复驱动cp /root/driver_backup/megaraid_sas.ko.xz /lib/modules/$(uname -r)/kernel/drivers/scsi/megaraid/ dracut --force --kver $(uname -r)