拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

银河麒麟V10网卡驱动编译加载全指南:e1000e与rtl8125适配实战

银河麒麟V10网卡驱动编译加载全指南:e1000e与rtl8125适配实战 简介本资源是专为银河麒麟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 SP1x86_64或SP3aarch64插上Intel I210e1000e或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/SP3x86_64 aarch64实测重点解决你查不到的“为什么make能过但insmod失败”“为什么dkms add后build报错”“为什么驱动加载后link down”三类高频翻车场景。2. 为什么原厂驱动源码在银河麒麟V10上直接编译会失败内核头文件、符号导出、模块签名三重关卡银河麒麟V10基于Linux Kernel 4.19SP1、5.4SP2、5.10SP3但其内核并非裸内核而是叠加了麒麟自研的安全加固模块如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_FORCEy。常见误操作是直接下载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 \ CCgcc \ 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 SP14.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_FORCEy未签名模块被内核拒绝加载。解决临时方案测试用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.ko3.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.ko3.3 现象网口能up但ethtool enp2s0显示Speed: 100Mb/s无法协商千兆原因麒麟V10内核的e1000e驱动默认关闭Auto-Negotiation自动协商且未正确读取网卡EEPROM中的PHY能力。解决加载驱动时传参强制启用协商sudo rmmod e1000e sudo insmod e1000e.ko Autoneg1 Speed1000 Duplex1 # 验证 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] DescriptionLoad e1000e driver Aftermulti-user.target [Service] Typeoneshot ExecStart/sbin/modprobe e1000e Autoneg1 Speed1000 Duplex1 RemainAfterExityes [Install] WantedBymulti-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 # 应输出 0x1533I210或 0x157bI211 # 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 44线程并行 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结果波动大尝试关闭irqbalancesudo systemctl stop irqbalance并绑定网卡中断到特定CPU核# 查看网卡中断号 cat /proc/interrupts | grep enp2s0 # 绑定到CPU0假设中断号为16 echo 1 | sudo tee /proc/irq/16/smp_affinity_list5.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 60010分钟长测watch -n 1 dmesg | tail -5监控实时日志。希望帮到你。本文还有配套的精品资源点击获取
返回列表