PVE 系统 2.5G网卡驱动从 r8169 切换到 r8125(实战完整记录)
一、概述
很多主板上自带的 2.5G 网卡是 Realtek RTL8125,
在 Proxmox VE (PVE) 下,系统默认会使用通用驱动 r8169,可以用,但性能和稳定性一般。
目标 :在不重装系统的前提下,把两张 RTL8125 网卡的驱动从 r8169 切换到专用的 r8125 驱动,并且保证重启后仍然生效。
整篇文章是基于一次真实的成功操作过程 整理而成,所有关键命令后面都附上了实战执行日志(节选),技术小白照着做也能完成。
命令清单(熟手可只看这一段、小白继续往后看)
适合已经有一定 Linux / PVE 基础的用户,按顺序执行即可。
详细解释、日志示例见后面的完整教程。
bash
# 0. 确认当前驱动(可选)
lsmod | grep -E "r8169|r8125|r8168"
lspci -k | grep -A 3 RTL8125
# 1. 安装 dkms 和内核头文件
apt update
apt install -y dkms pve-headers-$(uname -r)
# 2. 下载并进入 r8125 源码目录
cd /tmp
git clone https://github.com/awesometic/realtek-r8125-dkms.git
cd /tmp/realtek-r8125-dkms
# 3. 使用 dkms 安装 r8125 驱动
./dkms-install.sh
dkms status
# 4. 拉黑旧驱动 r8169
echo "blacklist r8169" > /etc/modprobe.d/blacklist-r8169.conf
cat /etc/modprobe.d/blacklist-r8169.conf
# 5. 更新 initramfs
update-initramfs -u
# 6. 预加载 r8125(可选)
modprobe r8125
lsmod | grep -E "r8169|r8125"
# 7. 重启
reboot
# 8. 重启后验证(重点看 r8125 是否生效)
lspci -k | grep -A 3 RTL8125
lsmod | grep -E "r8169|r8125"
ip link show
ping -c 3 192.168.1.2 # 换成你的网关 IP
二、环境信息(方便你对照自己的环境)
- 系统: Proxmox VE
- 内核版本 :
Linux 6.8.12-4-pve (2024-11-06T15:04Z) - 网卡型号 : Realtek
RTL8125 2.5GbE Controller - 网卡数量: 2 张
- 原始驱动 :
r8169 - 目标驱动 :
r8125(通过 DKMS 安装,版本9.016.01)
三、整体操作流程总览
给一个整体图,心里有数:
- 确认当前网卡和驱动情况
- 确认系统还没有 r8125 驱动
- 安装 dkms + 内核头文件
- 下载 r8125 源码(realtek-r8125-dkms)
- 用 dkms 编译并安装 r8125 驱动
- 把旧驱动 r8169 拉入黑名单
- 更新 initramfs
- 加载 r8125 驱动并重启
- 重启后验证:网卡是否已经使用 r8125 驱动,网络是否正常
下面按这个顺序,一步步来。
四、前置检查:现在网卡在用什么驱动?
1.1 查看当前加载的网卡驱动模块
bash
lsmod | grep -E "r8169|r8125|r8168"
实战输出(节选):
text
root@pve:~# lsmod | grep -E "r8169|r8125|r8168"
r8169 110592 0
说明当前只加载了 r8169,还没有 r8125。
1.2 查看 RTL8125 网卡使用的内核驱动
bash
lspci -k | grep -A 3 RTL8125
实战输出:
text
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
Subsystem: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller
Kernel driver in use: r8169
Kernel modules: r8169
--
04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 04)
Subsystem: Micro-Star International Co., Ltd. [MSI] RTL8125 2.5GbE Controller
Kernel driver in use: r8169
Kernel modules: r8169
可以看到,两张 RTL8125 网卡都在使用 r8169 驱动。
1.3 看一下网卡接口和网桥绑定情况
bash
ip link show
实战输出(节选):
text
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr1 state UP group default qlen 1000
link/ether 88:c9:b3:bb:d2:1f brd ff:ff:ff:ff:ff:ff
3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UP group default qlen 1000
link/ether 2c:f0:5d:da:a1:ab brd ff:ff:ff:ff:ff:ff
5: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
6: vmbr1: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
结合路由(ip route show)可以确认:
enp4s0通过vmbr0是 管理口/默认路由enp1s0通过vmbr1用作其他用途
结论:两张网卡都在工作,且都在使用
r8169,我们切换驱动会同时影响两张网卡。
五、确认系统是否已有 r8125 驱动
bash
# 查找内核模块目录里有没有 r8125
find /lib/modules/$(uname -r) -name "*r8125*" -o -name "*8125*"
# 查看 dkms 状态
dkms status
实战输出:
text
root@pve:~# find /lib/modules/$(uname -r) -name "*r8125*" -o -name "*8125*"
root@pve:~#
text
root@pve:~# dkms status
-bash: dkms: command not found
说明:系统目前既没有安装 dkms,也还没有 r8125 驱动模块,需要从源码安装。
六、安装 dkms 和内核头文件
2.1 更新软件源
bash
apt update
实战输出(节选):
text
Hit:1 https://mirrors.ustc.edu.cn/debian bookworm InRelease
...
Err:7 https://enterprise.proxmox.com/debian/ceph-quincy bookworm InRelease
401 Unauthorized [IP: 51.79.228.122 443]
...
E: The repository 'https://enterprise.proxmox.com/debian/ceph-quincy bookworm InRelease' is not signed.
说明:上面的 401 错误是 PVE 企业版 Ceph 仓库 没有订阅导致的,
不影响我们后续安装 dkms 和内核头文件,可以忽略。
2.2 安装 dkms 和对应内核头文件
这里使用你实战中成功的命令:
bash
apt install -y dkms pve-headers-$(uname -r)
在你的环境中,命令的实战输出如下:
text
root@pve:~# apt install -y dkms pve-headers-6.8.12-4-pve
Note, selecting 'proxmox-headers-6.8.12-4-pve' instead of 'pve-headers-6.8.12-4-pve'
dkms is already the newest version (3.0.10-8+deb12u1).
...
Setting up proxmox-headers-6.8.12-4-pve (6.8.12-4) ...
小结:
dkms安装完成(或提示已是最新)。- 成功安装了与你当前内核匹配的头文件
proxmox-headers-6.8.12-4-pve。
如果你的系统里没有 git,顺手安装一下(你那边已有 git,这条是给其他读者用的):
bash
apt install -y git
七、下载 r8125 驱动源码(realtek-r8125-dkms)
3.1 切换到临时目录并克隆仓库
bash
cd /tmp
git clone https://github.com/awesometic/realtek-r8125-dkms.git
实战输出:
text
root@pve:/tmp# git clone https://github.com/awesometic/realtek-r8125-dkms.git
Cloning into 'realtek-r8125-dkms'...
remote: Enumerating objects: 617, done.
remote: Counting objects: 100% (206/206), done.
...
Resolving deltas: 100% (437/437), done.
确认目录存在:
bash
cd /tmp/realtek-r8125-dkms
ls -la
实战输出(节选):
text
drwxr-xr-x 5 root root 4096 Nov 23 19:41 .
drwxrwxrwt 9 root root 4096 Nov 23 19:41 ..
-rw-r--r-- 1 root root 2469 Nov 23 19:41 autorun.sh
drwxr-xr-x 3 root root 4096 Nov 23 19:41 debian
-rw-r--r-- 1 root root 379 Nov 23 19:41 dkms.conf
...
drwxr-xr-x 2 root root 4096 Nov 23 19:41 src
查看 dkms 配置,确认模块名称和版本:
bash
cat dkms.conf
实战输出:
text
PACKAGE_NAME="realtek-r8125"
PACKAGE_VERSION="9.016.01"
...
BUILT_MODULE_NAME[0]="r8125"
BUILT_MODULE_LOCATION[0]="src"
DEST_MODULE_LOCATION[0]="/updates"
AUTOINSTALL="yes"
八、用 dkms 编译并安装 r8125 驱动
4.1 一键安装(推荐)
在 /tmp/realtek-r8125-dkms 目录下执行:
bash
cd /tmp/realtek-r8125-dkms
./dkms-install.sh
实战输出(节选):
text
About to run dkms install steps...
Creating symlink /var/lib/dkms/r8125/9.016.01/source -> /usr/src/r8125-9.016.01
...
Building module:
Cleaning build area...
'make' -j12 KVER=6.8.12-4-pve BSRC=/lib/modules/6.8.12-4-pve modules......
Signing module /var/lib/dkms/r8125/9.016.01/build/src/r8125.ko
...
r8125.ko:
- Installation
- Installing to /lib/modules/6.8.12-4-pve/updates/dkms/
depmod...
Finished running dkms install steps.
看到
Finished running dkms install steps.基本就说明驱动已经编译并安装成功了。
4.2 确认模块文件和 dkms 状态
bash
# 确认内核模块文件存在
ls -la /lib/modules/$(uname -r)/updates/dkms/r8125.ko
# 查看 dkms 状态
dkms status
实战输出:
text
root@pve:~# ls -la /lib/modules/$(uname -r)/updates/dkms/r8125.ko
-rw-r--r-- 1 root root 505869 Nov 23 19:43 /lib/modules/6.8.12-4-pve/updates/dkms/r8125.ko
text
root@pve:~# dkms status
r8125/9.016.01, 6.8.12-4-pve, x86_64: installed
至此,新驱动已经"装进系统"里了,接下来要做的是:让内核优先用 r8125,而不是 r8169。
九、把旧驱动 r8169 拉入黑名单
5.1 写入黑名单配置
bash
echo "blacklist r8169" > /etc/modprobe.d/blacklist-r8169.conf
cat /etc/modprobe.d/blacklist-r8169.conf
实战输出:
text
root@pve:~# cat /etc/modprobe.d/blacklist-r8169.conf
blacklist r8169
这一步的意思是:告诉内核 以后不要自动加载 r8169 模块。
十、更新 initramfs(让重启后也生效)
修改了内核模块相关配置后,需要更新 initramfs:
bash
update-initramfs -u
实战输出(节选):
text
update-initramfs: Generating /boot/initrd.img-6.8.12-4-pve
Running hook script 'zz-proxmox-boot'..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
到这里,重启后系统会按新的 initramfs 配置来加载模块。
十一、重启前先手动加载 r8125(验证模块正常)
这一步不是必须,但可以提前确认 r8125 模块本身没有问题。
bash
# 手动加载 r8125 模块
modprobe r8125
# 看一下当前内存中加载了哪些网卡驱动
lsmod | grep -E "r8169|r8125"
# 看一下 r8125 模块的详细信息
modinfo r8125 | head -20
实战输出(节选):
text
root@pve:~# lsmod | grep -E "r8169|r8125"
r8125 307200 0
r8169 110592 0
text
root@pve:~# modinfo r8125 | head -20
filename: /lib/modules/6.8.12-4-pve/updates/dkms/r8125.ko
version: 9.016.01-NAPI
license: GPL
description: Realtek r8125 Ethernet controller driver
...
说明:此时 r8125 模块已经加载进内存 ,但网卡仍然在用 r8169,
真正切换需要 重启之后,由系统重新为网卡绑定驱动。
十二、重启系统,让网卡真正切换到 r8125
bash
reboot
等待系统重启完成后,从控制台或 SSH 登陆,再做下面的验证。
十三、重启后的验证:确认已经在用 r8125
8.1 再次查看网卡使用的内核驱动
bash
lspci -k | grep -A 3 RTL8125
实战输出:
text
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
Subsystem: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller
Kernel driver in use: r8125
Kernel modules: r8169, r8125
--
04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 04)
Subsystem: Micro-Star International Co., Ltd. [MSI] RTL8125 2.5GbE Controller
Kernel driver in use: r8125
Kernel modules: r8169, r8125
重点看这一行:
Kernel driver in use: r8125说明 两张 RTL8125 网卡都已经在使用 r8125 驱动。
8.2 确认内存中只加载了 r8125,没有 r8169
bash
lsmod | grep -E "r8169|r8125"
实战输出:
text
root@pve:~# lsmod | grep -E "r8169|r8125"
r8125 307200 0
只有
r8125,没有r8169,说明黑名单生效了。
8.3 检查网卡接口状态
bash
ip link show
实战输出(节选):
text
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr1 state UP mode DEFAULT group default qlen 1000
link/ether 88:c9:b3:bb:d2:1f brd ff:ff:ff:ff:ff:ff
3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP mode DEFAULT group default qlen 1000
link/ether 2c:f0:5d:da:a1:ab brd ff:ff:ff:ff:ff:ff
5: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
6: vmbr1: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
可以看到:
- 接口都处于
UP状态 - 队列类型从之前的
pfifo_fast变成mq(多队列),这是 r8125 驱动的一个特征
8.4 测试网络是否正常
bash
ping -c 3 192.168.1.2
实战输出:
text
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.734 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.677 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.904 ms
...
3 packets transmitted, 3 received, 0% packet loss
说明:默认网关可达,网络工作正常,驱动切换完成。
十四、多网卡场景注意事项(本机有 2 张 RTL8125)
-
两张网卡会一起切换驱动
因为它们都是 RTL8125,都由同一个内核模块
r8169/r8125驱动。 -
先认清管理口是哪一张
一般 PVE 的 Web 管理口在
vmbr0上,你的实战环境中是:enp4s0→vmbr0→ 默认路由enp1s0→vmbr1
-
切换过程中网络会短暂中断
尤其是重启那一步,因此强烈建议:
- 在机房现场操作,或者
- 有 IPMI / iKVM / 显示器 + 键盘可以直连机器
十五、故障排查建议
问题 1:重启后网卡不工作 / 没有 IP
可能原因:
initramfs没有更新成功- 黑名单没生效,
r8169仍然被加载 r8125没有成功编译安装
建议排查命令:
bash
# 再次确认黑名单
cat /etc/modprobe.d/blacklist-r8169.conf
# 重新更新 initramfs
update-initramfs -u
# 检查 dkms 状态
dkms status
问题 2:加载 r8125 报错 / 网卡不认
可能原因:
- 内核版本和驱动版本不兼容
- 编译时缺少依赖
排查思路:
bash
# 看内核日志里关于 r8125 的报错
dmesg | grep -i r8125
journalctl -k | grep -i r8125
# 重新编译安装一次
cd /tmp/realtek-r8125-dkms
./dkms-remove.sh
./dkms-install.sh
问题 3:无法卸载 r8169 模块
如果你在网卡正在工作的时候执行:
bash
modprobe -r r8169
很可能会失败,这是正常的。
正确做法是:写黑名单 + 更新 initramfs + 重启 ,
让系统在启动时就不要再加载 r8169,而不是"在线热拔"。
十六、如何回滚到 r8169(如果你想恢复原状)
如果切换后不满意,或者遇到兼容性问题,可以按下面步骤回退:
bash
# 1. 删除 r8169 黑名单
rm /etc/modprobe.d/blacklist-r8169.conf
# 2. 卸载 r8125 模块(如果当前已加载)
modprobe -r r8125 || true
# 3. 更新 initramfs
update-initramfs -u
# 4. 重启系统
reboot
重启后,系统会重新使用内核自带的 r8169 驱动。
十七、小结
- 这篇文章完整记录了 从 r8169 切换到 r8125 的实战全过程 ,所有关键命令都有对应的真实执行日志。
- 关键点只有三个:
- 用 dkms 安装好 r8125 模块
- 把 r8169 拉黑(blacklist)
- 更新 initramfs 并重启
- 切换完成后,你可以获得:
- 更好的 2.5GbE 性能
- 更稳定的连接
- 多队列(
mq)等更好的特性支持
参考链接
测试环境: Proxmox VE, Linux 6.8.12-4-pve