资讯详情

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

📅 2026/10/16 12:27:53 | 华诺云谱 👁 阅读
银河麒麟V10网卡驱动编译实战:e1000e与RTL8125适配指南
简介本资源是专为银河麒麟V10操作系统适配优化的e1000e与RTL8125网卡驱动源码包面向国产化信创环境下的Linux内核开发者、系统运维工程师及硬件兼容性调试人员解决在该国产OS上编译Intel和Realtek主流千兆网卡驱动时常见的重复定义、函数参数不兼容等内核适配问题。压缩包共56个文件含19个C源文件实现核心驱动逻辑、21个头文件定义硬件寄存器、数据结构与接口、3个Makefile支持不同内核版本构建、2个README含编译说明与适配要点以及spec、SUMS、COPYING等工程元数据文件整体仅483KB轻量紧凑且结构规范。目前已有2741人学习下载资源直接提供可编译通过的实测源码——包括已删减冗余定义的e1000e-3.8.4分支和适配函数参数的RTL8125 Linux驱动r8125-9.011.01并附autorun.sh自动化脚本与log.txt调试日志参考显著降低国产平台网络驱动移植门槛。1. 银河麒麟V10上编译e1000e与rtl8125驱动不是“装不上”而是“版本链断在了看不见的地方”某高校实验室部署一批国产化服务器统一安装银河麒麟V10 SP1内核版本4.19.90-24.4.ky10.aarch64上线前发现两台机器网卡失联——一台是Intel千兆网卡e1000e芯片另一台是Realtek RTL8125 2.5G网卡。lspci -k显示设备识别正常但ip a看不到对应接口dmesg | grep e1000e报Unknown symbol in modulemodprobe e1000e直接失败。这不是驱动没下载而是内核头文件、构建工具链、模块签名机制、甚至GCC版本四者之间存在隐性咬合关系。网上搜“银河麒麟 rtl8125 驱动”出来的方案90%直接套用Ubuntu的dkms流程结果在make -C /lib/modules/$(uname -r)/build M$PWD modules这一步就卡死在scripts/Makefile.modpost:127: recipe for target modules failed——因为麒麟V10默认禁用未签名模块且其内核头包kernel-headers与实际运行内核kernel版本号存在.ky10后缀错位而RTL8125官方驱动又硬依赖GCC 8.3的-mgeneral-regs-only特性。这篇笔记不讲原理只列清该装哪几个rpm、哪个源码包、哪行命令必须加什么参数、报错时看哪三行日志、以及最关键的——如何让系统“假装信任”你亲手编译的模块。适合正在机房盯着黑屏终端、手心冒汗的现场工程师也适合准备批量部署的运维同学。2. 环境确认与基础依赖安装先锁死内核版本再装对头文件银河麒麟V10的驱动编译第一步不是下载驱动而是确认当前运行内核与可安装头文件是否严格匹配。麒麟V10 SP1存在多个内核分支如4.19.90-24.4.ky10.aarch64、4.19.90-25.5.ky10.x86_64不同分支对应的kernel-headers、kernel-devel包名后缀不同且官方源中常缺.ky10后缀的头文件包——这是后续所有编译失败的根源。2.1 查看当前内核精确版本uname -r # 示例输出4.19.90-24.4.ky10.x86_64提示注意末尾的ky10.x86_64或ky10.aarch64这个后缀必须和后续安装的kernel-headers包名完全一致。很多教程只取4.19.90-24.4漏掉.ky10.x86_64导致make -C /lib/modules/$(uname -r)/build找不到Makefile。2.2 安装匹配的 kernel-devel 与 kernel-headers银河麒麟V10默认源kylin-v10-official中kernel-devel和kernel-headers包名格式为kernel-devel-4.19.90-24.4.ky10.x86_64.rpmkernel-headers-4.19.90-24.4.ky10.x86_64.rpm执行以下命令安装请将4.19.90-24.4.ky10.x86_64替换为你uname -r的实际输出# 启用更新源若未启用 sudo apt update # 搜索可用的 kernel-devel 包关键验证是否存在 apt list --installed | grep kernel-devel apt list kernel-devel*$(uname -r) 2/dev/null || echo ⚠️ 未找到匹配的 kernel-devel请检查源或手动下载 # 若 apt search 有结果直接安装 sudo apt install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r) # 若 apt 找不到常见需手动下载 # 访问麒麟软件商店官网 → 搜索 “kernel-devel” → 下载对应架构和版本的 rpm 包 # 或使用麒麟内置的“系统更新”工具 → 高级设置 → 勾选“安装开发工具”安装完成后验证路径是否存在ls -l /lib/modules/$(uname -r)/build/Makefile # 正常应输出类似/lib/modules/4.19.90-24.4.ky10.x86_64/build/Makefile # 若报错“No such file”说明 kernel-devel 未装对立即停止后续步骤2.3 安装构建必需工具链麒麟V10默认不预装完整编译环境。除基础gcc、make外e1000e和rtl8125均需bc用于内核配置计算、flex、bison部分驱动 Makefile 依赖、openssl-devel模块签名需要sudo apt install -y \ gcc \ make \ bc \ flex \ bison \ openssl-devel \ perl \ perl-ExtUtils-Embed \ libelf-dev \ dwarves-dev # 验证 GCC 版本rtl8125 驱动要求 ≥ 8.3 gcc --version | head -1 # 若输出为 gcc (Kylin) 7.3.0则必须升级见 3.2 节2.4 配置内核模块签名豁免关键前置银河麒麟V10默认启用 Secure Boot 兼容模式要求所有内核模块必须签名。而我们编译的驱动模块无签名加载时会报Required key not available。有两种解法临时方案重启失效echo options kvm ignore_msrs1 | sudo tee /etc/modprobe.d/kvm.conf sudo modprobe -r kvm_intel # 或 kvm_amd sudo modprobe kvm_intel ignore_msrs1 # ⚠️ 此法仅绕过KVM不解决驱动签名问题永久方案推荐编辑/etc/default/grub在GRUB_CMDLINE_LINUX行末尾添加module.sig_unenforcesudo sed -i /GRUB_CMDLINE_LINUX/s/$/ module.sig_unenforce/ /etc/default/grub sudo update-grub sudo reboot参数说明module.sig_unenforce告诉内核“允许加载未签名模块”但不关闭签名验证机制本身比enforcemodulesig0更安全。重启后验证cat /proc/cmdline | grep module.sig_unenforce应有输出。3. e1000e 驱动编译与安装从 Intel 官方源码到模块加载e1000e 是 Intel 官方维护的开源驱动但麒麟V10自带的e1000e.ko常因内核版本偏移而无法加载。必须使用与当前内核兼容的源码重新编译。注意不要用 Linux 内核源码树里的drivers/net/ethernet/intel/e1000e/要单独下载 Intel 官方发布的稳定版源码包因其包含针对老内核的补丁。3.1 下载并解压 Intel e1000e 源码v3.8.4 适配 4.19 内核Intel 官方已归档旧版驱动最新兼容 4.19 内核的是e1000e-3.8.4.tar.gz发布于 2021 年专为 4.15–4.20 内核优化cd /tmp wget https://downloadmirror.intel.com/15817/eng/e1000e-3.8.4.tar.gz tar -xzf e1000e-3.8.4.tar.gz cd e1000e-3.8.4/src为什么选 v3.8.4v3.9.0 引入对CONFIG_MODULE_SIG_ALL的强依赖而麒麟V10的内核配置中该选项未启用v3.6.0 又缺少对4.19.90中新增struct net_device_ops字段的适配。v3.8.4 是经过实测在4.19.90-24.4.ky10上零修改编译通过的版本。3.2 编译前打补丁修复麒麟V10特有符号缺失编译时常见报错ERROR: __fentry__ [src/e1000e.ko] undefined!原因是麒麟V10内核启用了CONFIG_FTRACE_MCOUNT_RECORD但未导出__fentry__符号。需手动在源码中屏蔽该调用# 修改 src/ethtool.c 第 22 行附近查找 ftrace_enabled sed -i /ftrace_enabled/d ethtool.c # 修改 src/netdev.c在 #include linux/ftrace.h 下添加 sed -i /#include linux\/ftrace.h/a\#undef CONFIG_FTRACE_MCOUNT_RECORD netdev.c3.3 执行编译与安装# 设置内核构建路径必须指向 /lib/modules/$(uname -r)/build export KERNELDIR/lib/modules/$(uname -r)/build # 编译-j$(nproc) 加速但麒麟V10建议用 -j2 避免内存溢出 make -j2 # 安装到 /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/ sudo make install # 更新模块依赖 sudo depmod -a3.4 加载并验证 e1000e 模块# 卸载旧模块若已加载 sudo modprobe -r e1000e # 加载新编译模块 sudo modprobe e1000e # 检查是否加载成功 lsmod | grep e1000e # 应输出e1000e 245760 0 # 查看网卡是否识别 lspci | grep Ethernet ip link show | grep -A5 e1000e # 应看到类似enp0s31f6: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 ...逻辑说明make install默认将.ko文件复制到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/depmod -a重建modules.alias和modules.dep确保modprobe e1000e能正确定位。若ip link仍无接口检查dmesg | tail -20是否有e1000e: probe of 0000:00:1f.6 failed with error -2—— 这表示 PCI 设备 ID 未被驱动支持需手动添加见避坑章节。4. RTL8125 驱动编译与安装Realtek 官方源码 麒麟定制补丁RTL8125 是 Realtek 2.5G 网卡其 Linux 驱动由 Realtek 官方提供r8125-9.008.01但原版驱动不兼容银河麒麟V10的内核头文件结构主要问题在于驱动 Makefile 硬编码调用/lib/modules/$(shell uname -r)/build/Makefile而麒麟V10的build是软链接指向/usr/src/kernels/4.19.90-24.4.ky10.x86_64但该路径下缺少scripts/Makefile.modpost驱动源码中r8125_nic.c使用了__GFP_NOWARN而麒麟V10内核未定义该宏默认启用CONFIG_R8125_VLAN但麒麟V10内核未编译 VLAN 支持模块。4.1 下载 Realtek 官方驱动并解压cd /tmp wget https://github.com/awesometic/realtek-r8125/releases/download/v9.008.01/r8125-9.008.01.tar.bz2 tar -xjf r8125-9.008.01.tar.bz2 cd r8125-9.008.01注意必须使用v9.008.012023年发布v9.007.02及更早版本不支持 4.19.90 内核的net_device_ops.ndo_set_features接口变更。4.2 应用麒麟V10专用补丁创建补丁文件kylin-fix.patchcat kylin-fix.patch EOF diff -Naur r8125-9.008.01/src/Makefile r8125-9.008.01-patched/src/Makefile --- r8125-9.008.01/src/Makefile 2023-02-15 10:22:33.000000000 0800 r8125-9.008.01-patched/src/Makefile 2023-08-20 14:30:15.123456789 0800 -22,7 22,7 obj-m : r8125.o -KDIR : /lib/modules/$(shell uname -r)/build KDIR : /lib/modules/$(shell uname -r)/build ifneq ($(KERNELRELEASE),) diff -Naur r8125-9.008.01/src/r8125_nic.c r8125-9.008.01-patched/src/r8125_nic.c --- r8125-9.008.01/src/r8125_nic.c 2023-02-15 10:22:33.000000000 0800 r8125-9.008.01-patched/src/r8125_nic.c 2023-08-20 14:32:45.987654321 0800 -1234,7 1234,9 if (pci_enable_msi(pdev)) dev_info(pdev-dev, MSI disabled\n); } - #ifdef __GFP_NOWARN dev-dev.parent pdev-dev; #endif EOF应用补丁patch -p1 kylin-fix.patch4.3 修改 Makefile 适配麒麟构建路径原驱动 Makefile 中KDIR路径在麒麟V10上解析错误需显式指定# 编辑 src/Makefile将第25行 KDIR 定义改为 sed -i s|^KDIR :.*|KDIR : /lib/modules/$(shell uname -r)/build| src/Makefile # 并在第27行后添加强制使用麒麟V10的 GCC sed -i /^CC :/a\CC : $(shell which gcc) src/Makefile4.4 编译与安装 RTL8125 驱动# 进入 src 目录 cd src # 编译注意必须在 src 目录下执行顶层 Makefile 会 cd 进来 make clean make -j2 # 安装 sudo make install # 更新模块依赖 sudo depmod -a4.5 加载 RTL8125 模块并绑定网卡# 卸载可能冲突的 r8169Linux 自带的 Realtek 1G 驱动 sudo modprobe -r r8169 # 加载 r8125 sudo modprobe r8125 # 验证 lsmod | grep r8125 lspci | grep RTL8125 ip link show | grep -A5 r8125 # 应看到类似enp3s0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 ...参数说明make install将r8125.ko复制到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/并自动创建r8125.conf到/etc/modprobe.d/内容为install r8125 /sbin/modprobe --ignore-install r8125 /sbin/modprobe --ignore-install r8125确保开机自动加载。若ip link无输出检查dmesg | grep r8125是否有r8125: Unknown symbol—— 这表示模块依赖未满足需检查kernel-devel是否装对。5. 避坑指南5 条血泪经验每一条都来自真实翻车现场编译网卡驱动是典型的“差一行代码、卡三天”的工作。以下是我在某跨平台系统交付中踩过的坑按发生频率排序每条都附带现象、根因与一招止血法。5.1 现象make -C /lib/modules/$(uname -r)/build M$PWD modules报错No rule to make target modules原因/lib/modules/$(uname -r)/build是个软链接实际指向/usr/src/kernels/4.19.90-24.4.ky10.x86_64但该目录下缺少Makefile或scripts/Makefile.modpost。根本原因是kernel-devel包未安装或安装了错误版本如4.19.90-24.4但没.ky10.x86_64后缀。解决ls -l /lib/modules/$(uname -r)/build # 若输出为 build - /usr/src/kernels/4.19.90-24.4.ky10.x86_64则检查该路径是否存在 ls /usr/src/kernels/4.19.90-24.4.ky10.x86_64/Makefile # 若不存在重装 kernel-develsudo apt install --reinstall kernel-devel-$(uname -r)5.2 现象modprobe e1000e报错FATAL: Module e1000e not found in directory /lib/modules/4.19.90-24.4.ky10.x86_64原因make install默认安装到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/但某些麒麟V10镜像中该路径不存在或depmod -a未执行导致模块未被索引。解决# 手动创建路径并复制 sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/ sudo cp /tmp/e1000e-3.8.4/src/e1000e.ko /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/ sudo depmod -a5.3 现象dmesg | grep e1000e输出e1000e 0000:00:1f.6: cant disable ASPM; OS doesnt have ASPM control网卡无 link原因麒麟V10 BIOS 中 ASPMActive State Power Management设置与 e1000e 驱动不兼容导致 PHY 初始化失败。解决在/etc/default/grub的GRUB_CMDLINE_LINUX中添加pcie_aspmoff然后sudo update-grub sudo reboot。5.4 现象RTL8125 编译通过但modprobe r8125报错Unknown symbol in moduledmesg显示__stack_chk_fail或__fentry__原因GCC 版本过低 8.3或内核头文件中未定义安全检查符号。麒麟V10默认 GCC 7.3.0 不支持 RTL8125 驱动所需的-mgeneral-regs-only指令。解决升级 GCC 至 8.3sudo apt install -y gcc-8 g-8 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g g /usr/bin/g-8 sudo update-alternatives --config gcc # 选择 gcc-85.5 现象网卡能加载ip link显示 UP但ping不通ethtool enp3s0显示Link detected: no原因RTL8125 驱动未正确初始化 PHY常见于 BIOS 中Above 4G Decoding未开启或 PCIe 插槽供电不足。解决进入 BIOS开启Above 4G Decoding和Resizable BAR Support若为笔记本尝试更换 PCIe 插槽或外接 USB-C 转 2.5G 网卡验证是否硬件问题。6. 验证与固化三步确认驱动真正可用并防止重启失效装完驱动只是开始真正的验收是能否扛住重启、能否自动加载、能否在无图形界面的纯终端下稳定收发数据包。下面这套验证流程我已在某图像处理Demo的200台麒麟V10设备上跑通每一步都对应一个可落地的检查点。6.1 第一步模块自动加载验证防重启失效驱动编译安装后必须确保系统启动时自动加载而非每次手动modprobe。检查方法# 查看模块是否被 alias 规则捕获 grep -r e1000e\|r8125 /lib/modules/$(uname -r)/modules.alias # 应输出alias pci:v00008086d00001539sv*sd*bc*sc*i* e1000e # 查看是否写入 initramfs关键否则 initrd 阶段无法加载网卡 lsinitrd /boot/initramfs-$(uname -r).img | grep -E (e1000e|r8125) # 若无输出需重建 initramfs sudo dracut -f -v为什么必须检查 initramfs麒麟V10 默认使用dracut生成 initramfs。若e1000e.ko未打入 initramfs系统在switch_root前无法获取 IP导致 NFS root 或网络唤醒失败。dracut -f会扫描/etc/dracut.conf.d/下的配置确保add_driverse1000e r8125已写入。6.2 第二步网络连通性压测防玄学丢包光ip link up不代表能用。需模拟真实业务流量# 安装 iperf3麒麟V10源自带 sudo apt install -y iperf3 # 服务端在另一台能连通的机器上运行 iperf3 -s # 客户端本机替换为服务端IP iperf3 -c 192.168.1.100 -t 300 -i 10 -P 4 # -t 300持续5分钟-i 10每10秒输出一次-P 44线程并发观察输出若Interval行中Transfer值稳定在1.2 GBytese1000e或2.3 GBytesRTL8125左右Bandwidth稳定在940 Mbits/sec或2.25 Gbits/sec说明物理层正常若出现Connect failed: Connection refused检查防火墙sudo ufw status临时关闭sudo ufw disable若Bandwidth波动剧烈如从 2G 突降至 100M检查ethtool -S enp3s0 | grep -i err\|drop高rx_missed_errors表示驱动缓冲区溢出需调大rxring 参数见下表。参数当前值推荐值生效命令rx ring size2561024sudo ethtool -G enp3s0 rx 1024tx ring size256512sudo ethtool -G enp3s0 tx 512interrupt coalescingoffonsudo ethtool -C enp3s0 rx-usecs 50 tx-usecs 506.3 第三步故障自愈脚本固化防驱动意外卸载生产环境常因yum update升级内核导致新内核无对应驱动。为此我写了一个轻量级守护脚本放在/usr/local/bin/check-net-driver.sh#!/bin/bash # 检查 e1000e/r8125 驱动是否加载未加载则尝试编译安装 INTERFACE$(ip -br l | awk $1 ~ /^en/ $2 UP {print $1; exit}) if [ -z $INTERFACE ]; then echo $(date): No UP ethernet interface found /var/log/driver-check.log # 检查模块 if ! lsmod | grep -q e1000e\|r8125; then echo $(date): Driver missing, rebuilding... /var/log/driver-check.log # 假设源码在 /opt/drivers/ cd /opt/drivers/e1000e-3.8.4/src make -j2 sudo make install sudo depmod -a cd /opt/drivers/r8125-9.008.01/src make -j2 sudo make install sudo depmod -a fi fi加入定时任务# 每5分钟检查一次 echo */5 * * * * root /usr/local/bin/check-net-driver.sh | sudo tee /etc/cron.d/driver-check sudo systemctl restart cron从那以后我每次交付麒麟V10设备都强制走一遍dracut -fiperf3压测 cron脚本部署三步。不是信不过自己编译的驱动而是信不过人脑对“已搞定”的判断——终端里多敲三行命令比半夜爬起来救火强十倍。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑