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

资讯详情

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

离线安装gcc/make/build-essential及r8125驱动完整指南

离线安装gcc/make/build-essential及r8125驱动完整指南 简介这一离线安装资源包面向Ubuntu系统运维、嵌入式开发与网络管理员适用于在无网络环境下安装Realtek R8125千兆网卡驱动同时补齐编译驱动所需的gcc、make、build-essential等基础工具链。资源共收录42个文件总大小约30.01MB其中包含23个deb依赖包覆盖libc6、gcc-7、g、dpkg-dev等关键组件另有驱动源码中的8个.h头文件、6个.c源文件和2个Makefile以及autorun.sh和README等辅助脚本与说明便于快速理清编译所需文件。已有3767人学习下载适合Ubuntu 18.04及相似环境下遇到网卡无法识别、或离线环境缺少编译工具的运维与开发人员。通过这套离线包可一次性获得编译和安装驱动的完整依赖链不必再手动逐一下载deb包目录结构按工具链和驱动源码分模块组织对照README和Makefile即可快速完成驱动编译、安装与内核模块加载有效解决离线场景下Realtek网卡驱动部署的常见难题。1. 离线安装 gcc/make/build-essential 与 r8125 驱动一场被网络逼出来的必修课在内网服务器、离线机房或信创环境里装软件最头疼的从来不是命令本身而是“没有网络”这四个字。apt install build-essential一条命令能搞定的事离线环境下要手动收集 gcc、make、libc 开发库、dpkg-dev 等一系列依赖稍有遗漏就报依赖错误。更麻烦的是r8125 是瑞昱的 2.5G 有线网卡Linux 内核自带驱动覆盖不全特别是新款主板或更新内核后必须编译安装官方驱动而编译 r8125 又绕不开 gcc 和 make。本篇文章要解决的就是“没有外网的情况下如何完整准备好 gcc、make、build-essential 及 r8125 离线安装包并在目标机器上一路编译成功”的完整方案。适合系统运维、信创项目实施和实验室环境搭建的工程师跟着步骤做能少走至少半天弯路。2. 离线安装包的准备在一台联网机器上“搬运”依赖2.1 为什么不能直接拷贝 build-essential 的 deb 文件不少新手会直接在联网机器上apt download build-essential然后把下载下来的 deb 包拷到内网装。这个思路方向是对的但会当场翻车。原因是 build-essential 本身只是一个元包它依赖 gcc、g、make、dpkg-dev、libc6-dev 等十几个包而这些包又各自有依赖比如 gcc 依赖 cpp、binutils、libgcc-s1libc6-dev 依赖 libc6 和 libc-dev-bin。apt download只会下载你指定的那一个包不会递归下载依赖。正确的姿势是使用apt-get download配合apt-cache depends递归解析或者直接用apt-rdepends。不过最省事的方法是用apt-get install --download-only配合定时清理的缓存目录把所有安装过程中需要的 deb 包一次性拉到本地。2.2 在 Ubuntu/Debian 系机器上完整拉取依赖包我一般会在联网机器上新建一个干净的目录然后用apt-get install --download-only先把包下载到/var/cache/apt/archives里再统一打包带走。具体命令如下mkdir -p ~/offline_packages cd ~/offline_packages # 清空 apt 缓存确保只保留这次要的包 sudo apt clean # 模拟安装但不实际安装下载全部依赖 sudo apt-get install --download-only --yes build-essential sudo apt-get install --download-only --yes linux-headers-$(uname -r) sudo apt-get install --download-only --yes dkms # 把缓存里的 deb 全部拷贝出来 cp -v /var/cache/apt/archives/*.deb ~/offline_packages/ ls -lh ~/offline_packages/这段命令的逻辑是先用apt clean把历史缓存清掉避免混入无关的旧包然后通过--download-only让 apt 把 build-essential 和内核头文件的依赖树全部拉到本地缓存中。之所以要把 linux-headers 也下载了是因为 r8125 驱动编译需要内核头文件没有它编译时一定会报kernel header files not in any这类错误。dkms 则是为了方便以后内核升级后驱动能自动重建如果不打算用 dkms 可以省掉但建议加上。参数说明--download-only是核心告诉 apt 只下载不安装--yes是为了跳过交互确认。拷贝出来的 deb 文件数量通常在 30 到 80 个之间取决于系统版本和已有的基础包。拷完之后把这个目录整体打包用tar czf offline_packages.tar.gz ~/offline_packages传到目标机器。2.3 在目标机器上离线安装 deb 包目标机器收到打包文件后解压并执行本地安装tar xzf offline_packages.tar.gz -C ~/ cd ~/offline_packages sudo dpkg -i *.deb这里有个坑直接dpkg -i *.deb有时候会报依赖顺序问题因为 dpkg 不自动解决依赖顺序。常见做法是先执行一次sudo dpkg -i *.deb如果报错再执行sudo apt-get install -f修复但离线环境下apt-get install -f可能会尝试联网。所以要稍微讲究一点sudo dpkg --force-depends -i *.deb--force-depends的意思是忽略依赖关系强制安装适合用来处理元包顺序导致的临时报错。但注意这个参数不能滥用如果你漏掉了真正的依赖包强制安装后 gcc 也是跑不起来的。装完后用gcc --version make --version验证一下能打印版本号就说明基础工具链已就绪。3. 理解 r8125 驱动源码与编译环境的对应关系3.1 r8125 驱动对 gcc/make 的版本要求r8125 是瑞昱 2.5Gbps 以太网控制器的官方驱动源码包里提供的Makefile对编译环境有一定要求。常见现象是 gcc 版本过高导致unknown option警告或者内核 API 变化导致源码中调用的函数签名不匹配。从实际经验看RHEL 7/8 系的 gcc 4.8/8.x 都能编过 r8125 的较新版本Ubuntu 18.04 的 gcc 7 和 Ubuntu 20.04 的 gcc 9 也都正常。真正容易出问题的是 Ubuntu 22.04 的 gcc 11 和 Ubuntu 24.04 的 gcc 13编译时可能出现implicit declaration of function或no member named之类的错误。遇到这类问题优先去瑞昱官网找最新版本的 r8125 驱动源码而不是硬啃旧版本。另外一个思路是改Makefile里的CC参数指定旧版 gcc但离线环境里没有旧版 gcc 的话这个方案也走不通。所以核心建议是驱动版本要尽量新而不是 gcc 版本要尽量旧。3.2 拿到驱动源码后的最小编译路径r8125 的r8125-9.xxx.tar.gz压缩包解压后目录里会有autorun.sh和Makefile。最简单的编译方式tar xzf r8125-9.012.00.tar.gz cd r8125-9.012.00 # 先清理旧模块 sudo make clean # 编译并安装到内核模块目录 sudo make installmake install会把r8125.ko拷贝到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/目录下然后执行depmod -a刷新模块依赖。如果内核头文件路径不对这里就会报Makefile: cannot find kernel header files。解决办法是确认/usr/src/linux-headers-$(uname -r)存在并且在Makefile里把KSRC指向正确路径。编译完成后加载模块验证sudo modprobe r8125 ip link showip link里如果出现enp3s0之类的网卡接口说明驱动加载成功。如果没出现用dmesg | tail -20查看内核日志看是不是固件或中断冲突的问题。4. 离线安装 r8125 的常见问题与排查清单4.1 现象make 报错kernel header files not in any这是离线装 r8125 时遇到最多的报错。原因很直接驱动源码的Makefile在尝试定位内核源码目录但系统里只有内核二进制没有对应的 headers 包。解决方法是确认当前内核版本并安装匹配的 linux-headersuname -r ls /usr/src/ | grep linux-headers如果没有输出说明 headers 没装。这时候回到联网机器上重新走一遍第 2 章的流程把linux-headers-$(uname -r)下载打包带过来。注意目标机器的内核版本和联网机器不一定一致所以取样时间要确定好最好在目标机器上执行uname -r后把这个版本告诉联网机器再去拉对应版本的 headers。4.2 现象dpkg -i *.deb报依赖错误离线安装时常见的一串错误大概是dpkg: dependency problems prevent configuration of gcc原因就是包安装顺序不对比如cpp还没装好gcc就试图配置。解决方法是不要一口气dpkg -i全部文件而是用dpkg --configure -a修复未配置的包或者按依赖层级分批安装。先装和系统库直接相关的sudo dpkg -i libc6*.deb libc-bin*.deb sudo dpkg -i binutils*.deb cpp*.deb sudo dpkg -i gcc*.deb g*.deb make*.deb这个顺序不是绝对但大方向是先底层库再编译器本体最后是工具链元包。装完后再dpkg -i build-essential*.deb收尾一般就不会报错了。4.3 现象gcc 编译时提示gcc: error: unrecognized command line option这个报错通常在新版 gcc 编译老旧驱动源码时出现。比如 gcc 8 移除了某些选项或者 gcc 13 对-fno-common这类行为产生了影响。解决思路是给 r8125 的Makefile加上EXTRA_CFLAGS把报错的选项屏蔽掉sudo make EXTRA_CFLAGS-Wno-errorunused-const-variable install更省事的做法是直接编辑Makefile找到CFLAGS相关的行把报错的选项删掉。这类问题的本质是驱动源码跟不上新内核/新编译器尽量换新驱动版本比在编译参数上修修补补更可靠。4.4 现象模块加载成功但网卡不工作modprobe r8125没报错lsmod | grep r8125也有输出但网卡就是没有 IPip link看不到接口。这种问题的原因通常是 BIOS 里网卡被关闭或者网卡实际用的不是 r8125 芯片而是另一个型号。先检查硬件lspci | grep -i ethernet如果输出的 PCI 列表里是Realtek Semiconductor Co., Ltd. RTL8125那说明芯片确认。再看看是不是模块名冲突了老版本 r8169 驱动可能会抢占设备。解决办法是在/etc/modprobe.d/下写个 blacklistecho blacklist r8169 | sudo tee /etc/modprobe.d/blacklist-r8169.conf sudo update-initramfs -u reboot重启后 r8125 就能独占网卡设备了。4.5 现象make[2]: *** [Makefile:18: libs] Error 1类似的热搜词vitis make[2]: *** [makefile:18: libs] error 1也常出现在硬件工程师装 FPGA 工具链时。但本质是同一类问题Make 依赖的库文件缺失常见的是libtinfo.so.5在较新的系统上被换成了libtinfo.so.6导致编译过程中某个静态链接库找不到。解决方式是用软链接兼容sudo ln -s /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5不过这个操作只适合临时绕过根本解法还是安装对应版本库。5. 用 dkms 管理 r8125 驱动的自动重建5.1 dkms 是什么为什么离线环境更推荐DKMS (Dynamic Kernel Module Support) 是维护内核模块的一种机制。直接make install安装的 r8125.ko 只适配当前这一个内核版本一旦系统通过离线包升级了内核驱动模块就会失效网卡又会消失。更麻烦的是离线环境升级内核后你未必还有联网机器可以再拉一次依赖。用 dkms 把驱动源码注册进去每次内核更新时 dkms 会尝试自动重编译。5.2 配置 r8125 的 dkms 支持r8125 官方源码包里自带 dkms.conf 的模板文件但有时候需要手动创建。在源码目录下新建dkms.confcat dkms.conf EOF PACKAGE_NAMEr8125 PACKAGE_VERSION9.012.00 BUILT_MODULE_NAME[0]r8125 DEST_MODULE_LOCATION[0]/kernel/drivers/net/ethernet/realtek AUTOINSTALLyes MAKE[0]make KSRC\${kernel_source_dir} modules EOF关键参数说明PACKAGE_VERSION必须和目录名版本一致否则 dkms 无法识别BUILT_MODULE_NAME是编译产出的模块名MAKE里的${kernel_source_dir}是 dkms 传入的变量不能写死。创建好 dkms.conf 后执行sudo cp -r /path/to/r8125-9.012.00 /usr/src/r8125-9.012.00 sudo dkms add -m r8125 -v 9.012.00 sudo dkms build -m r8125 -v 9.012.00 sudo dkms install -m r8125 -v 9.012.00dkms add把源码注册到/usr/src下dkms build开始编译如果 build 阶段报错同样检查 headers 是否匹配。dkms install成功后用dkms status可以看到模块状态是installed。以后内核升级后只要新内核的 headers 存在dkms 会自动重建模块。5.3 dkms build 报错的排查方向最常见的还是 headers 不匹配。dkms build显示的报错可能五花八门比如No rule to make target modules_prepare。这是因为/usr/src/linux-headers-$(uname -r)目录缺失或者 KSRC 路径不对。再有一个坑是dkms build时用了非 root 用户某些生成文件的权限不对导致编译中断。解决办法是先sudo dkms remove -m r8125 -v 9.012.00 --all清理掉修正环境后重新 add/build。6. 验证驱动的终极方法与两个实用技巧驱动装完之后不要急着收工。先确认模块被正确加载lsmod | grep r8125 modinfo r8125 | grep -E filename|versionmodinfo会打印出模块文件的路径如果路径指向/lib/modules/.../updates/dkms/r8125.ko说明 dkms 接管了未来内核升级能自愈。如果路径指向/extra/r8125.ko说明是手动make install装进来的。再确认实际网卡速率ethtool eth0 | grep Speed这里要注意接口名不一定是 eth0具体用ip link查看。RTL8125 应该显示Speed: 2500Mb/s。如果显示的只有 1000Mb/s说明网线或交换机协商速率不达标和驱动无关换六类线和千兆以上交换机试试。第二个实用技巧是日志输出到文件。gcc 编译 r8125 时错误信息一屏刷完看不清前面到底缺什么。推荐把编译输出重定向到文件再慢慢分析sudo make clean /tmp/r8125_build.log 21 sudo make KSRC/usr/src/linux-headers-$(uname -r) /tmp/r8125_build.log 21 tail -50 /tmp/r8125_build.log这段命令用21把标准输出和标准错误都写入日志文件编译失败时用grep -i error /tmp/r8125_build.log快速定位效率远高于盯着滚屏看。最后一个习惯建议做完离线安装包之后把dpkg -l | grep -E gcc|make|build-essential|dkms|linux-headers的输出留一份存档。下次另一台机器出现同样环境直接对照清单核对缺什么包不用再跑一遍完整编译排查。希望这个流程能帮你在离线环境里一次把网口点亮。本文还有配套的精品资源点击获取
返回列表