ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

海光平台网卡驱动安装指南:从lspci识别到DKMS编译与性能调优

海光平台网卡驱动安装指南:从lspci识别到DKMS编译与性能调优 简介成都海光网卡驱动安装包是一套适用于海光网卡硬件的驱动源码包主要面向Linux环境下需要使用该网卡的运维工程师、驱动开发人员以及内核学习爱好者能够解决系统默认驱动缺失、网卡不能被正确识别或无法充分发挥性能等问题。压缩包共22个文件总体积约146KB以C语言源文件为主14个.c配合3个头文件、Makefile和Shell脚本构成了从编译到安装的完整驱动工程其中readme和txt说明文件有助于快速上手。通过阅读源码可以深入理解网卡驱动的初始化、数据收发、中断处理等关键逻辑借助Makefile和脚本可便捷完成环境配置与编译安装。已有648人学习浏览对于需要部署海光网卡或进行驱动二次开发的读者这套轻量级源码包具备直接参考价值。1. 在成都海光平台装网卡驱动第一步不是下载安装包而是搞清楚驱动归谁管在成都海光平台服务器上装网卡驱动很多人第一反应是去搜“海光网卡驱动安装包”然后随便找一个包下载双击结果网卡要么认不出来要么装完速率起不来。我的建议刚好相反先别急着找安装包先用 lspci 看清楚机器上到底插的是谁家的网卡芯片。海光的 CPU 不产网卡网卡驱动归芯片原厂管安装包只是最后一步。海光平台服务器上常见的网卡分成两类板载网卡一般是瑞昱 RTL8111/8168、Intel I210/I219 这类千兆芯片独立网卡则常见 Intel 82599、Mellanox CX 系列这些万兆/25G 芯片。它们的驱动来源完全不同安装包的名字和编译方式也完全不一样。这篇文章就顺着这条链路拆开讲怎么判断驱动归属、Linux 和 Windows 两条路怎么装、装完怎么调参数以及我在海光平台上踩过的几个坑。适合读这篇文章的是手里正好有一台海光 C86-3GOPN 3350或者类似平台的机器装了麒麟 V10、统信 UOS 或者 Windows Server正准备把网络环境跑起来的人。新手可以照着命令敲熟手可以直接跳到第 4 章的坑清单和第 5 章的多队列调优。2. Linux 下装海光平台网卡驱动先看内核自带驱动再决定要不要编译原厂包在 Linux 上装海光平台网卡驱动核心逻辑只有一个绝大多数网卡驱动已经被编进内核或者以模块随发行版发布了你要做的是“确认它加载了没有”而不是“把它装上去”。跑到海光官网驱动下载页面找网卡驱动多半是徒劳因为那个页面里放的是平台工具、整机资源这类东西网卡驱动的最终来源在芯片原厂或板卡厂商。下面按顺序做三件事。2.1 装驱动前花三分钟确认网卡型号和驱动状态lspci 与 ethtool判断网卡驱动是否已经被内核接管不需要装任何软件两条命令就能看清。# 1. 列出所有 PCI 网卡设备及正在使用的内核驱动模块 lspci -nnk | grep -iA3 ethernet # 输出示例 # 03:00.0 Ethernet controller [0200]: Intel Corporation 82599ES 10-Gigabit SFI/SFP [8086:10fb] # Subsystem: Intel Corporation Device [8086:0003] # Kernel driver in use: ixgbe # Kernel modules: ixgbe # 2. 看网卡当前是否被系统识别识别名是 eth0 还是 enp3s0 ip link # 3. 确认当前驱动版本和固件版本 ethtool -i enp3s0 # driver: ixgbe # version: 5.1.0-k # firmware-version: 0x800003b1这里-nn显示厂商和设备 ID-k显示对应的内核驱动模块。输出里出现Kernel driver in use: r8169、igb、ixgbe、mlx5_core这些字样说明驱动已经在跑接下来只需要配 IP不需要装任何东西。ethtool -i告诉你当前驱动的版本和固件版本这是后面判断“要不要升级驱动”的依据。如果lspci -k里只有Kernel modules没有Kernel driver in use说明驱动模块存在但没能绑定设备多半是固件缺失或模块加载失败。这时候去看 dmesg而不是急着下安装包。2.2 能用内核自带驱动就别编译原厂包麒麟 V10 的 nmcli 配置先给结论内核自带的 r8169、igb、ixgbe、mlx5_core 这些驱动对 90% 的板载网卡和大多数 Intel 万兆卡都够用。麒麟 V10 和统信 UOS 都是 Debian 系内核 4.19/5.10 里这几个驱动都是现成的。Debian 系发行版也一样比如你在 Debian 上装 Intel Killer E5000 网卡内核里对应的是 igc 驱动也不用去 Intel 官网下包关键是先确认在跑的是哪个驱动。系统识别到网卡以后配置 IP 用 nmcli 就够了麒麟 V10 默认带 NetworkManager。# 查看当前所有网卡设备状态 nmcli device status # DEVICE TYPE STATE CONNECTION # enp3s0 ethernet disconnected -- # 创建静态 IP 连接配置并启用 nmcli connection add con-name eth0-static type ethernet ifname enp3s0 \ ipv4.method manual ipv4.addresses 192.168.10.2/24 \ ipv4.gateway 192.168.10.1 ipv4.dns 192.168.10.1 nmcli connection up eth0-staticcon-name是连接配置名ifname是物理网卡名ipv4.method manual表示静态地址。注意麒麟 V10 的网卡命名一般是 enpXsY 这种 predictable 命名方式别想当然写成 eth0。ipv4.dns可以写多个用空格分隔。配置完以后ip addr show enp3s0能直接看到地址生效。还有一种情况lspci -k没有显示 driver in use但 dmesg 里能看到固件加载失败。这是 Debian 系最常见的“假性网卡驱动问题”内核里有驱动模块但对应的 firmware 文件没装。解决方式很直接# Debian/麒麟系补固件最省事的做法 apt install firmware-realtek firmware-linux-nonfree # 装完重新加载驱动模块以 r8169 为例 modprobe -r r8169 modprobe r8169很多“网卡驱动装不上”的工单最后查出来就是缺 firmware 包而不是驱动本身有问题。内核模块没绑定 PCI 设备之前先查固件再查模块最后才考虑编译原厂驱动。2.3 什么时候必须编译原厂驱动DKMS 方式装 Intel 82599 的 ixgbe原厂驱动不是必须装的。我一般只在三种情况下去找原厂包内核自带驱动对新网卡识别不完整比如千兆卡协商出来只有百兆需要原厂驱动才能暴露的特殊参数比如 RSS 多队列控制、DPDK 支持板卡厂商明确要求使用特定版本驱动。其余情况内核自带驱动更稳。以 Intel 82599 万兆网卡为例原厂驱动包是 ixgbe 源码正确做法是用 DKMS 管理而不是直接 make install。直接 make install 的驱动只装进当前内核目录下次升级内核就失效这在生产环境是事故。# 准备编译环境麒麟 V10 / Debian 系 apt install build-essential linux-headers-$(uname -r) dkms # 解压原厂驱动源码并进入 src 目录 tar xf ixgbe-*.tar.gz cd ixgbe-*/src # 用 dkms 注册把源码交给 dkms 管理 # 先写 dkms.conf echo MAKEmake -C src/ dkms.conf echo CLEANmake -C src/ clean dkms.conf echo BUILT_MODULE_NAMEixgbe dkms.conf echo DEST_MODULE_LOCATION/kernel/drivers/net/ethernet/intel dkms.conf echo PACKAGE_NAMEixgbe-dkms dkms.conf echo PACKAGE_VERSION5.19.6 dkms.conf echo REMAKE_INITRDyes dkms.conf echo AUTOINSTALLyes dkms.conf # 回到源码根目录后交给 dkms 构建 cd .. dkms add . dkms build -m ixgbe-dkms -v 5.19.6 dkms install -m ixgbe-dkms -v 5.19.6 # 加载模块并验证 modprobe ixgbe ethtool -i enp3s0dkms add把源码注册进 DKMS 系统dkms build为当前内核编译dkms install安装到当前内核模块目录。AUTOINSTALLyes是 DKMS 自动为新内核重建模块的开关下次 apt 升级内核后不用手动干预。编译失败时先看两处/var/log/dkms.log里的具体报错以及linux-headers-$(uname -r)版本是否和当前内核完全一致。headers 版本对不上是所有源码编译失败里最常见的翻车原因没有之一。3. Windows 下装海光平台网卡驱动从设备管理器到三层参数Windows 下的场景一般是海光工作站或台式机装 Windows Server 2022 或者 Windows 10/11拿来跑办公、虚拟化或者设计软件。相比 LinuxWindows 下驱动安装包反而更好找整机厂商基本都提供海光 Windows 驱动下载入口在某些整机品牌的支持页面里也有汇总。问题是装包简单装完不会调参数的人很多。3.1 驱动安装包的两个可靠来源和一个错误来源Windows 下装网卡驱动可靠来源按优先级排第一是整机厂商的支持页面按机器序列号或型号下载比如手里这台海光 C86-3G 整机厂商通常会把网卡、芯片组、显卡驱动打包在一起一次装齐。第二是网卡芯片原厂的支持页比如 Realtek 官网的 PCIe GbE 驱动、Intel 官网的网卡驱动这些包版本新但只包含网卡驱动。海光官网驱动下载入口值得看一眼但它的定位是平台级资源网卡驱动往往还是引导你去整机厂商或芯片原厂拿。要避免的错误来源是各类驱动精灵、万能网卡驱动装包工具。在国产平台上它们经常识别错硬件型号装进去错误的驱动版本导致蓝屏而且这类工具捆绑的东西太多生产机器上不值得冒这个险。Windows 下安装驱动本身没什么技巧设备管理器里看到黄色感叹号的“以太网控制器”右键更新驱动指向解压好的驱动目录即可。带 setup.exe 的安装包更省事但装之前最好把旧驱动卸载干净避免新旧版本驱动文件混在一起。以下是几种常见网卡芯片在 Windows 设备管理器里的名字方便你在安装包解压后对号入座芯片厂商设备管理器里显示的名字Realtek RTL8111/8168Realtek PCIe GbE Family ControllerIntel I210/I219Intel(R) Ethernet Connection I217/I210/I219Intel 82599Intel(R) Ethernet 10G 2P X520/X540Mellanox ConnectX 系列Mellanox ConnectX-4/5/6/7 ...如果设备管理器里从来没有出现过这些名字说明网卡设备本身就没被系统认到这时候先别急着装驱动去 BIOS 里看板载 LAN 是不是被关了或者 PCIe 槽位是不是没插好。3.2 装完必须调的三个网卡参数EEE、巨帧、RSS 队列驱动装好能上网只是及格线。在国产平台上跑内网传输、虚拟机或者高性能计算至少要把网卡属性里的这几个参数过一遍。这些参数全部藏在“网络适配器属性 → 高级”选项卡里。每个厂商的驱动对参数命名不完全一致但功能是同一回事。参数建议值原因Energy Efficient Ethernet / 节能以太网DisabledEEE 开启时链路空闲降速流量恢复时重新协商延迟抖动明显Jumbo Frame / 巨型帧9014 或 4088内网大数据块传输吞吐更高但交换机也要同步开启否则丢包Receive Buffers / Transmit Buffers调到最大或次大默认值低突发流量直接掉包RSS Queues / Receive Side Scaling4 或 8单队列时大流量下载打满单核 CPU软中断占用过高Wake on Magic PacketDisabled生产机器避免意外唤醒也有助于降低网卡待机功耗这些参数在 AMD/Intel 平台上百试不爽在海光平台上同样适用因为网卡芯片和驱动的行为与 CPU 厂商无关。调参数有个注意点改完参数后最好在设备管理器里禁用再启用一次网卡确保驱动重新加载参数然后再跑测速。如果找不到 RSS 队列选项说明当前驱动版本太老或者用的是系统默认驱动去芯片原厂装一次新驱动就有这个选项了。3.3 Windows 下“未知设备”和“代码 56”怎么排查Windows 下海光平台网卡驱动装不上翻来覆去就是三个现象。第一种是设备管理器里一直是“以太网控制器”带黄色感叹号驱动包装了但就绪不了这基本是驱动数字签名问题或者厂商的签名证书在当前系统里不受信任。解决方法是设置 → 系统 → 恢复 → 高级启动重启后选择“禁用驱动程序强制签名”再装一次或者把厂商证书导入系统“受信任的发布者”存储区。第二种是驱动装完显示“该设备无法启动代码 56”这通常是上一版驱动残留或者 PCI 资源冲突。解决方法是设备管理器里卸载设备时勾上“删除此设备的驱动程序软件”重启后再装。第三种现象很容易误判装了 VirtualBox 之后物理网卡突然消失设备管理器里多了个 VirtualBox Host-Only Network。这不是网卡驱动坏了是 VirtualBox 安装时把虚拟网卡排在物理网卡前面加上 Windows 的网络适配器排序逻辑导致物理网卡被暂时挂起。去网络连接里看真实网卡是不是被禁用重新启用即可不需要重装任何驱动。这类“驱动突然没了”的报障八成是软件装出来的副作用而不是驱动本身的问题。4. 海光网卡驱动安装的五个翻车现场现象、原因、解法下面这些坑有的是我在海光平台上反复踩过的有的是同行在信创服务器上遇到后总结出来的。按“现象 → 原因 → 解决”写其中第 4 条和第 5 条属于玄学重灾区排查完你会觉得网卡驱动终于从黑匣子变成了白盒。4.1 模块加载报“Unknown symbol”make install 明明成功了现象原厂驱动源码编译顺利通过make install 也提示完成但 modprobe 时报Unknown symbol网卡没出现在 ip link 里。原因驱动模块引用了内核里没有导出的符号。最常见的是 linux-headers 版本和当前运行内核不一致编译时头文件能对上运行时内核符号表对不上。其次是驱动源码版本对当前内核太老或太新。解决先uname -r确认当前内核版本再确认linux-headers-$(uname -r)装的是同一个版本。重装 headers 后重新编译。如果还报符号错误就换成发行版仓库里的 DKMS 包让 DKMS 自动处理内核版本匹配不要继续跟源码较劲。4.2 升级内核后网卡驱动一夜之间消失现象apt upgrade 升级内核后重启网卡没了回退到旧内核启动一切正常。原因当初驱动是用 make install 方式装的只装进了当前内核的 modules 目录。新内核没有对应模块又没有 dkms 自动重建驱动就消失了。解决安装原厂驱动时一律用 DKMS 注册。第 2.3 节写的就是标准流程。已经在跑生产环境的老机器可以把原厂驱动源码重新 dkms add 一次dkms install后重启验证。以后每次升级内核DKMS 的AUTOINSTALLyes会触发自动重建不会再出现一夜之间网卡消失的情况。4.3 Secure Boot 把模块拦在门外modprobe 直接拒绝现象麒麟 V10 预装的 UEFI 环境上驱动编译安装都没问题但 modprobe 时模块加载失败dmesg 里报Lockdown: module verification failed。原因UEFI Secure Boot 开启时内核拒绝加载没有签名的内核模块。很多信创整机出厂默认开启 Secure Boot而板卡厂商给的驱动包很少做签名。解决两个办法二选一。测试环境直接进 BIOS 关 Secure Boot最快最省事。生产环境更稳妥的做法是 MOK 签名用mokutil --import导入自生成的模块签名密钥重启后按提示确认。MOK 方式不用动 BIOS升级内核后重新签名一次即可适合不允许动 BIOS 的机房环境。4.4 速率起不来、频繁断流先查 ASPM 和 EEE别迷信换驱动现象原厂驱动装好后协商速率正常但大流量复制文件时速度掉到几十 MB/s或者延迟偶尔飙高。换了三个版本的驱动都是同一个德行。原因PCIe 电源管理 ASPM 和节能以太网 EEE 在链路空闲时降速流量一上来又要重新协商导致吞吐抖动。这属于电源管理层的玄学再好的驱动也救不了因为问题根本不在驱动。解决BIOS 里把 PCIe ASPM 设为 Disabled 或者 L0s only网卡驱动侧用ethtool --ethtool -s eth0 wol d关闭唤醒确认 EEE 关闭。改完之后ethtool eth0看 Speed 和 Duplicate 是否稳定在满速率状态跑一次 iperf3 验证吞吐不再抖动。这个坑最容易让人走弯路因为症状像驱动问题其实是电源管理在捣乱。4.5 Mellanox/CX 系列固件和驱动版本必须配对否则只能干瞪眼现象插上 CX7 网卡系统识别了 PCI 设备但 mlx5_core 驱动加载失败或者驱动装完链路就是 up 不了。查固件版本会发现还是出厂老固件。原因Mellanox 网卡的固件和驱动是配套的。驱动版本太新而固件太旧或者反过来都会导致加载异常。像 MLNX_OFED 5.8-3.0.7.0-lts 这种 LTS 版本包自带一组匹配的固件要求不满足就直接罢工。解决先到官网下载对应网卡型号的固件工具和固件包手动把固件刷到驱动要求的版本范围再装 MLNX_OFED 驱动。装完重启后用mlxlink确认 link 状态用mlx_fwreset确认固件版本别跳过刷固件这一步直接装驱动省不掉。5. 进阶从“驱动能装上”到“万兆跑满”——队列、中断和验证5.1 多队列和中断绑定海光多 NUMA 下的关键操作双路海光平台有一个容易忽视的细节PCIe 网卡落在哪个 NUMA node 上中断就应该绑到那个 node 的 CPU 上。否则跨 NUMA 访问内存万兆线速跑不满。# 查看网卡所在 NUMA node cat /sys/bus/pci/devices/$(ethtool -i enp3s0 | awk /bus-info/{print $2})/numa_node # 打开 8 个 RSS 队列 ethtool -L enp3s0 combined 8 # 查看中断分布 grep enp3s0 /proc/interrupts把每个中断号用echo CPU位掩码 /proc/irq/num/smp_affinity绑到同一 NUMA 节点上的 CPU 核心或者装 irqbalance 并配置成按 NUMA 拓扑分配都能看到软中断分布明显均匀化。5.2 给 ESXi 注入网卡驱动的思路海光平台装 ESXi 找不到网卡是常见问题因为 ESXi 镜像默认带的驱动有限尤其对瑞昱和部分国产网卡支持差。正确做法不是先装系统再想办法而是找网卡原厂发布的 ESXi VIB 离线包用esxcli software vib install注入驱动。如果机器里已经有正在跑的 ESXi直接在维护模式下安装 VIB如果是全新安装就用工具把 VIB 打进 ISO 再引导。5.3 验证驱动是不是真装对了三条命令一次打流驱动装完验证比安装更重要。我会按这个顺序检查ethtool -i看 driver 和 firmware 版本lspci -nnk确认 driver in useethtool -S看 rx_errors、tx_errors、rx_missed 这些计数器是否增长。全部干净之后再用 iperf3 打流双向各跑 60 秒确认吞吐稳定且 CPU 软中断没有集中在一个核上。一个习惯每次装完驱动把驱动安装包、固件包和当时的uname -r输出一起备份到/root/drivers-backup标注好日期。下次升级内核或者换机器重装直接翻备份不用再全网找包。这个习惯帮我躲过好几次“驱动包官网下架”的尴尬也希望帮到你。本文还有配套的精品资源点击获取
返回列表