简介:面向在银河麒麟V10上进行网卡适配的运维人员与驱动开发者,这份资源提供e1000e与RTL8125两款网卡驱动的可编译源码,重点解决国产化系统下Intel以太网控制器与Realtek千兆网卡因内核差异导致的编译报错问题。压缩包共56个文件、约483KB,以C源文件与头文件为主体,辅以Makefile、readme说明及spec、SUMS等打包校验文件,分别对应e1000e-3.8.4与RTL8125Linux两套驱动目录,结构完整便于直接编译。已有2747人学习下载,说明该适配场景需求较为集中。源码中已针对重复定义与函数参数做过调整,读者可据此对照排查命名冲突、接口不匹配等典型编译障碍,快速完成驱动构建、加载与网卡连通性验证,减少在国产系统上反复试错的成本。
1. 银河麒麟V10下编译e1000e与rtl8125网卡驱动:先看清内核版本再动手
在国产化替代的机房里,银河麒麟V10桌面版和服务器版装完系统后网卡不认,是极高频的一类现场问题。板载Intel千兆口在lspci里能看到,ip a却只有lo;后加的RTL8125 2.5G网卡插上去连灯都不亮。很多人第一反应是去官网下个exe或者deb双击安装,结果发现驱动包要么是给别的内核版本编的,要么干脆只有源码压缩包。这套环境真正麻烦的地方不在编译命令本身,而在于内核头文件版本、源码版本、固件包三者必须对齐,错一个就是满屏报错。这篇笔记面向需要在麒麟V10上把e1000e和rtl8125驱动从源码编出来、装进去、并且重启后还能稳定工作的开发者,把版本选择、依赖安装、编译参数、加载验证和翻车后的回滚路径一次讲透。
2. 环境准备:内核版本、头文件与编译工具链的版本对齐
2.1 先确认内核版本,别急着解压源码
银河麒麟V10不同小版本的内核差异很大,桌面版常见4.19.90系列,服务器版有4.19.90也有5.4分支。驱动源码必须和当前运行内核的ABI匹配,否则编出来的.ko加载时会报invalid module format。第一步永远是查内核:
uname -r # 输出示例:4.19.90-24.4.v2101.ky10.x86_64拿到完整版本号后,去确认对应的内核开发包是否已装。麒麟的源里内核头文件包名通常带版本后缀,常见做法是:
# 查看已安装的内核相关包 rpm -qa | grep -E "kernel-devel|kernel-headers" # 若缺失,按当前内核版本安装(版本号替换为 uname -r 的实际输出) sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)这里有个血泪经验:kernel-devel的版本必须和uname -r完全一致,差一个构建号,/lib/modules/$(uname -r)/build这个软链接就会指向错误目录,后面make直接找不到autoconf.h。装完用下面这条确认软链接有效:
ls -l /lib/modules/$(uname -r)/build # 应指向 /usr/src/kernels/4.19.90-24.4.v2101.ky10.x86_64 之类如果软链接是断的,手动重建:sudo ln -sfn /usr/src/kernels/$(uname -r) /lib/modules/$(uname -r)/build。
2.2 编译工具链与依赖包清单
驱动编译依赖gcc、make、elfutils-libelf-devel,麒麟V10默认可能只装了最小集。我一般一次性补齐:
sudo yum install -y gcc make elfutils-libelf-devel kernel-devel kernel-headers gcc --version # 麒麟V10自带的gcc通常是7.3或8.3,与4.19内核匹配,不要随意升级提示:不要用第三方源把gcc升到10以上去编4.19内核的模块,内核构建系统对编译器版本有假设,高版本gcc编出的模块在部分麒麟内核上会触发
Unknown symbol。保持系统自带gcc最稳。
2.3 源码与固件包的版本选择
e1000e和rtl8125的源码来源不同。e1000e属于Intel官方维护的独立驱动包,版本号形如e1000e-3.8.4.tar.gz;rtl8125用Realtek官方的r8125-9.xxx.tar.bz2。选版本的原则是:优先选发布日期晚于内核发布日期的稳定版,但不要选最新的beta。以麒麟V10的4.19内核为例,e1000e选3.8.x系列、r8125选9.007以上版本兼容性较好。源码包解压后目录里通常有README和src/,先扫一眼README里标注的支持内核范围,比盲目试编省时间。
3. 编译e1000e驱动:从make到生成ko的完整参数
3.1 解压与Makefile关键变量
e1000e的源码结构是顶层Makefile加src/目录。解压后不要直接make,先看顶层Makefile里几个变量:
tar -xzf e1000e-3.8.4.tar.gz cd e1000e-3.8.4/src # 查看关键变量 grep -E "^(CFLAGS_EXTRA|INSTALL_MOD_PATH|KVER)" Makefile编译命令本身不复杂,但参数决定产物去向:
cd e1000e-3.8.4/src make CFLAGS_EXTRA="-Wno-error" -j$(nproc)-j$(nproc)按CPU核数并行编译,CFLAGS_EXTRA="-Wno-error"是应对麒麟内核头文件里某些警告被当成错误的情况——这是4.19内核配新版gcc时的常见坑,不加这个参数会在-Werror处中断。编译成功后当前目录会生成e1000e.ko,用modinfo先验一下:
modinfo ./e1000e.ko | head -20 # 确认 vermagic 与 uname -r 一致vermagic那一行如果和当前内核版本对不上,说明编译时用的头文件不对,回去检查2.1的软链接。
3.2 安装模块与依赖关系重建
编译产物不要手动cp到/lib/modules,走make install更稳,它会处理depmod:
sudo make install # 等价于拷贝ko到 /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000e/ sudo depmod -adepmod -a重建模块依赖表,这一步漏了会导致modprobe e1000e找不到模块。装完先别急着重启,用modprobe热加载验证:
sudo modprobe -r e1000e 2>/dev/null sudo modprobe e1000e lsmod | grep e1000e dmesg | tail -20dmesg里应看到e1000e: Intel(R) PRO/1000 Network Driver的版本行和网卡初始化信息。如果出现probe of ... failed with error -X,多半是固件缺失或PCIe链路问题,先看4.2节的排查。
3.3 固件包的处理
e1000e部分型号(如I219系列)需要e1000e-3.bin等固件文件,放在/lib/firmware/e1000e/下。麒麟V10的linux-firmware包可能不含最新固件,编译源码包里通常附带e1000e-*.bin,安装时:
sudo mkdir -p /lib/firmware/e1000e sudo cp e1000e-3.bin /lib/firmware/e1000e/ 2>/dev/null sudo modprobe -r e1000e && sudo modprobe e1000e固件缺失的典型现象是dmesg报Direct firmware load for e1000e-3.bin failed,网卡能识别但链路起不来。
4. 编译rtl8125驱动:Realtek源码的编译与加载差异
4.1 r8125源码的编译方式
Realtek的r8125源码包解压后目录名形如r8125-9.009.00,编译入口在顶层:
tar -xjf r8125-9.009.00.tar.bz2 cd r8125-9.009.00 make -j$(nproc)和e1000e不同,r8125的Makefile默认会检测内核版本并自动选择编译路径,一般不需要额外CFLAGS_EXTRA。编译成功后生成src/r8125.ko。如果报error: implicit declaration of function 'pci_alloc_consistent'这类错,说明源码版本太老,4.19内核已移除该API,换9.007以上版本即可。
4.2 安装与模块冲突处理
r8125装之前要先确认系统没有自带同名模块抢占:
lsmod | grep r8125 # 若有输出,先卸载 sudo modprobe -r r8125 sudo make install sudo depmod -a sudo modprobe r8125make install会把ko放到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/r8125/。加载后ip a应出现新的enpXsY接口。如果接口出现但ethtool显示Link detected: no,检查网线和对端协商速率,RTL8125在部分老交换机上需要强制千兆:
sudo ethtool -s enp3s0 speed 1000 duplex full autoneg off4.3 开机自动加载的配置
热加载成功不代表重启后还在。把模块写进/etc/modules-load.d/:
echo "r8125" | sudo tee /etc/modules-load.d/r8125.conf echo "e1000e" | sudo tee /etc/modules-load.d/e1000e.conf如果系统里有/etc/modprobe.d/blacklist.conf把这两个模块拉黑了(部分麒麟镜像为规避兼容问题会这么做),要注释掉对应行,否则开机加载会被拦截。改完用systemctl reboot重启验证,别用init 6,某些麒麟版本下两者行为不一致。
5. 避坑与排查:五条现场踩过的坑
5.1 坑一:编译通过但insmod报invalid module format
现象:make全绿,sudo insmod e1000e.ko报invalid module format。原因:编译时/lib/modules/$(uname -r)/build指向的内核源码版本与运行内核不一致,vermagic对不上。解决:modinfo e1000e.ko | grep vermagic对比uname -r,重建软链接后make clean && make重编。
5.2 坑二:dmesg报Unknown symbol in module
现象:加载时dmesg出现Unknown symbol ... (err -2)。原因:模块依赖的其他ko未加载,或内核配置里对应符号未导出。解决:modprobe --force不推荐,正确做法是modinfo -F depends e1000e.ko看依赖,逐个modprobe;若符号确实未导出,说明内核配置裁剪过,只能换匹配的内核或改用内核自带驱动。
5.3 坑三:网卡识别但拿不到IP
现象:ip a有接口,dmesg无报错,但DHCP拿不到地址。原因:多为固件未加载导致PHY未初始化,或NetworkManager把接口标记为unmanaged。解决:先dmesg | grep -i firmware确认固件,再nmcli device status看接口状态,unmanaged的话在/etc/NetworkManager/conf.d/下加[keyfile] unmanaged-devices=none或直接nmcli device set enp3s0 managed yes。
5.4 坑四:重启后驱动回退到旧版本
现象:热加载正常,重启后ethtool -i显示的还是系统自带旧版驱动。原因:initramfs里打包了旧ko,启动早期加载的是initramfs里的版本。解决:sudo dracut -f重建initramfs,确保新ko被打进去,再重启。
5.5 坑五:编译中途OOM被杀
现象:make -j跑到一半gcc: internal compiler error: Killed。原因:并行编译内存不足,麒麟V10最小安装内存2G的机器上很常见。解决:降并行度make -j2,或加swap:sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 && sudo mkswap /swapfile && sudo swapon /swapfile。
6. 装完怎么验证:三步确认驱动真正生效
驱动装完最怕的是“当时能用,重启就废”。我验证一套网卡驱动是否真正落地,固定走三步,缺一步都不算完。
第一步,确认加载的是新编的模块而不是系统自带的。用ethtool -i看驱动版本和文件名:
ethtool -i enp3s0 # 输出中 driver: r8125, version: 9.009.00-NAPI # filename 应指向 /lib/modules/.../r8125.ko如果version还是内核自带的旧号,说明加载顺序被initramfs抢了,回5.4处理。
第二步,确认链路和速率协商正常。RTL8125要看到2500Mb/s或1000Mb/s,e1000e看1000Mb/s:
ethtool enp3s0 | grep -E "Speed|Duplex|Link detected" # Speed: 2500Mb/s Duplex: Full Link detected: yes第三步,做一次真实流量验证,别只看灯。用iperf3打一轮,或者至少ping -c 100看丢包:
ping -c 100 -i 0.2 192.168.1.1 | tail -3 # 100 packets transmitted, 100 received, 0% packet loss三步都过,再reboot一次重跑这三条,全绿才算真正装完。我一般会把这三条命令写成一个check_nic.sh放在/root下,每次换机器或升级内核后强制跑一遍——因为麒麟V10升级内核小版本后,之前编的ko大概率要重编,这个脚本能第一时间告诉你驱动是不是又掉了。从那以后我每次动网卡驱动,热加载、重启、流量验证这三关都强制走一遍,再没出现过交付现场网卡不认的尴尬。希望帮到你。
本文还有配套的精品资源,点击获取