简介:成都海光网卡驱动安装包面向服务器运维、系统集成与网络工程师,专用于海光平台网卡在操作系统中的识别与驱动部署。该驱动包基于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.4,UOS则可能用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.gz:
tar 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成功还不够,重启后模块可能丢失。先更新模块依赖和initramfs:
depmod -a dracut --force在RHEL/CentOS 7上有时也建议执行mkinitrd,但dracut基本都能用。如果你使用的是国产系统基于dpkg的变体,对应工具是update-initramfs -u。
为了更稳,可以在/etc/modprobe.d/里写一个配置,比如hygon-igb.conf:
alias eth0 igb options igb InterruptThrottleRate=1,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_CONTROLLED=no。
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_CPUS=3c之类,或者直接关闭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.4Gbps(10G线速上限)。这个坑特别隐蔽,因为网卡状态显示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,导致拿错了驱动包。记录这件事看似不起眼,关键时刻能省下半天时间。
本文还有配套的精品资源,点击获取