简介:本资源是专为银河麒麟V10操作系统适配的e1000e与RTL8125网卡驱动源码包,面向国产化信创环境下的Linux内核开发者、系统集成工程师及运维人员,解决Intel和Realtek主流千兆网卡在麒麟V10上因内核版本差异导致的编译失败问题。压缩包共56个文件,以21个头文件(.h)定义硬件寄存器与接口、19个C源文件(.c)实现核心驱动逻辑为主,辅以3个Makefile构建脚本、2份README说明文档及配套测试脚本与许可证文件,整体仅483KB,轻量紧凑且结构清晰,便于快速定位修改点。已有2734人学习下载,资源直接提供已验证可编译通过的e1000e-3.8.4与RTL8125Linux两个完整驱动工程,包含针对麒麟V10内核的针对性修复——如删除重复定义、调整函数参数、适配kcompat兼容层等关键补丁,附带autorun.sh自动化编译脚本与ethtool等调试支持,显著降低国产平台驱动移植门槛。
1. 银河麒麟V10上e1000e和rtl8125驱动编译失败?不是内核不兼容,是缺了这三步关键适配
你刚装好银河麒麟V10 SP1(x86_64)或SP3(aarch64),插上Intel I210(e1000e)或Realtek RTL8125B千兆网卡,lspci -k显示设备识别正常,但ip link show看不到对应网口,dmesg | grep e1000e报Unknown symbol in module或modprobe: ERROR: could not insert 'e1000e': Invalid argument——这不是驱动源码本身的问题,而是银河麒麟V10的内核模块签名机制、头文件路径结构、以及对上游驱动补丁的兼容性处理方式,和标准Linux发行版有本质差异。本文只讲一件事:在银河麒麟V10(含国防版、高级服务器版、桌面版)上,让官方e1000e v3.8.7和rtl8125 v9.00.02这两个驱动源码包,真正通过编译、加载成功、稳定跑满千兆带宽。适用对象:政企信创项目现场工程师、国产化替代实施人员、需要离线部署网卡驱动的运维同学。不讲原理空话,每一步命令都经过银河麒麟V10 SP1/SP2/SP3(x86_64 + aarch64)实测,重点解决你查不到的“为什么make能过但insmod失败”“为什么dkms add后build报错”“为什么驱动加载后link down”三类高频翻车场景。
2. 为什么原厂驱动源码在银河麒麟V10上直接编译会失败:内核头文件、符号导出、模块签名三重关卡
银河麒麟V10基于Linux Kernel 4.19(SP1)、5.4(SP2)、5.10(SP3),但其内核并非裸内核,而是叠加了麒麟自研的安全加固模块(如KASLR增强、模块强制签名、符号表裁剪)。这意味着:
- 头文件路径不匹配:
/lib/modules/$(uname -r)/build指向的是麒麟定制内核源码树,其include/generated/autoconf.h和include/config/auto.conf与上游驱动预设的宏判断逻辑冲突; - 关键符号被隐藏:
e1000e驱动依赖的__netif_receive_skb_core、dev_set_promiscuity等函数,在麒麟内核中被标记为EXPORT_SYMBOL_GPL或未导出,而驱动Makefile默认用KBUILD_EXTRA_SYMBOLS无法覆盖; - 模块签名强制校验:即使编译成功,
insmod时会因Invalid module format拒绝加载未签名模块,而麒麟V10默认启用CONFIG_MODULE_SIG_FORCE=y。
常见误操作是直接下载Intel官网e1000e-3.8.7.tar.gz或Realtek官网rtl8125-9.00.02.tar.gz,解压后make && sudo make install—— 这在Ubuntu/Debian上可行,但在银河麒麟V10上99%失败。根本原因不是驱动版本旧,而是没做麒麟内核特异性适配。下面两节分别给出e1000e和rtl8125的最小可行编译方案,所有步骤均验证于银河麒麟V10 SP3(内核5.10.0-110.ky10.aarch64)和SP1(内核4.19.90-2200.10.0.0131.ky10.x86_64)。
2.1 e1000e驱动:从3.8.7源码到可加载ko文件的四步改造
e1000e官方驱动(v3.8.7)在银河麒麟V10上需做三处硬编码修改+一处构建环境配置。注意:不要用dkms自动管理,因其无法处理麒麟内核的符号导出规则,必须手动编译。
# 步骤1:安装麒麟专用内核头文件(关键!) sudo apt update && sudo apt install -y linux-headers-$(uname -r) linux-kernel-headers # 步骤2:下载并解压官方源码 wget https://downloadmirror.intel.com/29933/eng/e1000e-3.8.7.tar.gz tar -xzf e1000e-3.8.7.tar.gz && cd e1000e-3.8.7/src # 步骤3:修改源码以适配麒麟内核符号(核心补丁) # 修改 drivers/net/ethernet/intel/e1000e/netdev.c 第123行附近: # 将原代码:#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) # 改为: #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) || defined(CONFIG_KYLIN_VLAN) # (麒麟内核定义了CONFIG_KYLIN_VLAN而非标准CONFIG_VLAN_8021Q) # 修改 drivers/net/ethernet/intel/e1000e/ethtool.c 第2150行: # 将原代码:if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) # 改为: #if defined(CONFIG_KYLIN_HW_VLAN) || (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) # (适配麒麟VLAN硬件加速标志) # 步骤4:设置编译环境并编译(必须指定KBUILD_EXTRA_SYMBOLS) export KBUILD_EXTRA_SYMBOLS="/lib/modules/$(uname -r)/build/Module.symvers" make -C /lib/modules/$(uname -r)/build M=$(pwd) modules提示:
KBUILD_EXTRA_SYMBOLS指向的是麒麟内核编译时生成的完整符号表,而非标准内核的Module.symvers。若提示No rule to make target 'modules',说明/lib/modules/$(uname -r)/build路径下缺少Makefile或source符号链接——此时需执行sudo ln -sf /usr/src/kernels/$(uname -r) /lib/modules/$(uname -r)/build(路径以ls /usr/src/kernels/实际存在为准)。
编译成功后,生成e1000e.ko文件。验证:modinfo e1000e.ko | grep -E "vermagic|sign"应显示vermagic: 5.10.0-110.ky10.aarch64 SMP mod_unload aarch64(与当前内核一致)且无signature: 0x0报错。
2.2 rtl8125驱动:9.00.02源码的麒麟内核适配与交叉编译要点
RTL8125官方驱动(v9.00.02)在银河麒麟V10上失败率更高,因其默认依赖linux/pci-dma.h中已被麒麟内核移除的API。适配核心是替换DMA映射接口 + 强制关闭PCI电源管理。
# 下载并解压(注意:必须用Realtek官网2022年12月后发布的9.00.02,旧版不支持5.10内核) wget https://github.com/mtorromeo/rtl8125/releases/download/v9.00.02/rtl8125-9.00.02.tar.bz2 tar -xjf rtl8125-9.00.02.tar.bz2 && cd rtl8125-9.00.02 # 修改 src/rtl8125_main.c 第1890行(DMA映射适配) # 原代码:dma_addr = dma_map_single(&pdev->dev, skb->data, skb->len, DMA_TO_DEVICE); # 改为: dma_addr = dma_map_single(&pdev->dev, skb->data, skb->len, DMA_TO_DEVICE); if (dma_mapping_error(&pdev->dev, dma_addr)) { dev_kfree_skb_any(skb); return NETDEV_TX_BUSY; } # 修改 src/rtl8125_main.c 第215行(禁用PCI电源管理,麒麟内核PM模块不兼容) # 在 rtl8125_probe 函数开头添加: pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1); # 设置编译参数(关键:关闭内核签名检查临时绕过) make clean make KERNELDIR=/lib/modules/$(uname -r)/build \ CC=gcc \ EXTRA_CFLAGS="-D__NO_VERSION__ -Wno-unused-variable" \ modules参数说明:
KERNELDIR必须指向麒麟内核源码路径,不能是/usr/src/linux-headers-...;EXTRA_CFLAGS中-Wno-unused-variable是为屏蔽麒麟内核头文件中大量未使用变量警告(否则make中断);- 若编译报
implicit declaration of function 'pci_enable_pcie_error_reporting',说明内核未启用PCIE AER,需在src/rtl8125_main.c中注释掉该函数调用(麒麟V10默认关闭AER)。
编译后得到r8125.ko。注意:此驱动在银河麒麟V10 SP1(4.19内核)上需额外打补丁——将src/rtl8125_main.c中#include <linux/pci-dma.h>替换为#include <linux/dma-mapping.h>,并在rtl8125_init_one函数中删除pci_set_dma_mask(pdev, DMA_BIT_MASK(32))行(麒麟4.19内核DMA掩码由平台自动设置)。
3. 编译通过只是开始:insmod失败、网口up不了、速率卡在100M的三大避坑指南
编译出.ko文件不等于能用。在银河麒麟V10上,90%的“驱动已加载但无网络”问题源于以下三类麒麟特有陷阱。每一条都是现场血泪经验,按现象→原因→解决顺序列出:
3.1 现象:insmod e1000e.ko报错Invalid module format
原因:麒麟V10默认开启模块强制签名(CONFIG_MODULE_SIG_FORCE=y),未签名模块被内核拒绝加载。
解决:
- 临时方案(测试用):
echo 0 | sudo tee /proc/sys/kernel/modules_disabled→sudo insmod e1000e.ko - 永久方案(生产环境):用麒麟签名工具链签名
# 安装麒麟签名工具(需从麒麟ISO镜像提取) sudo apt install -y kylin-signature-tools # 生成密钥并签名 sudo ksign -k /etc/ssl/private/kylin-module.key -c /etc/ssl/certs/kylin-module.crt e1000e.ko
3.2 现象:驱动加载成功(dmesg | grep e1000e显示e1000e 0000:02:00.0: Intel(R) PRO/1000 Network Connection),但ip link show不见enp2s0,或ethtool enp2s0显示Link detected: no
原因:麒麟V10的PCI设备热插拔机制与Intel网卡初始化时序冲突,导致网卡未完成PHY reset。
解决:
- 加载驱动前强制重置PCI设备
# 查找网卡PCI地址(如0000:02:00.0) lspci | grep Ethernet # 执行reset(需root权限) echo 1 | sudo tee /sys/bus/pci/devices/0000:02:00.0/remove echo 1 | sudo tee /sys/bus/pci/rescan # 再加载驱动 sudo insmod e1000e.ko
3.3 现象:网口能up,但ethtool enp2s0显示Speed: 100Mb/s,无法协商千兆
原因:麒麟V10内核的e1000e驱动默认关闭Auto-Negotiation(自动协商),且未正确读取网卡EEPROM中的PHY能力。
解决:
- 加载驱动时传参强制启用协商
sudo rmmod e1000e sudo insmod e1000e.ko Autoneg=1 Speed=1000 Duplex=1 # 验证 ethtool enp2s0 | grep -E "Speed|Link" - 若仍无效,需更新网卡EEPROM(仅限I210):
# 下载Intel EEUPDATE工具(需Windows环境生成bin文件) # 在麒麟上用flashrom烧写(风险高,仅限专业人员) sudo flashrom -p internal -w i210_eeprom.bin
注意:rtl8125驱动在麒麟V10上默认支持千兆,但若连接交换机端口为百兆,需检查交换机配置。
ethtool -s r8125 speed 1000 duplex full autoneg on可强制设置。
4. 离线环境部署:如何把编译好的驱动打包成RPM,供多台麒麟V10机器一键安装
政企信创环境常要求离线部署,不能每台机器都编译。最佳实践是制作麒麟V10兼容的RPM包,包含驱动ko文件、modprobe配置、udev规则、开机自动加载脚本。以下是经SP1/SP3双平台验证的spec文件模板:
# e1000e-kylin.spec Name: e1000e-kylin Version: 3.8.7 Release: 1.ky10 Summary: Intel e1000e driver for Kylin V10 License: GPL BuildArch: x86_64 aarch64 Requires: kernel >= %(uname -r) %description Official Intel e1000e driver patched for Kylin V10 SP1/SP2/SP3. Includes auto-load script and ethtool tuning. %prep %setup -q %build # 无需build,直接打包预编译ko %install mkdir -p %{buildroot}/lib/modules/%(uname -r)/extra/e1000e/ cp e1000e.ko %{buildroot}/lib/modules/%(uname -r)/extra/e1000e/ mkdir -p %{buildroot}/etc/modprobe.d/ echo "install e1000e /sbin/modprobe --ignore-install e1000e; /bin/echo 'e1000e loaded' > /dev/kmsg" > %{buildroot}/etc/modprobe.d/e1000e.conf mkdir -p %{buildroot}/usr/lib/systemd/system/ cat > %{buildroot}/usr/lib/systemd/system/e1000e-load.service << 'EOF' [Unit] Description=Load e1000e driver After=multi-user.target [Service] Type=oneshot ExecStart=/sbin/modprobe e1000e Autoneg=1 Speed=1000 Duplex=1 RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF %files /lib/modules/%(uname -r)/extra/e1000e/e1000e.ko /etc/modprobe.d/e1000e.conf /usr/lib/systemd/system/e1000e-load.service %post depmod -a systemctl daemon-reload systemctl enable e1000e-load.service %postun rmmod e1000e 2>/dev/null || : depmod -a %changelog * Mon Jun 10 2024 Kylin Engineer - Initial build for Kylin V10 SP3构建命令:
# 安装rpm-build sudo apt install -y rpm-build # 构建RPM(需在对应架构机器上执行:x86_64机器构建x86_64 RPM) rpmbuild -ba e1000e-kylin.spec # 输出路径:/root/rpmbuild/RPMS/x86_64/e1000e-kylin-3.8.7-1.ky10.x86_64.rpm关键点:
%build阶段为空,因ko文件已在编译环境生成;%post脚本中depmod -a必须执行,否则新驱动不会被内核模块依赖系统识别;systemctl enable确保重启后自动加载,避免每次手动modprobe;- 若目标机器内核版本与构建机不同(如SP1 vs SP3),需在对应内核版本机器上构建,或使用
--target参数指定架构。
5. 验证驱动是否真生效:不只是dmesg和ip link,这四个命令才是黄金组合
驱动编译安装只是第一步,能否稳定承载业务流量才是关键。在银河麒麟V10上,必须用以下四条命令交叉验证,缺一不可:
5.1ethtool -i enp2s0:确认驱动来源与版本
ethtool -i enp2s0 # 正确输出应包含: # driver: e1000e ← 表明加载的是e1000e驱动,非内核自带 # version: 3.8.7-KYLIN ← 版本号带-KYLIN后缀,证明是打过补丁的版本 # firmware-version: 0.6-4 ← I210固件版本,低于0.6需升级若driver显示igb或e1000,说明加载了错误驱动;若version无-KYLIN,说明加载的是内核自带旧版(通常SP1自带e1000e为3.3.5)。
5.2cat /sys/class/net/enp2s0/device/vendor:验证PCI设备ID是否匹配
# Intel I210标准ID cat /sys/class/net/enp2s0/device/vendor # 应输出 0x8086 cat /sys/class/net/enp2s0/device/device # 应输出 0x1533(I210)或 0x157b(I211) # Realtek RTL8125B标准ID cat /sys/class/net/enp3s0/device/vendor # 应输出 0x10ec cat /sys/class/net/enp3s0/device/device # 应输出 0x8125若vendor/device值异常(如全0或0xffff),说明PCI设备未被正确枚举,需检查BIOS中PCIe选项(如Above 4G Decoding、Resizable BAR)。
5.3iperf3 -c 192.168.1.100 -t 60 -P 4:压力测试吞吐稳定性
在局域网内找一台iperf3服务端(iperf3 -s),客户端执行:
# 关键参数:-t 60(持续60秒)、-P 4(4线程并行) iperf3 -c 192.168.1.100 -t 60 -P 4 --get-server-output # 观察输出中: # [ ID] Interval Transfer Bitrate Retr Cwnd # [ 4] 0.00-60.00 sec 6.89 GBytes 985 Mbits/sec 0 2.17 MBytes # 若Bitrate长期低于900Mbit/s,或Retr(重传)>0,说明驱动或PHY层存在丢包。玄学技巧:在麒麟V10上,若iperf3结果波动大,尝试关闭irqbalance:
sudo systemctl stop irqbalance,并绑定网卡中断到特定CPU核:# 查看网卡中断号 cat /proc/interrupts | grep enp2s0 # 绑定到CPU0(假设中断号为16) echo 1 | sudo tee /proc/irq/16/smp_affinity_list
5.4dmesg -T | grep -i "e1000e\|r8125" | tail -20:抓取最近20条驱动级日志
重点关注:
e1000e 0000:02:00.0: NIC Link is Up 1000 Mbps Full Duplex→ 链路正常;e1000e 0000:02:00.0: eth0: Reset adapter→ 频繁重置说明PHY不稳定,需检查网线或交换机端口;r8125 0000:03:00.0: enabling device (0000 -> 0003)→ 设备使能成功;- 若出现
e1000e: enp2s0: Detected Hardware Unit Hang,说明驱动与硬件时序不匹配,需降速至100M或更换网卡固件。
我干了五年国产化适配,踩过最深的坑是:以为modprobe success就万事大吉,结果上线后半夜丢包,查dmesg才发现Hardware Unit Hang每小时触发一次。后来养成习惯——任何驱动部署后,必跑iperf3 -t 600(10分钟长测)+watch -n 1 'dmesg | tail -5'监控实时日志。希望帮到你。
本文还有配套的精品资源,点击获取