
1. 先弄明白为什么Ubuntu 18.04装完没有网络装上系统后网线插好、网口灯也亮了ip link里却只有lo系统就像断了一只胳膊什么都干不了。这个场景我在很多台主板上碰到过尤其是用了 Realtek RTL8125 这颗 2.5G 网卡芯片的主机安装 Ubuntu 18.04 之后就经常卡在这一步。原因很简单18.04 默认带的 4.15 内核里还没有直接支持 RTL8125 的驱动模块。更麻烦的是你要装驱动就得先联网要联网又得先有驱动典型的死循环。本文就是一套完整的离线安装实操方案适合所有需要在无网环境下为 Ubuntu 18.04 装上 RTL8125 有线网卡驱动的朋友我尽量把每一步为什么这么做、命令怎么敲、报错怎么解都讲清楚。1.1 RTL8125到底是什么样的网卡RTL8125 是 Realtek 出品的 PCIe 接口 2.5Gbps 以太网控制器RTL8125B、RTL8125BG 也都属于同一系列。最近几年的中高端主板、品牌整机后置有线网口用得非常普遍。它向下兼容 100Mbps 和 1000Mbps所以你插上老交换机也能用但在正确驱动下它能跑到 2.5Gbps局域网内传大文件速度比传统千兆网卡快一大截。Windows 系统里它往往被识别为“Realtek Gaming 2.5GbE Family Controller”插上就能用但 Linux 没有这么轻松。Ubuntu 18.04 的内核 4.15 是 2018 年左右的版本RTL8125 当时还没有进入内核主线所以系统无法自动把它拉起来。要判断手上这块网卡到底是不是 RTL8125方法很简单。只要系统能进终端先跑一条命令lspci -nn | grep -i ethernet如果结果里有10ec:8125这样的输出10ec是 Realtek 的厂商 ID8125就是 RTL8125 芯片的设备 ID基本可以确定。如果是在 Windows 下看硬件 ID也会看到VEN_10ECDEV_8125。确认这一条的主要目的是避免装错驱动RTL8111/8168 用的官方驱动是r8168RTL8125 用的是r8125名字差一位源码完全不一样搞混了时间就白花了。1.2 离线安装的整体技术路线在完全离线的机器上编译内核模块难点根本不在驱动源码本身而是目标机上缺编译环境。驱动解压之后无非是make和make install但gcc、make、linux-headers-xxx这些工具和头文件如果没有一切免谈。所以离线安装的正确姿势不是“拿着驱动源码直接去目标机硬编”而是先在另一台能上网的机器上把所有需要的软件包下载成.deb文件连同驱动源码一起拷到目标机。这里我假设你手里有两台机器一台能上网的“准备机”系统最好也是 Ubuntu 18.04或者 20.04/22.04 都行但下载的依赖必须对应目标机的内核版本另一台是不能上网的“目标机”。准备机负责下载驱动源码、下载内核头文件和编译工具链目标机只干一件事装依赖、编译驱动、加载模块。如果家里只有一台机器也可以先在 Windows 上用浏览器下载对应文件再拷贝到 U 盘但下载.deb依赖这一步需要换成其他能下载文件的方式路径不同本文后面也会把依赖包清单列出来方便你按名字去找。2. 离线安装前在“有网机器”上把材料备齐在 U 盘插上目标机之前先把下面三样东西准备好目标机内核版本信息、RTL8125 驱动源码、所有编译安装所需的.deb包。说句大实话80% 的人离线安装失败不是编译步骤出错而是材料根本没备齐要么缺linux-headers要么缺gcc到了目标机上才发现又没法下载只能干瞪眼。2.1 确认目标机的内核版本和网卡具体型号如果你已经在目标机上装好了 Ubuntu 18.04开机登录就能看到终端那么第一步就是确认内核版本uname -r比如输出4.15.0-112-generic记下来这个版本号直接决定了你要下载哪个linux-headers包。同时查看网卡型号lspci -nn | grep -i ethernet ip linkip link的作用是看当前系统里有哪些网口如果驱动没加载通常只会看到lo。如果连lspci都没有说明系统太精简可以在安装介质里使用“试用 Ubuntu”进入 Live 环境在 Live 终端里同样可以执行uname -r和lspci。Live 环境的内核版本和你安装后的系统不一定完全一样所以依赖包的版本最好以目标机实际启动后的uname -r为准。如果目标机还没安装系统建议先装完系统再回来准备依赖否则你在 Live 环境查到的内核版本不一定能对应到后续安装完成后的系统材料备回去也白搭。2.2 下载官方RTL8125驱动源码官方驱动源码去哪里下载Realtek 官网其实一直都有提供不过入口藏得比较深。简单的方法是直接搜索 “Realtek RTL8125 Linux driver”找到 Realtek 官方下载中心选择“LINUX”分类下的“Drivers”找名字类似r8125-9.011.00.tar.bz2的文件下载。版本号每个时期不一样9.x 都是 RTL8125 系列不用纠结是不是最新。有一点要注意r8125和r8168是两个独立驱动RTL8125 必须用r8125用 r8168 源码是编译不过的。下载后先做校验防止拷贝过程中文件损坏sha256sum r8125-9.011.00.tar.bz2在准备机和目标机各执行一次对比哈希值一致再使用。解压后你会看到src/、Makefile、autorun.sh等文件。autorun.sh是官方提供的一键脚本内部会依次执行make、make install、modprobe r8125还尝试写自动加载配置但我建议第一次先不要用它手动执行每一步这样出问题更好定位。Makefile主要是为当前内核编译内核模块依赖/lib/modules/$(uname -r)/build这个软链接它指向已经安装的linux-headers。2.3 打包编译所需的离线依赖包目标机上编译内核模块至少需要以下几类包我整理成一个表格方便你核对软件包用途linux-headers-$(uname -r)内核头文件编译驱动必须依赖路径在/usr/src/linux-headers-...linux-headers-$(uname -r)的配套依赖如 linux-libc-dev提供内核 API 定义gccC 编译器编译内核模块make构建工具执行 Makefilebuild-essential包含 gcc/make/ld 等基础编译工具链dpkg-dev可选部分驱动 Makefile 需要bzip2解压.tar.bz2源包dkms可选但推荐用于内核升级后自动重建模块perl/python3系统基础组件一般已装但离线准备时一起带上更稳在准备机上下载 deb 包推荐用这种方式sudo apt update mkdir -p ~/offline-debs cd ~/offline-debs apt-get download linux-headers-4.15.0-112-generic build-essential dkms bzip2 tar注意linux-headers-4.15.0-112-generic里的版本号要手动改成目标机的实际内核版本。直接用apt-get download只会下载列出的包不会自动带依赖所以更稳妥的做法是使用缓存目录把依赖一起抓下来mkdir -p ~/offline-debs cd ~/offline-debs sudo apt-get install --download-only --no-install-recommends \ linux-headers-4.15.0-112-generic build-essential dkms bzip2 tar \ -o Dir::Cache::archives~/offline-debs执行完之后~/offline-debs下会出现一组.deb文件连同它们的依赖一起被下载缓存。这种方法基本覆盖绝大多数场景。如果安装时仍然提示缺依赖就把缺的名字记下来在准备机上用apt-get download单独补再拷过去。这里还要提醒一句如果准备机上的 apt 源是国内镜像deb 包下载速度会很快但目标机完全离线不要试图在目标机上执行apt update除非你配置了本地离线源。离线源的高级配置可以这样做把你要用的所有 deb 放到同一目录例如/opt/debs然后在目标机上执行cd /opt/debs sudo dpkg-scanpackages . /dev/null Packages但dpkg-scanpackages本身在dpkg-dev包里所以目标机要提前装好dpkg-dev或者直接沿用dpkg -i *.deb路线简单且多数情况下够用。3. 目标机上的安装实操编译、加载、开机自启到了目标机这里思路就非常线性了U盘挂载 → 安装依赖 → 解压源码 → 编译 → 安装模块 → 加载 → 验证 → 配置开机加载。下面按步骤来每一步都有命令和验证方法跟着走基本不会迷路。3.1 把文件和依赖包拷入系统并完成安装把 U 盘插到目标机上使用lsblk查看设备名lsblk一般会看到/dev/sda是系统盘/dev/sdb1是 U 盘分区。如果识别不到 U 盘先检查是不是主板 USB 口问题换个后置 USB 2.0 口试一下。确认分区后挂载sudo mkdir -p /mnt/usb sudo mount /dev/sdb1 /mnt/usb然后看一下文件是否都在ls -l /mnt/usb这里有一个容易踩的坑如果 U 盘是 exFAT 或 NTFS 格式Ubuntu 18.04 自带的图形化文件管理器可能会自动挂载但纯命令行环境读不了因为没有exfat-fuse或ntfs-3g。所以离线拷贝建议直接把 U 盘格式化成 FAT32 或 ext4。FAT32 有 4G 单文件限制但我们的驱动源码和 deb 包都很小完全够用。deb 依赖可能几十个文件但总大小一般不到 400MBFAT32 没问题。接下来安装依赖cd /mnt/usb/debs sudo dpkg -i *.debdpkg 会按照文件名字母顺序安装如果出现依赖顺序问题再执行一次sudo dpkg -i *.deb通常第二次就能把剩余依赖补上。如果提示某个包不存在那就是备料时漏了依赖需要记录下来回准备机补下。不要在这个环节用apt --fix-broken install因为目标机没有网络这条命令会尝试访问软件源然后失败。依赖装完之后验证编译环境gcc --version make --version ls /usr/src/linux-headers-$(uname -r)前面两个输出版本第三个如果能看到build、include等目录就说明 headers 安装成功。如果ls /usr/src/linux-headers-$(uname -r)提示没有这个目录大概率是下载的内核头文件版本不对回头检查uname -r再重新准备。这一步千万不能偷懒很多编译报错都是因为这里没做好。3.2 编译RTL8125内核模块的关键命令依赖装好后开始正式编译cd /mnt/usb tar -jxvf r8125-9.011.00.tar.bz2 cd r8125-9.011.00 sudo make clean makemake clean是为了清掉可能的残留比如在别的内核版本下编译出来的中间文件确保在当前内核下重新编译。make的过程会编译生成r8125.ko文件正常会看到一串 GCC 输出时间通常在 30 秒到 1 分钟。编译过程中最常遇到的失败就是找不到内核构建目录报错信息里会出现类似No rule to make target或/lib/modules/4.15.0-112-generic/build: No such file or directory。这种问题基本都是linux-headers没装回到 3.1 检查。看到成功生成模块后执行安装sudo make install这条命令会把r8125.ko复制到当前内核的模块目录并执行depmod更新模块依赖。之后加载驱动sudo modprobe r8125然后立即验证lsmod | grep r8125 ip link dmesg | tail -n 30ip link中如果出现了类似enp3s0或eno1的新网口并且状态是UP或者NO-CARRIER说明网线没插好或者对端没通都说明驱动已经加载成功。如果dmesg里报module verification failed那基本可以确定是 Secure Boot 在拦截后面 4.2 会专门处理。3.3 加载模块并配置开机自动加载驱动加载成功只是第一步重启后如果模块不自动加载你又得插 U 盘手动modprobe这体验太差了所以一定要做持久化配置。最简单的方法是创建/etc/modules-load.d/r8125.conf内容是模块名echo r8125 | sudo tee /etc/modules-load.d/r8125.conf然后更新模块依赖sudo depmod -a这样重启时 systemd 会读取/etc/modules-load.d/下的配置自动加载r8125。如果你用了 autorun.sh 或 make install官方脚本可能已经写好了类似配置你可以检查一眼cat /etc/modprobe.d/r8125.conf ls /etc/modules-load.d/有内容且没有黑名单冲突就不用重复写。另外我更推荐用 DKMS 来管理这个驱动。DKMS 的机制是把驱动源码注册到系统里之后每当内核升级它会在新内核下自动重新编译、重新安装模块省去“一更新内核网卡又消失”的麻烦。前提是目标机上已经离线安装好dkms包。手动安装 DKMS 的通用流程sudo dkms add -m r8125 -v 9.011.00 sudo dkms build -m r8125 -v 9.011.00 sudo dkms install -m r8125 -v 9.011.00其中-v后面的版本号要和你解压的目录名一致比如r8125-9.011.00目录就填9.011.00。如果官方 Makefile 提供了dkms_install目标部分新版驱动可以直接执行sudo make dkms_install相比之下不用 DKMS 的话内核升级后一定要记得重新回到源码目录执行一次make clean make sudo make install否则开机又会回到“没有网络”的状态。这是很多实际环境里反复踩坑的地方。4. 网口配置与常见问题排查驱动加载成功不代表能上网还需要把网口配置为 DHCP 或静态 IP同时很多人在加载驱动时会遇到各种奇怪报错。下面这两节前半部分讲怎么快速让网口有 IP后半部分把最常见的报错和排查方法列出来。4.1 用命令行快速把网口拉起来先看网口名字ip link假设网口是enp3s0。最简单的方式是让 DHCP 分配地址sudo dhclient enp3s0执行后ip addr show enp3s0应该能看到inet 192.168.x.x之类的地址。如果系统用的是 NetworkManager也可以nmcli device status nmcli device connect enp3s0Ubuntu 18.04 默认用的是 netplan 来管理网络你希望重启后配置不丢建议直接编辑/etc/netplan/01-netcfg.yaml也可能是01-network-manager-all.yaml。最简单的一个 DHCP 配置例子network: version: 2 ethernets: enp3s0: dhcp4: true静态 IP 的例子network: version: 2 ethernets: enp3s0: addresses: - 192.168.1.100/24 gateway4: 192.168.1.1 nameservers: addresses: - 223.5.5.5 - 119.29.29.29写好之后sudo netplan apply如果发现 netplan 配置写错导致连不上可以在 TTY 界面下重新编辑或者先恢复成默认内容再 apply。注意netplan 的 YAML 格式对缩进非常敏感多一个空格少一个空格都可能报错建议在修改前先cp备份一份。最后可以用ethtool enp3s0查看协商速度如果输出Speed: 2500Mb/s说明 2.5G 链路已经建立如果显示1000Mb/s可能网线或交换机只有千兆这是硬件链路问题不是驱动问题。4.2 安装和加载过程中的常见报错及处理我把实际运维中最常见的报错场景和解决办法整理成一张表方便你定位报错场景原因解决办法make报No rule to make target ...linux-headers 未安装或版本不匹配ls /usr/src检查 headers确认uname -r找不到/lib/modules/.../buildheaders 未安装在准备机下载对应内核版本 headers 再 dpkg -imodule verification failedSecure Boot 拦截自编译模块进 BIOS 关闭 Secure Bootmodprobe r8125后网口没有出现模块冲突 / 未安装正确 / 驱动未生成lsmod查看是否加载lspci -k看绑定必要时黑名单 r8169重启后网卡又消失模块没有自动加载写/etc/modules-load.d/r8125.conf或用 DKMSdmesg有unknown symbol模块在不同内核下编译导致make clean后重新编译dhclient一直获取不到 IP网线/交换机/DHCP 问题先看ip linkstate网线插紧用ethtool看 link 状态安装 deb 时提示依赖不满足备料时依赖包不全回准备机补下对应依赖再 target 上重新 dpkg -i表格里几个重点展开说一下。Secure Boot 的问题如果主板开启了 Secure BootLinux 默认只加载带有受信任签名的内核模块自己编译的没有签名就被拒绝。最简单粗暴也最实际的办法就是进 BIOS 关闭 Secure Boot多数主板在Security或Boot菜单里。如果服务器不能随便关那就需要用 DKMS 配合 MOK 证书签名这个流程长得多离线机器上不推荐新手折腾。另一个高发问题是 r8169 冲突。Ubuntu 18.04 内核自带r8169模块它是传统的 RTL8168/8111 驱动但有些内核版本中它也会尝试绑定 RTL8125结果导致官方r8125模块无法正常工作或网口速度异常。遇到这种情况可以先用lspci -k查看当前 RTL8125 设备被哪个驱动占用lspci -k | grep -A2 -i ethernet如果显示Kernel driver in use: r8169说明被占用了。可以先卸载它再加载官方驱动sudo rmmod r8169 sudo modprobe r8125如果验证没问题就把r8169加入黑名单echo blacklist r8169 | sudo tee /etc/modprobe.d/blacklist-r8169.conf sudo update-initramfs -u要注意如果这台机器上还有老款 Realtek RTL8111/8168 网卡比如板载双网口机型黑名单 r8169 会导致老网卡也无法使用。所以操作前一定先想清楚机器上有几张网卡、分别是什么型号。4.3 容易被误判的几个问题第一不要看到./autorun.sh执行完就以为万事大吉。官方脚本执行成功只是驱动被编译并加载了但重启后是否自动加载、内核升级后是否保留不同版本脚本行为不同。我的建议是不要依赖脚本手动做完 3.2、3.3 的步骤然后重启验证一遍。第二不要把“网口灯亮”和“驱动正确”画等号。网口灯亮只代表物理链路通驱动没加载时你看到的灯可能是主板其他逻辑控制的真正判断标准是ip link里是否有对应网口以及ethtool是否报告正确速率。第三依赖包的内核版本必须和目标机完全一致。比如准备机下载的是linux-headers-4.15.0-112-generic但目标机内核是4.15.0-105-generic装上去后/usr/src里没有对应目录编译一样失败。如果目标机上有多个内核可以通过 grub 的高级选项选择对应版本启动也可以把源码带进去后在当前内核下重新编译。第四如果你的机器支持 UEFI 且开启了 Secure Boot装好驱动重启后可能卡在加载阶段此时不要急着怀疑驱动先想想 BIOS 设置。关闭 Secure Boot 后启动再确认dmesg是否有报错。第五如果只是临时需要联网下载工具其实不用急着编译官方驱动可以先用内核自带的r8169模块碰碰运气。有些 RTL8125 设备能被 r8169 识别但只能协商到 1000Mbps先让系统能上网后面再补装官方驱动反而是更顺滑的路。这个技巧在应急时很管用。最后说一个我自己的习惯凡是做这种离线装驱动的机器我都会在 U 盘里多放一个 USB 有线网卡或 USB 无线网卡哪怕是系统能识别的基础型号也行。大多数 USB 网卡在内核里自带驱动插上去就能上网能直接把最难的“离线”问题变成“在线”问题。备料时多花五分钟到现场能省下两小时。RTL8125 的安装本身不难难就难在把依赖、版本、Secure Boot、模块冲突这些问题一次性理清。按照本文的顺序把材料备齐编译和加载基本就不会翻车。