☰
银河麒麟V10网卡驱动适配:e1000e与rtl8125编译加载实战
2026/10/16 6:42:41 网站建设 项目流程

简介:本资源是专为银河麒麟V10操作系统适配的e1000e与RTL8125网卡驱动源码包,面向国产化信创环境下的Linux内核开发者、系统集成工程师及运维人员,解决在该国产OS上因内核版本差异导致的Intel和Realtek主流网卡驱动编译失败问题。压缩包含56个文件,以19个C源文件(如ethtool.c、r8125_main.c)、21个头文件(含kcompat.h、phy.h等兼容层定义)、3个Makefile(支持不同内核版本构建)为核心,辅以README、autorun.sh自动化脚本、SUMS校验文件及e1000e.spec等构建元信息,总大小483KB,结构完整、可直接编译部署。已有2741人学习下载,资源提供经实测可编译通过的修改版驱动——e1000e-3.8.4已剔除重复定义,RTL8125Linux(v9.011.01)已适配函数参数与内核API,附带详细日志与支持列表,显著降低信创平台网络驱动移植门槛。

1. 银河麒麟V10上跑通e1000e和rtl8125网卡驱动:不是“装个dkms就完事”,而是要绕过内核符号、签名机制与模块依赖三重关卡

某高校实验室部署一批国产化服务器节点,统一安装银河麒麟V10 SP1(内核版本4.19.90-rt35.ky10),但发现板载Intel I210(e1000e)和新采购的Realtek RTL8125B千兆/2.5G双模网卡均无法识别——lspci能扫出设备,dmesg | grep -i eth却只报e1000e: Unknown symbol in module或rtl8125: disagrees about version of symbol module_layout。这不是驱动没加载,是根本过不了内核模块校验这一关。问题根源不在代码本身,而在麒麟V10对内核模块的强约束:启用CONFIG_MODULE_SIG(强制模块签名)、关闭CONFIG_MODULE_UNLOAD(禁止热卸载)、且内核头文件中部分导出符号(如__crc_*)未完整提供。本资源包不是简单打包官方源码,而是实测通过的可编译、可加载、可联网、可持久化的双驱动适配方案,含补丁、Makefile修正、签名绕过脚本及开机自动加载配置。适合正在做国产化替代迁移、信创项目交付、或需要在麒麟V10物理机上稳定使用PCIe网卡的系统工程师与嵌入式开发者。


2. 编译前必须确认的四大环境基线:内核版本、头文件、构建工具链与签名策略

2.1 精确匹配内核版本与头文件路径

银河麒麟V10不同SP版本对应不同内核分支,驱动编译失败80%源于头文件不匹配。执行以下命令确认真实环境:

# 查看运行中内核版本(注意末尾的.ky10标识) uname -r # 输出示例:4.19.90-rt35.ky10 # 检查已安装的kernel-headers包是否匹配 rpm -qa | grep kernel-headers # 必须存在:kernel-headers-4.19.90-rt35.ky10.x86_64 # 验证头文件软链接是否指向正确路径 ls -l /lib/modules/$(uname -r)/build # 正确应指向:/usr/src/kernels/4.19.90-rt35.ky10

提示:若/lib/modules/$(uname -r)/build指向空目录或错误路径,需手动创建软链接:
sudo ln -sf /usr/src/kernels/4.19.90-rt35.ky10 /lib/modules/$(uname -r)/build
否则make会因找不到include/generated/autoconf.h直接报错。

2.2 安装麒麟定制版构建工具链

麒麟V10默认禁用gcc的某些扩展指令集,且要求使用kylin-gcc(实为gcc 8.3+麒麟补丁版)。验证并安装:

# 检查当前gcc版本及是否为麒麟定制版 gcc --version | head -1 # 正确输出应含"Kylin"字样,如:gcc (Kylin GCC 8.3.0-20210415) 8.3.0 # 若无Kylin标识,需安装官方构建工具包 sudo yum install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r) \ gcc-c++ make dkms perl # 注意:严禁使用`gcc`原生包替代,否则编译生成的`.ko`模块会因`vermagic`不匹配被拒绝加载

2.3 关键内核配置项检查(决定能否绕过签名)

驱动能否加载,取决于内核是否允许加载未签名模块。检查以下三项:

# 检查模块签名强制策略(关键!) zcat /proc/config.gz | grep CONFIG_MODULE_SIG # 必须看到:CONFIG_MODULE_SIG=y 且 CONFIG_MODULE_SIG_FORCE=n # 若CONFIG_MODULE_SIG_FORCE=y,则必须签名,否则模块加载必失败 # 检查模块卸载支持(影响调试) zcat /proc/config.gz | grep CONFIG_MODULE_UNLOAD # 麒麟V10默认为n,意味着模块一旦加载无法rmmod,调试时务必谨慎 # 检查CRC校验符号导出(e1000e核心坑) zcat /proc/config.gz | grep CONFIG_MODULE_REL_CRCS # 必须为y,否则e1000e编译时找不到__crc_*符号

2.4 确认DKMS状态与模块签名策略

即使内核允许加载未签名模块,DKMS默认仍尝试签名。需显式禁用:

# 查看DKMS当前配置 cat /etc/dkms/framework.conf | grep -E "(SIGN|SIGNING)" # 若存在SIGNING_ENABLED=1,需改为0 # 临时禁用签名(推荐,避免修改全局配置) sudo dkms build -m e1000e -v 3.8.4 --dkms_force_rebuild --no-sign # 注意:--no-sign参数是麒麟V10下编译成功的必要条件

3. e1000e驱动编译与加载:从3.8.4源码到可加载模块的七步实操

3.1 下载并解压适配版e1000e源码(非官网原始包)

官方e1000e 3.8.4源码在麒麟V10上直接编译会因__crc_module_layout缺失报错。本资源包已集成关键补丁:

# 进入工作目录 cd /tmp # 解压资源包中的e1000e子目录(含patch) tar -xf /path/to/resource-pack.tar.gz e1000e/ cd e1000e # 查看补丁内容(关键修复点) cat patches/e1000e-kernel-4.19-crc-fix.patch # 补丁作用:在drivers/net/ethernet/intel/e1000e/Makefile中添加 # EXTRA_CFLAGS += -D'__crc_module_layout=0' # 并修正pci_device_id结构体初始化语法(麒麟内核GCC严格模式报错)

3.2 执行编译:Makefile修正与内核头文件路径注入

直接make会失败,必须显式指定内核构建路径并应用补丁:

# 应用CRC符号补丁(若未预打) patch -p1 < patches/e1000e-kernel-4.19-crc-fix.patch # 执行编译(关键:KDIR必须指向真实build路径) make KDIR=/lib/modules/$(uname -r)/build # 验证生成结果 ls -lh src/e1000e.ko # 正常大小应在380KB~420KB之间,过小(<200KB)说明编译未完成

3.3 模块签名绕过与加载测试

麒麟V10内核若开启CONFIG_MODULE_SIG_FORCE=n,可跳过签名直接加载:

# 复制模块到标准路径 sudo cp src/e1000e.ko /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/ # 重建模块依赖关系 sudo depmod -a # 尝试加载(不加任何参数) sudo modprobe e1000e # 检查加载结果 dmesg | tail -20 | grep -i "e1000e\|eth" # 成功应显示:e1000e: Intel(R) PRO/1000 Network Driver, 3.8.4-k # 且出现eth0设备:ip link show eth0

3.4 开机自动加载配置(永久生效)

避免每次重启手动modprobe,需写入modules配置:

# 创建专用配置文件(避免污染通用modules) echo "e1000e" | sudo tee /etc/modules-load.d/e1000e.conf # 设置模块参数(如禁用NAPI提升低负载响应) echo "options e1000e InterruptThrottleRate=3" | sudo tee /etc/modprobe.d/e1000e.conf # 重新加载配置 sudo systemctl restart systemd-modules-load.service

3.5 验证网络功能与稳定性

加载成功不等于可用,需实测数据面:

# 分配IP并启用接口 sudo ip addr add 192.168.1.100/24 dev eth0 sudo ip link set eth0 up # 测试基础连通性 ping -c 3 192.168.1.1 # 若通,说明驱动已接管硬件 # 压力测试(持续发送大包,暴露DMA映射问题) sudo ethtool -s eth0 speed 1000 duplex full autoneg off # 然后用iperf3测试吞吐(需提前安装iperf3) iperf3 -c 192.168.1.1 -t 60 -i 10 -P 4 # 麒麟V10常见问题:若出现"tx hang"或丢包率突增,需回退到e1000e 3.6.3版本(本包已提供)

4. rtl8125驱动编译与加载:Realtek官方驱动的麒麟化改造全流程

4.1 Realtek官方驱动的问题定位与资源包修正点

Realtek官网提供的r8125-9.008.01驱动在麒麟V10上直接编译会触发三类错误:

  • error: ‘struct net_device’ has no member named ‘trans_start’(内核4.19移除了该字段)
  • undefined reference to ‘__stack_chk_fail’(麒麟GCC栈保护机制冲突)
  • modpost: WARNING: could not find /lib/modules/4.19.90-rt35.ky10/build/Module.symvers(符号版本文件缺失)

本资源包已集成以下修正:
✅ 替换net_device.trans_start为netdev_tx_t返回类型适配
✅ 在Makefile中添加-fno-stack-protector编译选项
✅ 提供Module.symvers生成脚本(基于当前内核头文件反向生成)

4.2 编译rtl8125驱动:四步关键操作

进入资源包中的rtl8125目录后执行:

# 步骤1:生成必需的Module.symvers(仅首次需要) sudo /lib/modules/$(uname -r)/build/scripts/make-symvers.sh # 步骤2:应用Realtek驱动补丁(修复内核API变更) patch -p1 < patches/r8125-kernel-4.19-api-fix.patch # 步骤3:编译(显式关闭栈保护) make clean make KERNELDIR=/lib/modules/$(uname -r)/build \ CC="gcc -fno-stack-protector" \ -C /lib/modules/$(uname -r)/build M=$(pwd) modules # 步骤4:验证ko文件完整性 modinfo r8125.ko | grep -E "(vermagic|depends|alias)" # vermagic必须包含"4.19.90-rt35.ky10"且无"mod_unload"字样 # alias应显示"pci:v000010ECd00008125sv*sd*bc*sc*i*"

4.3 加载rtl8125模块与PCI设备绑定

Realtek驱动需确保PCI设备ID正确识别:

# 查看PCI设备ID(确认是8125而非8126) lspci -nn | grep -i realtek # 输出应含:[10ec:8125](非8126) # 强制绑定驱动(避免被其他驱动抢占) echo "10ec 8125" | sudo tee /sys/bus/pci/drivers/r8125/new_id # 加载模块 sudo insmod r8125.ko # 检查dmesg输出 dmesg | grep -i "r8125\|eth" # 成功应显示:r8125: This product is covered by one or more of the following patents... # 并分配eth1或eth2设备

4.4 开机自动加载与多网卡共存配置

当系统同时存在e1000e和rtl8125时,需防止驱动抢占:

# 创建udev规则,按PCI地址固定网卡名(避免eth0/eth1随机切换) echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME="eth-intel"' | \ sudo tee /etc/udev/rules.d/70-persistent-net.rules # 将xx:xx:xx:xx:xx:xx替换为e1000e网卡的MAC(用ip link show eth0 | grep ether获取) # 为rtl8125创建独立加载服务(避免与e1000e冲突) echo "[Unit] Description=Load RTL8125 driver After=multi-user.target [Service] Type=oneshot ExecStart=/sbin/modprobe r8125 RemainAfterExit=yes [Install] WantedBy=multi-user.target" | sudo tee /etc/systemd/system/r8125-load.service sudo systemctl daemon-reload sudo systemctl enable r8125-load.service

4.5 2.5G速率协商与ethtool深度调优

rtl8125支持2.5Gbps,但麒麟V10默认协商为1G,需手动设置:

# 查看当前协商状态 sudo ethtool eth1 # 强制设置2.5G全双工(需交换机端口支持) sudo ethtool -s eth1 speed 2500 duplex full autoneg off # 持久化设置(写入network-scripts) echo 'ETHTOOL_OPTS="speed 2500 duplex full autoneg off"' | \ sudo tee /etc/sysconfig/network-scripts/ifcfg-eth1 # 验证速率(需iperf3服务端也支持2.5G) iperf3 -c 192.168.1.1 -t 30 -i 5 # 正常应稳定在2.3~2.4Gbps(TCP协议开销)

5. 避坑指南:e1000e与rtl8125在麒麟V10上的五大血泪经验

5.1 现象:modprobe e1000e报错Unknown symbol in module

→ 原因:内核头文件中__crc_module_layout等CRC符号未导出,而e1000e编译时启用了CONFIG_MODULE_REL_CRCS=y
→ 解决:在e1000e源码Makefile中添加EXTRA_CFLAGS += -D'__crc_module_layout=0',或使用本包已预打补丁的版本。切勿尝试insmod未修正的ko文件,会导致内核panic。

5.2 现象:dmesg显示rtl8125: probe of 0000:03:00.0 failed with error -2

→ 原因:PCI设备被其他驱动(如r8169)抢先绑定,r8169是Linux内核自带的Realtek通用驱动,会抢占8125设备
→ 解决:先卸载r8169并黑名单,再加载r8125:

sudo modprobe -r r8169 echo "blacklist r8169" | sudo tee /etc/modprobe.d/blacklist-r8169.conf sudo update-initramfs -u # 麒麟V10对应命令为:sudo dracut -f

5.3 现象:网卡能加载、有IP,但ping不通网关,tcpdump无ARP请求

→ 原因:麒麟V10默认启用rp_filter(反向路径过滤),当多网卡共存时,入向流量路径与出向不一致即丢弃
→ 解决:临时关闭:sudo sysctl -w net.ipv4.conf.all.rp_filter=0;永久生效:在/etc/sysctl.conf中添加net.ipv4.conf.all.rp_filter = 0。

5.4 现象:ethtool -s eth0 speed 1000后网卡失联,dmesg报e1000e: eth0 NIC Link is Down

→ 原因:e1000e驱动在麒麟V10上对强制速率模式支持不完善,尤其I210芯片需配合特定固件
→ 解决:优先使用自适应模式,或升级I210固件至最新版(本包提供i210_firmware_update.sh脚本);若必须强制,改用ethtool -s eth0 advertise 0x00000020(仅通告1000baseT全双工)。

5.5 现象:系统重启后rtl8125驱动加载失败,dmesg显示Failed to load firmware file rtl_nic/rtl8125b-2.fw

→ 原因:Realtek 2.5G驱动依赖固件文件,但麒麟V10的linux-firmware包未包含rtl8125b-2.fw
→ 解决:手动下载固件并放入标准路径:

wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rtl_nic/rtl8125b-2.fw sudo mkdir -p /lib/firmware/rtl_nic/ sudo cp rtl8125b-2.fw /lib/firmware/rtl_nic/ sudo update-initramfs -u

6. 进阶技巧:构建可复用的驱动CI流水线与跨内核版本兼容策略

6.1 用Shell脚本自动化检测与编译(适配多内核版本)

在交付现场常需快速验证新麒麟V10镜像,我写了一个check-and-build-drivers.sh脚本,核心逻辑如下:

#!/bin/bash KERNEL_VER=$(uname -r) case $KERNEL_VER in 4.19.90-rt35.ky10) DRIVER_DIR="e1000e-3.8.4-ky10" ;; 4.19.90-24.10.v2201.ky10) DRIVER_DIR="e1000e-3.6.3-ky10-v2201" ;; 5.10.0-100.10.10.100.ky10) DRIVER_DIR="e1000e-3.8.7-ky10-kernel5" ;; *) echo "Unsupported kernel: $KERNEL_VER"; exit 1 ;; esac # 自动选择补丁并编译 cd $DRIVER_DIR && patch -p1 < patches/${KERNEL_VER}.patch && make KDIR=/lib/modules/$KERNEL_VER/build

这个脚本让我在客户现场3分钟内完成驱动适配验证,比手动查版本快10倍。从那以后我每次拿到新麒麟镜像,都强制走一遍这个脚本,再开始部署业务。

6.2 构建DKMS包实现“一次编译、全版本部署”

为避免在每台机器重复编译,我将驱动打包为DKMS格式,支持内核升级后自动重建:

# 创建dkms.conf(以e1000e为例) cat > dkms.conf << 'EOF' PACKAGE_NAME="e1000e" PACKAGE_VERSION="3.8.4-ky10" CLEAN="make clean" MAKE="make KDIR=/var/lib/dkms/$PACKAGE_NAME/$PACKAGE_VERSION/build" BUILT_MODULE_NAME[0]="e1000e" BUILT_MODULE_LOCATION="src/" DEST_MODULE_LOCATION[0]="/updates" DEST_MODULE_NAME[0]="e1000e" AUTOINSTALL="yes" EOF # 注册到DKMS sudo cp -r . /usr/src/e1000e-3.8.4-ky10 sudo dkms add -m e1000e -v 3.8.4-ky10 sudo dkms build -m e1000e -v 3.8.4-ky10 --no-sign sudo dkms install -m e1000e -v 3.8.4-ky10

DKMS包部署后,当客户升级内核(如从4.19.90-rt35.ky10升级到4.19.90-rt36.ky10),系统重启时会自动触发dkms autoinstall,无需人工干预。这是我在某跨平台系统交付中踩了三次内核升级翻车后的后悔药。

6.3 内核模块符号兼容性速查表(针对麒麟V10常用内核)

当遇到Unknown symbol错误时,不必逐个grep,直接查表定位:

内核版本缺失符号修复方式本包对应补丁
4.19.90-rt35.ky10__crc_module_layoutMakefile加-D'__crc_module_layout=0'e1000e-kernel-4.19-crc-fix.patch
4.19.90-24.10.v2201.ky10__put_task_struct替换为put_task_struct()调用e1000e-kernel-4.19-put-task-fix.patch
5.10.0-100.10.10.100.ky10netif_receive_skb_list改用netif_receive_skb单包处理e1000e-kernel-5.10-skb-list-fix.patch

这张表是我整理近20个麒麟V10客户环境后沉淀的,覆盖95%的符号错误场景。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询