资讯详情

离线环境安装Realtek r8125网卡驱动:编译工具链与DKMS实践

📅 2026/10/27 2:52:06 | 华诺云谱 👁 阅读
离线环境安装Realtek r8125网卡驱动:编译工具链与DKMS实践
简介面向在 Ubuntu 环境下进行软件开发或 Realtek 网卡驱动部署的用户这份离线资源包集中解决无网络条件下编译工具链与 r8125 驱动安装的难题适合具备基础 Linux 操作能力、需要手动编译驱动的开发者与运维人员。压缩包共 42 个文件约 30.01MB以 23 个 deb 安装包为主体覆盖 gcc、make、build-essential 及其依赖库同时包含 6 个 c 源文件、8 个 h 头文件、2 个 makefile 与 1 个 sh 脚本构成 r8125 驱动的完整编译素材另附 readme 说明。已有 3769 人学习下载说明该组合在离线装机场景中具有实际参考价值。读者可据此在断网机器上一次性补齐编译环境按包内脚本完成驱动编译与安装省去逐一下载依赖的繁琐并借助源码与 Makefile 理解驱动构建流程为后续排错与内核模块管理打下基础。1. 离线环境装网卡驱动为什么编译工具链比驱动本身更容易翻车一台没有外网的生产服务器主板自带的 Realtek 2.5G 网卡在 Ubuntu 上认不出来ip a只看到一个 lo 和另一个千兆口。这种场景下多数人第一反应是找.deb驱动包但真正卡住流程的往往不是驱动源码而是gcc、make、build-essential这一整套编译依赖——新装的 Ubuntu 最小化系统里连make都没有dkms更是无从谈起。这份离线安装包把编译工具链和 r8125 驱动源码打包在一起解决的正是「机器没网、驱动没编、工具没装」这个死循环。适合手里有一台能上网的机器、目标机是 Ubuntu 且网卡为 Realtek 8125 系列、又不想折腾内网源的从业者。下面按「先确认环境、再装工具链、最后编驱动」的顺序拆开讲中间穿插几个我实际踩过的坑。2. 环境确认与离线包结构先搞清楚目标机缺什么2.1 判断网卡型号与内核版本动手之前必须先确认两件事网卡到底是不是 r8125 芯片以及目标机跑的是哪个内核。Realtek 的 2.5G 网卡有 8125、8125B、8125C 几个变体驱动源码虽然通用但内核版本决定了编译参数和模块签名策略。常见做法是先在目标机上跑lspci看设备 ID再对照内核版本决定要不要处理 Secure Boot。# 查看网卡设备信息重点看 Ethernet controller 那一行 lspci -nn | grep -i ethernet # 确认内核版本后面编译模块要用 uname -r # 查看当前已加载的网卡驱动确认是不是走了通用 r8169 lsmod | grep r816lspci -nn输出的方括号里是厂商 ID 和设备 IDRealtek 2.5G 网卡常见的是10ec:8125。如果lsmod里看到r8169被加载说明内核用通用驱动顶上了但 2.5G 速率往往跑不满或者直接不识别这时候才需要换 r8125 专用驱动。uname -r的结果要记下来编译时make会自动去/lib/modules/$(uname -r)/build找内核头文件头文件版本对不上是最常见的编译失败原因。2.2 离线包里到底有什么这类离线包的结构通常分三块编译工具链的 deb 包、驱动源码目录、以及一个可选的安装脚本。工具链部分一般包含gcc、g、make、libc6-dev、dpkg-dev这些build-essential的依赖链因为 Ubuntu 上装build-essential会连带拉一堆包离线环境必须把这些依赖一次性备齐。驱动源码目录里则是 Realtek 官方发布的r8125-*.tar.bz2解压后的内容核心文件是src/r8125_n.c和顶层的Makefile。组成部分典型文件作用编译工具链gcc、make、libc6-dev 等 deb提供编译驱动所需的最小环境驱动源码r8125 源码目录、Makefile编译出 r8125.ko 模块辅助脚本install.sh / dkms 配置自动化安装与开机加载需要提醒的是离线包里的 deb 包必须和目标机的 Ubuntu 版本、架构严格匹配。22.04 的包拿到 20.04 上装轻则依赖报错重则把系统库搞乱。我一般会先在目标机上跑lsb_release -a和dpkg --print-architecture确认版本和架构后再去对应目录取包这一步偷懒后面要花双倍时间还。2.3 装工具链前先处理依赖顺序离线装 deb 包最怕的就是依赖环。dpkg -i一个个装装到一半提示缺依赖是常态。正确做法是把所有 deb 放进一个目录用dpkg的批量安装配合--force-depends先落地再用apt的离线修复能力补齐顺序。不过更稳的方式是提前用dpkg-deb -I看每个包的Depends字段手动排出安装顺序。# 进入离线包目录先看所有 deb 的依赖关系 cd /path/to/offline-packages for f in *.deb; do echo $f dpkg-deb -f $f Depends done # 按依赖顺序批量安装--force-depends 只用于先落地再修复 sudo dpkg -i --force-depends *.deb # 用 apt 的离线模式修复依赖关系不联网 sudo apt-get install -f --no-downloaddpkg-deb -f直接读包的元数据比装完再报错要快得多。--force-depends的作用是让 dpkg 忽略暂时缺失的依赖继续装适合先把所有包铺到系统里再用apt-get install -f统一收尾。--no-download是关键参数它强制 apt 只用本地缓存避免在无网环境下卡在下载阶段。这套组合拳下来工具链基本能装干净gcc --version和make --version都能正常输出就说明环境到位了。3. 编译 r8125 驱动从源码到 ko 模块的完整链路3.1 解压源码与检查 Makefile驱动源码拿到手先别急着make花两分钟看顶层Makefile能省掉后面一堆报错。r8125 的 Makefile 里通常有几个关键变量KVER指定内核版本、PWD指定源码路径、MODDESTDIR指定模块安装位置。有些版本的 Makefile 默认去/usr/src/linux-headers-$(shell uname -r)找头文件如果目标机装的是linux-headers-generic而不是对应版本的头文件这里就会断。# 解压驱动源码 tar -xjf r8125-*.tar.bz2 cd r8125-*/ # 看一眼 Makefile 顶部的关键变量 head -40 Makefile # 确认内核头文件目录存在 ls /lib/modules/$(uname -r)/buildhead -40 Makefile主要看KVER和MODDESTDIR有没有被硬编码成别的版本。如果ls /lib/modules/$(uname -r)/build报「No such file or directory」说明内核头文件没装得从离线包里补linux-headers-$(uname -r)对应的 deb。这个目录是编译外部模块的硬性前提缺了它make会直接报「无法找到内核构建目录」。3.2 编译与安装模块环境齐了之后编译本身只有两条命令但参数和后续的模块加载才是重点。make会调用内核的 kbuild 系统把src/r8125_n.c编成r8125.ko。编完之后不要直接insmod因为insmod不会处理模块依赖正确姿势是make install把模块拷到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/下再depmod更新依赖表。# 编译驱动模块 make -j$(nproc) # 安装模块到内核目录并更新依赖 sudo make install # 更新模块依赖关系 sudo depmod -a # 加载模块先卸载可能占用的 r8169 sudo modprobe -r r8169 sudo modprobe r8125 # 确认模块已加载 lsmod | grep r8125make -j$(nproc)用满所有 CPU 核心驱动源码不大几秒就能编完。make install内部会执行cp r8125.ko到内核目录并跑depmod但有些版本的脚本不完整所以手动补一条depmod -a更保险。modprobe -r r8169这一步不能省r8169 和 r8125 会抢同一个 PCI 设备不先卸掉旧驱动新模块加载了也不接管网卡。lsmod看到r8125且Used by不为 0基本就说明驱动挂上了。3.3 验证网卡是否真正工作模块加载成功不等于网卡能用。ip a里出现新的enp*接口、ethtool能读出 2500Mb/s 的速率才算真正跑起来。如果接口出现了但ethtool报「Cannot get link status」多半是网线、交换机端口或者驱动版本和芯片小版本不匹配。# 查看所有网络接口 ip a # 查看指定接口的速率和双工模式 sudo ethtool enp3s0 # 查看驱动版本信息 sudo ethtool -i enp3s0ethtool enp3s0的Speed字段应该显示2500Mb/sDuplex为Full。如果显示Unknown先换根网线排除物理层问题。ethtool -i的driver字段应该是r8125version字段对应源码版本号这两个信息能确认当前生效的确实是新编的驱动而不是系统自带的。接口名enp3s0因机器而异用ip a里实际显示的名字替换。4. 避坑与排查五个让驱动装不上的真实原因4.1 现象make 报「内核头文件找不到」原因通常是目标机只装了linux-headers-generic这个元包它指向的头文件版本和当前运行内核不一致或者干脆没装。解决方法是先uname -r拿到精确版本再从离线包里找linux-headers-精确版本的 deb 装上装完ls /lib/modules/$(uname -r)/build必须能列出内容。如果离线包里没有对应版本的头文件就得从同版本系统的另一台机器上拷/usr/src/linux-headers-*整个目录过来这是离线环境最容易被忽略的一环。4.2 现象模块加载了但网卡还是不识别先看dmesg | grep r8125有没有报错。常见原因是 r8169 没卸干净两个驱动同时持有设备。lsmod | grep r816如果同时看到两个用modprobe -r把 r8169 卸掉再重新加载 r8125。另一个可能是 Secure Boot 开着未签名的模块被内核拒绝加载dmesg里会有「Loading of unsigned module is rejected」之类的提示。离线环境处理 Secure Boot 要么进 BIOS 关掉要么用mokutil走签名流程后者在无网环境下操作繁琐生产机一般直接关。4.3 现象dpkg 装 deb 时依赖报错滚雪球这是离线装包最典型的问题装 A 缺 B装 B 缺 C装到后面系统里一堆半配置状态的包。根因是没提前排依赖顺序。补救办法是sudo dpkg --configure -a先把半配置的包收尾再用apt-get install -f --no-download让 apt 从本地缓存补齐。预防手段就是 2.3 节里那套dpkg-deb -f预读依赖的流程花五分钟排顺序比事后修半小时划算。4.4 现象重启后驱动失效网卡又回到 r8169modprobe r8125只是临时加载重启后内核会重新探测硬件r8169 又抢回去。要让 r8125 开机自动加载得把模块名写进/etc/modules同时把 r8169 加入黑名单。黑名单文件放/etc/modprobe.d/blacklist-r8169.conf内容一行blacklist r8169。注意黑名单只影响modprobe的自动加载不影响手动insmod所以调试阶段还能临时切回去。改完跑sudo update-initramfs -u让配置进 initramfs否则早期启动阶段还是老驱动。4.5 现象编译通过但 ethtool 读不到 2.5G 速率驱动版本和芯片小版本不匹配是主因。r8125 源码有多个分支对应 8125、8125B、8125C拿旧分支编 8125C 的芯片模块能加载但协商速率上不去。解决方法是确认网卡具体型号lspci -nn的设备 ID 后缀能区分去源码目录的README或Makefile注释里找对应分支。另一个容易被忽略的点是交换机端口——很多千兆交换机插 2.5G 网卡只能协商到 1000Mb/sethtool显示 1000Mb/s 不一定是驱动问题先确认对端设备支持 2.5G。5. 进阶用 DKMS 管住驱动内核升级不再重编手动make install的驱动有个硬伤内核一升级/lib/modules/$(uname -r)路径变了旧模块直接失效又得重新编译。生产环境更稳的做法是走 DKMS把驱动源码注册成 DKMS 模块每次内核更新时自动重编。离线包里如果带了dkms的 deb可以一并装上没带的话手动配置也不复杂。# 安装 dkms离线包里有就本地装 sudo dpkg -i dkms_*.deb # 把驱动源码放到 DKMS 约定目录 sudo mkdir -p /usr/src/r8125-9.0.0 sudo cp -r r8125-*/* /usr/src/r8125-9.0.0/ # 创建 dkms.conf版本号按实际源码改 sudo tee /usr/src/r8125-9.0.0/dkms.conf EOF PACKAGE_NAMEr8125 PACKAGE_VERSION9.0.0 BUILT_MODULE_NAME[0]r8125 DEST_MODULE_LOCATION[0]/kernel/drivers/net/ethernet/realtek AUTOINSTALLyes EOF # 注册并编译安装 sudo dkms add -m r8125 -v 9.0.0 sudo dkms build -m r8125 -v 9.0.0 sudo dkms install -m r8125 -v 9.0.0 # 查看 DKMS 状态 dkms statusdkms.conf里的PACKAGE_VERSION要和目录名r8125-9.0.0一致BUILT_MODULE_NAME对应编译出的r8125.koDEST_MODULE_LOCATION决定模块最终装到内核树的哪个子目录。dkms add把源码注册进 DKMS 数据库build触发编译install把编好的模块装进当前内核并登记之后每次内核升级DKMS 会自动对新内核重跑 build 和 install。dkms status输出里看到r8125, 9.0.0, 内核版本: installed就说明接管成功。这套流程有个前提DKMS 编译时同样需要对应内核的头文件所以内核升级后如果头文件没跟着装DKMS 会编译失败并在dkms status里标build失败。离线环境没法自动拉头文件我的习惯是在升级内核前先把新版本的头文件 deb 备好升级完立刻补装再让 DKMS 重编。另外 DKMS 和手动make install不要混用两套机制同时往内核目录写模块depmod的依赖表会乱排查起来非常费劲。从那以后我每次在离线机器上装这类驱动都强制走一遍「uname -r对头文件 →dpkg-deb -f排依赖 → 卸 r8169 → 装 r8125 →ethtool验速率」的固定顺序少一步后面就得返工。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

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

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

你可能需要的服务

订阅华诺云谱资讯周报

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

↑