ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

r8125离线安装全攻略:gcc/make/build-essential依赖打包与内核模块编译

r8125离线安装全攻略:gcc/make/build-essential依赖打包与内核模块编译 简介面向Ubuntu系统下需要在离线环境完成软件开发与驱动编译的用户这份资料聚合了gcc、make、build-essential工具链及Realtek R8125网卡驱动的全套离线安装包与依赖重点解决无网络时安装R8125千兆网卡驱动时缺少编译环境和依赖库的问题。压缩包共42个文件约30.01MB其中23个deb安装包覆盖GCC/G、Make、libc6-dev等基础组件8个h头文件与6个c源文件为r8125驱动源码另有Makefile、autorun.sh及README等构建与说明文件可完整支撑从编译到加载驱动的流程。已有3763人学习下载适合Ubuntu 18.04等版本、需离线部署Realtek网卡驱动的运维或开发人员。拿到后可直接解压按README指示依次安装deb依赖再通过Makefile编译源码即可在没有互联网的环境中完成驱动安装省去逐一下载依赖的繁琐过程。1. 先看场景为什么离线安装r8125会牵扯出一整套编译链一台刚装完系统的服务器插上一块基于RTL8125的2.5G网卡满心期待插上就能用结果系统压根没识别这块板卡。再一查机器里连gcc、make都没有更别提build-essential了。更要命的是这台机器本来就没有外网否则也根本不需要折腾什么离线安装包。这个先有鸡还是先有蛋的死循环凡是做过内网交付、机房上线、离线系统部署的人应该都不陌生。这篇文章我把整个离线安装链路完整拆一遍gcc、make、build-essential各自扮演什么角色依赖树怎么理在有网机器上怎么把离线包一次收齐目标机上按什么顺序装r8125驱动源码怎么编译进内核以及我实际踩过的几个大坑。适合三类人看正在给无网服务器装网卡驱动的运维、准备离线安装编译工具链的嵌入式开发以及手头有一块RTL8125网卡但始终搞不定官方驱动的DIY玩家。1.1 内核没带驱动时只能现场编译先解释一下为什么r8125这玩意不能像普通软件一样拿个安装包直接装。Realtek对RTL8125这块2.5G网卡的官方驱动发布形式就是一份C语言源码包常见文件名是r8125-9.xxx.xx.tar.bz2。拿到这份源码后必须在目标机器上用gcc把它编译成内核模块.ko文件再用insmod或modprobe加载进内核。有些人会问Linux内核新版本不是已经通过r8169驱动支持RTL8125了吗这话对了一半。从内核5.9开始r8169确实能识别一部分RTL8125网卡但覆盖并不完整而且板卡变体一多稳定性和功能表现就不一定靠谱。Realtek官方的r8125驱动仍然是很多服务器主板、NAS和软路由的首选。关键问题在于官方只给源码不给预编译二进制所以编译这一关绕不过去编译就离不开gcc和make。1.2 gcc、make、build-essential这三个角色各管哪段把这三个东西的分工搞清楚离线打包才不会漏。gcc是C编译器负责把r8125的.c源码变成可执行机器码make是一个构建调度工具它读取Makefile里写的编译规则决定先编译哪个文件、链接哪些库、最终生成什么目标你不用手动敲几十条gcc命令。build-essential则是Debian/Ubuntu系里的一个元包meta-package它本身不包含具体文件作用是把一整套编译C/C程序所需的基础工具打包成一个安装单元。用大白话类比gcc是厨师make是厨房里的调度员build-essential就是一套完整的厨师班底和基础食材清单。你单独装一个gcc也能做菜但食材不全、缺调料的情况会经常发生。在离线环境下你没办法临时去超市补货所以直接把整套打包带走才是最省事的。1.3 第一批要问自己的问题目标机内核版本是什么动手下载任何离线包之前先问目标机器一个问题uname -r输出到底是什么。这个答案决定了你要下载哪一版本的linux-headers或kernel-devel。很多人第一步就跑偏是因为在有网机器上打包时下意识用了那台机器自己的内核版本去下载头文件结果拿到目标机上发现版本对不上r8125编译直接报错。所以正确顺序是先在目标机上执行uname -r记下完整内核版本号再带着这个版本号回有网机器上下载对应依赖。这一步看似不起眼却能省掉后面一整晚的排错时间。2. 依赖树比四个包复杂得多离线打包前先列清单标题里写的gcc、make、build-essential、r8125离线安装包及依赖其实是一个很精简的表述真正到了离线场景你会发现需要携带的包数量远超这四个。原因很简单操作系统里的软件不是孤岛每个包都挂在依赖树上。2.1 build-essential是聚合包它背后挂着一长串依赖以Ubuntu 22.04为例build-essential会依赖以下这些关键包包名作用gccC编译器主体gC编译器make构建调度dpkg-devdeb包构建工具链libc6-devC标准库头文件与静态库binutils汇编器、链接器等底层工具看着没几项但这些包自身还有依赖。比如gcc依赖cpp、gcc-12、libgcc-12-devlibc6-dev又依赖libc6、libcrypt-dev、linux-libc-dev等。用apt-cache depends --recurse去拉完整依赖列表实际下来通常有几十个deb文件。这就是离线安装包及依赖听起来简单、做起来绕的原因。2.2 真正决定板卡命的是linux-headers不是gcc编译r8125这类内核模块除了工具链还需要内核头文件。Debian/Ubuntu里对应的包名是linux-headers-$(uname -r)Red Hat系则叫kernel-devel-$(uname -r)。这个东西才是整个离线任务里最关键的隐藏依赖。r8125的Makefile在编译时会去检查/lib/modules/$(uname -r)/build这个软链接是否存在这个链接实际指向的就是内核头文件目录。如果头文件没装或者版本不匹配gcc、make装得再全也白搭编译会在中途以各种诡异报错终止。我见过太多人把注意力全放在gcc版本上结果最后卡在头文件缺失上。2.3 Red Hat系怎么对应build-essential约等于Development Tools如果你的目标机器是CentOS、Rocky Linux或AlmaLinux这类Red Hat系系统那需要换个思路因为Red Hat系没有build-essential这个包名。对应的东西是Development Tools编译工具组它包含gcc、gcc-c、make、flex、bison等一整套编译工具。Red Hat系下打包时要抓的是gcc、make、kernel-devel、dkms这些包依赖关系处理和Debian不同下载方式也不同。好在目标系统是哪个流派并不影响r8125源码包本身驱动源码在两种系统上都能编译。搞清目标系统属于哪个流派直接决定你离线包的制作方法这一步千万别凭感觉猜。3. 有网机器上打离线包Debian系和Red Hat系两套姿势打包这一步是整篇文章的重头戏。你要记住一个核心原则生成离线包的操作必须在有网络且同发行版、同架构x86_64还是aarch64的机器上完成否则装上去十有八九出问题。3.1 Debian系神器apt-rdepends apt-get downloadDebian/Ubuntu系下我最常用的组合是apt-rdepends加apt-get download。先在联网机器上安装apt-rdepends然后递归解析依赖sudo apt-get update sudo apt-get install -y apt-rdepends mkdir -p /tmp/offline cd /tmp/offline # 把编译链相关的依赖列表抓出来 apt-rdepends build-essential linux-headers-$(uname -r) dkms \ | grep -v ^ | sort -u deps.txt # 按列表逐个下载deb xargs -a deps.txt apt-get download另外有一个更简洁的写法不需要装apt-rdepends直接用apt-cache的递归参数apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests \ --no-conflicts --no-breaks --no-replaces --no-enhances \ build-essential linux-headers-$(uname -r) dkms | grep ^\w | sort -u)下载完成后目录里会堆几十个deb文件。注意检查一下确认没有Unable to locate package之类的跳过项。如果目标机不是当前这台机器的内核版本记得把linux-headers-$(uname -r)换成目标机实际的内核版本号。3.2 Red Hat系yumdownloader --resolve和createrepoRed Hat系下第一步装yum-utils然后用yumdownloader的--resolve参数把依赖一起拉到指定目录# 先装 yum-utils联网机器上操作 sudo yum install -y yum-utils mkdir -p /tmp/offline # 下载编译链和内核头文件 yumdownloader --resolve --destdir/tmp/offline gcc make kernel-devel dkms--resolve参数很关键它会把所有依赖的rpm包一并抓下来。Red Hat系有个好处是rpm能直接从本地目录安装不强制建软件源。但如果你想省心推荐在目录里执行createrepo /tmp/offline生成仓库元数据然后把离线机器上的/etc/yum.repos.d/local.repo指向这个目录。这样目标机就能用yum/dnf命令安装自动解决依赖顺序。3.3 别忘了把r8125源码包拖回来还要对上版本工具链和内核头文件只是做饭的工具r8125源码包才是食材。Realtek官方网站的下载地址经常变化但包名规律比较固定。你需要找到文件名为r8125-9.xxx.xx.tar.bz2的压缩包9后面的版本号越高代表支持越新。强烈建议下载后顺手记录SHA256校验值离线环境出问题后多一个排查维度。选择源码版本时有一个容易忽略的点太老的r8125驱动包可能不支持新版内核太新的包又可能在老内核上报错。如果目标机内核是主流的5.10/5.15/6.1选中间偏新的版本基本没坑。把源码包和所有deb/rpm放进同一个移动存储设备时尽量把r8125源码单独放一层目录别和deb包混在一起避免后续dpkg -i *.deb时误操作把源码压缩包也传给dpkg。4. 目标机安装链路从dpkg开始到modprobe结束离线包拿到目标机上后安装顺序其实有一个隐含逻辑先装编译工具链再装内核头文件最后才编译r8125驱动。顺序反了会出现工具链有了但在编译时找不到头文件这种尴尬局面。4.1 离线装deb最容易失败的姿势以及稳妥版在Debian/Ubuntu离线机上最省心的操作是进入deb文件目录后直接批量安装cd /tmp/offline sudo dpkg -i *.deb很多人听到dpkg -i就皱眉头其实只要目录里的deb已经让依赖链闭环批量安装经常能一把过因为dpkg会先解包所有deb再统一配置。如果确实报出某个依赖缺失那意味着你的依赖列表漏包了需要回到有网机器上补下载而不是用apt-get -f install硬修——离线环境下那是修不了的。还有个更稳的做法是把deb目录变成一个临时本地源cd /tmp/offline sudo apt install ./*.debapt会基于命令行里给出的这些deb文件自己计算依赖关系从文件本身读取包信息不依赖网络索引。只要包都齐了apt会按拓扑序安装比手动挨个dpkg -i更聪明。如果apt报错提示需要更新索引就用前面的dpkg -i *.deb兜底。4.2 编译r8125autorun.sh一行脚本 vs 手动四连安装好编译链和内核头文件后先做一次最基本的检查确认头文件软链接确实可用ls -l /lib/modules/$(uname -r)/build这行命令如果输出一个指向/usr/src/linux-headers-...的软链接说明万事俱备如果输出No such file or directory说明内核头文件装错了版本重来吧。接下来进入r8125源码目录。Realtek自带一个autorun.sh脚本它会自动完成make clean、make、make install、modprobe r8125这一整套流程tar xf r8125-9.012.01.tar.bz2 cd r8125-9.012.01 sudo ./autorun.sh不过autorun.sh有个问题它是一个黑盒一旦中间失败不会回滚排错时不好定位。我更推荐手动四连make clean make -j$(nproc) # 注意第5章会讲为什么不能无脑高并行 sudo make install sudo modprobe r8125手动方式的好处是每步都看得见编译报错能知道具体卡在哪个环节。make install会把生成的r8125.ko复制到内核模块目录modprobe r8125才是真正把驱动加载进内核的那一下。4.3 顺手把dkms配上内核升级不再抓狂如果你不想在每次内核升级后都重复一遍装头文件→重编驱动的流程那就花十分钟把DKMSDynamic Kernel Module Support配上。DKMS的本质是让内核模块跟内核版本绑定新内核装好后自动重新编译模块。r8125源码包自带dkms支持标准流程是sudo dkms add -m r8125 -v 9.012.01 sudo dkms build -m r8125 -v 9.012.01 sudo dkms install -m r8125 -v 9.012.01注意版本号要和源码包版本一字不差。配置成功后以后系统升级内核DKMS会自动针对新内核重编r8125不再需要手动干预。考虑到离线机器往往很久不更新这个成本花得很值。5. 实测最容易翻车的四个位置以下四个坑每个我都实打实踩过而且都不是什么冷门问题。列出来给大家当排错手册用。5.1 内核头文件版本对不上经典报错与强制指定KERNELDIR最经典的一幕编译r8125时终端突然抛出一堆这样的报错——make[2]: *** /lib/modules/5.15.0-91-generic/build: No such file or directory. Stop. make[1]: *** [modules] Error 2原因就一个/lib/modules/$(uname -r)/build指向的内核头文件目录根本不存在。要么是没装linux-headers-$(uname -r)要么是在联网机器上打包时用错了内核版本。如果确认头文件已经装了但软链接异常可以手动补sudo ln -s /usr/src/linux-headers-5.15.0-91-generic /lib/modules/5.15.0-91-generic/build如果目标机上有多个内核版本r8125的Makefile有时会挑错版本可以强制指定make KERNELDIR/lib/modules/$(uname -r)/build5.2 Secure Boot把第三方模块拦在门外编译安装一切顺利重启后网卡就是不工作。用dmesg查日志会看到Lockdown: insmod: unsigned module loading is restricted之类的提示。这是UEFI Secure Boot在拦截未签名的第三方内核模块。先确认状态mokutil --sb-state输出SecureBoot enabled就说明是这回事。两条路可选在可控的机器上直接进UEFI/BIOS关掉Secure Boot最省事如果必须保留Secure Boot就需要给编译出来的r8125.ko签名再把公钥导入MOK列表。签名命令大致如下具体证书路径因发行版而异sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file \ sha256 /var/lib/shim-signed/mok/MOK.priv \ /var/lib/shim-signed/mok/MOK.der \ ./src/r8125.ko签完后记得mokutil --import导入公钥重启后按提示确认Enroll。这条坑在离线服务器上尤其隐蔽因为很多人装完模块、重启、发现没生效第一反应是驱动没装对根本想不到是安全启动机制在拦截。5.3 磁盘空间不够编译不是小事先盘点/tmp和/usr离线安装工具链时最容易忽略的是磁盘空间。build-essential整套装下来/usr分区会吃掉几百MB到1GB不等如果离线包里包含了多个版本的gcc或内核头文件空间消耗会更明显。而make编译r8125时/tmp、/var/tmp也会写入临时文件。安装前先体检df -h /tmp df -h /usr df -h /lib/modules如果/tmp空间紧张可以在编译前把临时目录指到空间更大的位置sudo mkdir -p /var/tmp/build export TMPDIR/var/tmp/build而/usr空间不足时可能连make install写完一半模块都会失败不会立刻报错等你重启才发现驱动文件残缺。5.4 gcc升级了make还是旧版本的真相热词榜里有句gcc升级后为啥还是旧版本这个问题在r8125编译场景里非常典型。你明明升级了gccgcc --version也显示新版本但make编译时调用的还是旧编译器。先别急着怀疑make按这个顺序排查which gcc readlink -f $(which gcc) ls -l /usr/bin/gcc* echo $CC hash -r # 刷新shell命令哈希缓存大多数情况是三个原因之一/usr/local/bin里有个老版本gcc排在PATH前面或者shell把旧命令路径缓存了下来hash -r能解决再或者编译脚本里通过CC环境变量指定了旧编译器。Debian/Ubuntu下如果装了多版本gcc用update-alternatives --config gcc切换默认版本。这些细节不处理干净r8125编译时会用一套和你预期完全不同的工具链产生莫名其妙的头文件不匹配问题。6. 装完驱动后的验收三板斧与收尾驱动安装完成不等于任务结束。至少要做一轮验收确认系统真正使用的是你编译出来的r8125驱动而不是内核里已有的其他驱动。6.1 验证驱动是否被真正使用三件事一次做完lsmod | grep r8125 dmesg | grep -i r8125 lspci -k | grep -A 3 -i ethernetlsmod确认模块已经加载dmesg能看到驱动加载时打印的硬件识别信息lspci -k最关键它会显示网卡当前的kernel driver in use如果显示的是r8169而不是r8125说明内核自带驱动抢先占用了设备。这种情况需要把r8169禁用掉sudo sh -c echo blacklist r8169 /etc/modprobe.d/blacklist-r8169.conf sudo update-initramfs -u然后重启让r8125接管网卡。这一步不做的话你编译了半天的r8125驱动可能根本没机会生效。6.2 让2.5G速率真正跑起来先分清驱动与网线的锅驱动加载之后用ip link查看网卡是否已经激活。有些主板上的RTL8125接口默认是down状态需要手动拉起sudo ip link set enp3s0 up接着用ethtool确认链路速率sudo ethtool enp3s0 | grep -i speed如果速率显示1000Mb/s而期望是2500Mb/s先别急着怀疑驱动编译有问题。这个位置很容易判断成驱动没装好实际上可能只是网线不合格。2.5G速率至少需要Cat5e及以上的网线对端交换机的端口也必须支持2.5G协商。驱动只要让ethtool能看到2500baseT的supported link mode剩下的多半是物理链路问题。最后别忘了把IP配置持久化。无论用/etc/network/interfaces、netplan还是nmcli在重启前把网卡IP钉住才算真正收尾。这个内容后续还可以怎么扩展如果你经常处理不同型号的Realtek网卡会发现r8168、r8125、r8152这几套驱动的依赖链几乎一样把离线打包流程做成一个脚本输入目标机的uname -r和网卡型号自动输出依赖清单能省下大量重复劳动。我自己的做法是在离线交付清单里固定带上这几样目标机的uname -r输出、build-essential整套deb或Development Tools对应rpm、同版本内核头文件、r8125源码包及SHA256校验值。因为这类第三方网卡驱动永远不会出现在系统源里每次内核升级后都可能要重编。提前把dkms配上等于替未来的自己省掉一整晚。本文还有配套的精品资源点击获取
返回列表