海光平台网卡驱动安装包选型与编译避坑指南 📅 发布时间:2026/9/2 1:20:25 👁 浏览次数: 简介成都海光网卡驱动安装包面向服务器运维、系统集成与网络工程师专用于海光平台网卡在操作系统中的识别与驱动部署。该驱动包基于XGbE万兆以太网设计包含驱动源码、编译脚本与说明文档适用于需要自行编译加载驱动的Linux类环境。压缩包共22个文件以C源文件14个和头文件3个为主体辅以Makefile、mk配置、shell安装脚本及readme说明方便用户查看驱动实现、修改编译参数并完成安装。包体仅146KB结构精简适合快速分发与部署。当前已有589人学习/下载对于接触海光平台或国产化硬件适配的开发者具有一定参考价值。通过分析源码与配置脚本读者可以理解网卡驱动的加载流程、参数调整方式以及常见编译排错思路为后续集成或二次开发提供基础。 很多运维朋友第一次接触海光服务器时习惯性去Intel官网下载一个igb/ixgbe驱动包然后在系统里make install结果往往卡在编译错误或者模块加载失败。这时候才想起手里那个名为“成都海光网卡驱动安装包”的文件打开一看里面还有一堆rpm和firmware又不确定该用哪个。这篇文章就围绕这个安装包的使用把海光平台网卡驱动的选型、安装、调优和避坑一次讲透。我在过去三年里给客户交付过不下五十台海光平台的机器几乎每台都折腾过网卡驱动。今天分享的这些操作和教训都来自真实的生产环境不是照抄README的整理版。不管你是要在一台新机器上装驱动还是要把旧系统迁移到新盘上这篇内容都能给你参考。1. 海光平台网卡驱动的“原罪”为什么要单独找安装包1.1 海光CPU与普通x86的差异本质海光处理器的指令集与x86兼容这不假但驱动的兼容性远不止指令集。海光平台的内存控制器、PCIe Root Complex、中断控制器以及BMC固件与常见Intel平台不同这会影响驱动与内核的交互方式。很多网卡驱动在通过内核PCI子系统识别硬件时会读取vendor id、device id、subsystem id如果厂商的驱动版本没有包含海光平台的subsystem id驱动就会报“Device not found”或者“unrecognized device”。更隐蔽的是部分驱动使用了CPU特定的指令或对数据一致性的处理方式有差异在普通x86上正常在海光上却会偶发crash。因此“成都海光网卡驱动安装包”存在的意义就是把这些平台差异做进预编译模块或源码补丁里。你拿到的安装包往往不是原始上游驱动而是经过适配的版本比如在代码里添加了#ifdef CONFIG_CPU_HYGON之类的判断或是直接编译好的ko文件。建议拿到包后先看README或release notes确认支持的内核版本范围。1.2 安装包里藏着什么不是所有驱动都能直接yum install我把常见的安装包解压后里面的典型结构是这样的drv/ releasefile firmware/ // 网卡固件用来初始化PHY或光模块 rpm/ kmod-igb-hygon.x86_64.rpm compat-firmware-*.rpm src/ igb-5.7.2-hygon.tar.gz userguide/ install_guide.pdf注意src目录里的源码包通常包含了厂商补丁而rpm目录里的kmod包是为了特定内核版本编译的。如果你不管内核版本直接rpm -ivh kmod-igb-hygon.x86_64.rpm大概率会提示Failed dependencies因为模块依赖的kernel-devel版本和你的系统内核不一致。更麻烦的是预编译rpm安装后模块可能出现在/lib/modules/$(uname -r)/extra/下但depmod后加载时会报invalid module format这就是内核的vermagic不匹配导致的。所以在动手前有三件事必须做uname -r看内核版本rpm -q kernel-devel看开发包版本lspci -n | grep 02xx看网卡设备ID。这三项确定了后面才能不白折腾。2. 驱动安装包的选择先分清你的网卡型号和系统发行版2.1 网卡vendor与芯片组识别在拿到安装包之前先要确认这台服务器的网卡到底是什么芯片。最直接的办法是lspci | grep -i ethernet输出例如04:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection 04:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection如果看到的是Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]那就需要下载mlx5_core对应的驱动和固件。还要用ethtool -i eth0查看当前使用的驱动名称和固件版本ethtool -i eth0 driver: igb version: 5.7.2 firmware-version: 3.25, 0x800009c8这一步决定你该用哪个驱动包。很多同事会先问“有没有海光网卡驱动安装包”但网卡芯片可能是Intel、Mellanox、Broadcom甚至国产的万兆控制器不同芯片对应的驱动完全不一样。海光官方提供的安装包通常是一个集合包里面按网卡厂商分子目录所以你要找到对应的那一个。2.2 系统镜像与内核版本匹配海光服务器常用的系统有银河麒麟、统信UOS、中科方德以及CentOS 7的兼容版。这些系统的内核版本差距很大CentOS 7.x用3.10麒麟V10可能跑4.19或5.4UOS则可能用5.10。安装包一般会区分el7、el8、el9或者以kylin_v10、uos_20命名。如果拿错了发行版目录下的rpm轻则依赖冲突重则模块加载后网络服务起不来。一个小技巧是看安装包的文件名例如kmod-igb-5.7.2-hygon-1.el7_9.x86_64.rpm里的el7_9直接就能判断适合内核3.10的CentOS/麒麟V10兼容版。如果你系统内核是4.19就不要硬装这个rpm而应该去src目录下自己编译。2.3 两个“讲不清”的特殊点板载网卡序列与OEM定制海光服务器的板载网卡尤其是从服务器厂商订制的整机网卡的subsystem ID不会跟Intel原版完全一致。驱动安装脚本里有个白名单机制它会读取lspci -vvv里的Subsystem字段如果不在白名单里即使硬件一样也提示“unsupported subsystem”。遇到这种情况你别急着怀疑驱动坏了。可以先通过modinfo查看驱动支持的设备ID列表如果列表里确实没有就必须用厂商定制包。另一个特殊点是光口网卡。有些SFP网卡需要加载特定光模块的固件这些固件在linux-firmware里未必有对应版本。安装包里的firmware/目录就是干这个的。我见过有同事把固件目录漏拷结果网卡link up了但无法协商到10G甚至光模块报错。处理方式很简单把firmware目录下的所有文件复制到/usr/lib/firmware/然后删除驱动模块再重新加载。3. 实操全过程从拿到安装包到网卡正常亮起3.1 备份与依赖准备无论是装新驱动还是替换旧驱动都建议先备份现有模块mkdir -p /root/driver_bak cp -a /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/igb* /root/driver_bak/然后卸载旧驱动rmmod igb如果rmmod提示Module in use说明有网卡正在用这个驱动可以通过ip link set eth0 down后依次关闭或用modprobe -r强制卸载但小心断网。接着安装编译环境。海光平台的系统源里一般都有yum install -y gcc make kernel-devel kernel-headers必须确认kernel-devel的版本和uname -r完全一致。如果系统是麒麟V10可能还需要kernel-source包。查看rpm -q kernel-devel uname -r如果版本对不上优先去系统光盘的packages文件夹里找到匹配的rpm安装。很多时候安装失败不是源码问题就是缺少这个版本匹配。3.2 编译安装以Intel igb为例假设你的安装包里是igb-5.7.2-hygon.tar.gztar xzf igb-5.7.2-hygon.tar.gz cd igb-5.7.2-hygon/src make CFLAGS_EXTRA-DKERNEL_3_10 install这里加CFLAGS_EXTRA是因为海光的定制驱动可能会检查内核宏。不过具体参数要以README为准不要照抄这个示例。编译成功后会在/lib/modules/$(uname -r)/extra/igb/下生成igb.ko。执行depmod -a然后modprobe igb lsmod | grep igb这时ip link应该能看到网卡接口了。如果没看到先看dmesg | tail -30通常会有明确报错。3.3 加载模块与持久化只是modprobe成功还不够重启后模块可能丢失。先更新模块依赖和initramfsdepmod -a dracut --force在RHEL/CentOS 7上有时也建议执行mkinitrd但dracut基本都能用。如果你使用的是国产系统基于dpkg的变体对应工具是update-initramfs -u。为了更稳可以在/etc/modprobe.d/里写一个配置比如hygon-igb.confalias eth0 igb options igb InterruptThrottleRate1,1,1,1第一行是让内核在枚举PCI设备时自动绑定驱动第二行是中断节流参数这样重启后udev也能正确加载。但注意alias eth0有可能会影响接口命名如果系统使用一致网络设备命名如enp4s0就不要写alias直接用modprobe.conf设置options即可。最后重启验证reboot dmesg | grep igb ip addr show4. 安装后必须做的事丢包排查、cfg文件与BOOT启动顺序4.1 ethtool -S 看丢包与环形队列驱动装好只是开始真正的问题是性能是否正常。先看丢包计数ethtool -S eth0 | grep -Ei error|miss|drop重点关注rx_crc_errors、rx_missed、tx_timeout。在海光平台上rx_missed高发的原因往往是PCIe链路时钟或缓存一致性配置导致的而不是网卡本身不好。这时候用lspci -vvv -s 04:00.0 | grep LnkSta看链路状态LnkSta: Speed 8GT/s, Width x4如果速度只有5GT/s或2.5GT/s而网卡支持10G/25G说明PCIe协商有问题。在海光服务器的BIOS里可以找到PCIe速度设置尝试强制为Gen3或Gen4。注意改BIOS前先记录原配置并确认固件版本支持该网卡。环形队列大小也会直接影响丢包。ethtool -g eth0可以查看rx/tx的Ring buffer大小如果默认只有256建议调整ethtool -G eth0 rx 4096 tx 4096但这个调整是临时的要持久化可以用ethtool --set-priv-flags脚本或写入systemd服务。4.2 网卡配置文件与多队列调优现代网卡支持多队列使用前先看当前值ethtool -l eth0输出会显示Combined的当前值和最大值。比如最大8当前只有1那很不合适ethtool -L eth0 combined 4但这在海光平台有讲究。有些海光主板的板载网卡和PCIe交换机之间只支持2个MSI-X向量如果你强行设成4虽然命令不报错但实际吞吐反而下降。所以建议设置后立即用netperf或iperf3压测对比不同队列数的效果。多队列设置完成后最好同步调整每个队列的亲和性让中断尽量在这个网卡所在的NUMA节点上处理。网卡配置文件方面很多系统默认由NetworkManager管理网络。如果你习惯使用/etc/sysconfig/network-scripts/ifcfg-eth0记得关闭NetworkManager对该接口的管理否则重启后常常出现“设备未托管”的提示。或者在ifcfg文件里加NM_CONTROLLEDno。4.3 大页内存和IRQ绑定海光平台对PCIe设备的访问路径有自己的NUMA拓扑如果网卡插在CPU1的PCIe slot而irqbalance把中断调度到CPU0跨片访问会让延迟暴涨。先确定网卡所在NUMA节点cat /sys/class/net/eth0/device/numa_node假设输出是1那么在/etc/sysconfig/irqbalance里可以加上IRQBALANCE_BANNED_CPUS3c之类或者直接关闭irqbalance用脚本绑定。更常见的做法是查看中断号cat /proc/interrupts | grep eth0 | awk {print $1}对每个中断号将smp_affinity设置为该NUMA节点的CPU掩码echo 10 /proc/irq/76/smp_affinity这里10是十六进制掩码表示CPU2和CPU4对应第2、4个CPU。如果你的系统CPU编号是0,1,2,3为了简单可以使用echo 2 /proc/irq/76/smp_affinity_list其中2是CPU编号。需要把这些命令写成开机自启脚本否则重启后恢复原样。我习惯在/usr/local/sbin/nic_irq_bind.sh里写循环然后用systemd service管理。5. 踩坑实录我在海光服务器上栽过的三个跟头5.1 教训1拿普通x86通用包直接装结果编译报错某次交付客户用的是麒麟V10内核4.19。我图省事从Intel官网下了最新的igb驱动包解压后直接make。结果编译到一半报错error: implicit declaration of function ‘pci_set_drvdata’乍一看像是源码问题但我查了Intel官方文档这个函数在旧内核中一直存在为什么在麒麟上会报错后来发现海光定制内核把pci_set_drvdata挪到了新增的头文件里需要额外include。而海光提供的驱动包里已经包含这些修改普通包却没有。最后我用安装包src目录下的源码重新编译一路顺畅通过了。从此以后在海光平台我只用随设备附带的驱动包除非厂商公告说支持通用包。更保险的做法是把厂商源码包里的kcompat.h或kcompat_linux.h一起编译很多驱动都依赖这些兼容层。5.2 教训2忽略固件firmware网卡能起来但带宽上不去有台机器装了X520网卡识别正常配置了10G但iperf测试只有2Gbps。先是怀疑光纤或者交换机端口排除了之后看dmesg发现一条很不起眼的警告ixgbe 0000:03:00.0: failed to load firmware ixl/XXV710-1.63.37.cfg原来光口网卡的PHY需要固件来初始化generic内核firmware包里没有这个文件。这时我才想起安装包里有firmware/目录之前没拷贝。把整个目录复制到/usr/lib/firmware/然后modprobe -r ixgbe modprobe ixgbe再测iperf3就直接跑满9.4Gbps10G线速上限。这个坑特别隐蔽因为网卡状态显示Link是up的没有报致命错误很容易被忽略。建议任何涉及光口的网卡安装完驱动后先dmesg | grep -i firmware看一眼有没有固件加载失败。5.3 教训3国产OS内核签名机制导致模块加载失败在一次批量部署中我用安装包里的rpm装好驱动后modprobe igb一直失败错误信息是module verification failed: signature and/or required key missing。这不是海光特有的问题而是系统开启了Secure Boot同时内核配置了CONFIG_MODULE_SIG_FORCE。这种情况下不是把驱动扔进内核目录就能用必须对模块签名。最简单的方案是在BIOS里关闭Secure Boot但有些客户不允许关。那就得用mokutil方式签名需要生成MOK密钥并导入然后重新签名模块。这里提醒一下在国产系统上操作mokutil的路径可能不同而且某些定制BIOS的Security菜单是隐藏的要找厂商确认。如果你只是临时验证可以先执行mokutil --disable-validation但生产环境不建议长期关闭。具体签名流程官方文档有这里不再展开但希望读者记住驱动装不上的时候不一定是驱动本身问题很可能是签名机制拦住了。6. 给后来人整理安装包的小建议6.1 自建本地源与驱动仓库如果你要管几十台海光服务器每次都用U盘拷安装包效率太低。我建议在维护机上搭一个Nginx或HTTP服务把驱动包、内核rpm都放进去用createrepo生成Yum源客户端配置/etc/yum.repos.d/hygon-local.repo然后直接yum install kmod-igb-hygon就能完成部署。这样做还有一个好处依赖关系被Yum自动解析不用手动去找kernel-devel。6.2 结合官方渠道验证校验和从同事手里转来的“成都海光网卡驱动安装包”先别急着装。用md5sum或sha256sum比对一下官方支持网站公布的校验值。我曾经因为内部服务器上放着一个旧版本驱动包导致新扩展的一批机器网卡性能不一致查了两天才发现是版本混用。如果官方没有提供校验值至少记录下安装包的下载时间、大小和你使用的内核版本避免后面排错没有依据。6.3 记录驱动版本与硬件清单最后给个非常实用的经验在项目交付时把每台机器的情况记成一份清单列上“服务器型号、BIOS版本、网卡型号、PCIE地址、驱动包文件名、安装前内核版本、安装后内核版本、firmware版本”。以后不管做镜像、克隆还是扩容拿出这份清单就能直接决定用哪个安装包不用重新排查。我自己就曾因为没记录忘了某台机器的网卡其实是X710而不是I350导致拿错了驱动包。记录这件事看似不起眼关键时刻能省下半天时间。本文还有配套的精品资源点击获取