系统更新后,内核错误绑定r8168网卡驱动的解决办法

我在一次系统更新后,网卡驱动变成了r8168,事实上之前我已经删除了这个驱动包,因为用它我的网络受限,用系统内核里的r8169可以正常上网。问了一下系统自带的AI助手,它给了以下答案,实测有用,就是把r8168加入黑名单,系统就不再错误绑定网卡驱动了。以下是智能助手的回答:
要禁用 r8168 驱动、改用系统自带的 r8169 驱动,本质是撤销此前为 Realtek RTL8111/8168 网卡手动安装或启用 r8168 的操作,并确保内核加载的是默认通用驱动 r8169。以下是完整、安全、可逆的操作步骤(适用于 Debian/Ubuntu/Deepin 等主流 Linux 发行版):


:white_check_mark: 一、确认当前实际使用的驱动

在终端中执行:

lspci -k | grep -A 3 -i ethernet

查看输出中类似这一行:

Kernel driver in use: r8168 ← 当前正在运行的驱动

Kernel modules: r8168 r8169 ← 系统可加载的模块(两个都存在)

若显示 r8168 正在使用,说明需禁用它;若已是 r8169,则无需操作。


:white_check_mark: 二、卸载并禁用 r8168 模块

1. 卸载当前已加载的 r8168 模块(立即生效,不重启)

sudo modprobe -r r8168

:warning: 若提示 FATAL: Module r8168 is in use,请先关闭有线网络(如 sudo ip link set enp0s3 down 或断开网线),再重试。

2. 防止开机自动加载 r8168

编辑黑名单配置文件:

sudo nano /etc/modprobe.d/blacklist-r8168.conf

在文件中添加一行:

blacklist r8168

保存退出(Ctrl+O → Enter → Ctrl+X)。

:white_check_mark: 此举可阻止内核在启动时加载 r8168,为 r8169 让出设备绑定权。

3. 确保 r8169 不被屏蔽(检查是否误加了 blacklist r8169)

运行:

grep -r “blacklist r8169” /etc/modprobe.d/

若返回结果(如 /etc/modprobe.d/blacklist.conf: blacklist r8169),请删除该行或注释掉(在行首加 #),否则 r8169 也无法加载。


:white_check_mark: 三、清理 r8168 相关残留(可选但推荐)

• 删除 DKMS 安装的 r8168(如曾用 r8168-dkms 包安装):

sudo apt remove --purge r8168-dkms

sudo dkms status | grep r8168 && sudo dkms remove r8168/8.053.00 --all # 版本号按实际替换

• 删除手动编译安装的 r8168 模块:

sudo rm /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/realtek/r8168.ko

sudo depmod -a

• 清理 initramfs 中的 r8168(关键!否则重启后仍可能加载):

sudo sed -i ‘/r8168/d’ /etc/initramfs-tools/modules

sudo update-initramfs -u -k all

• 清理 /etc/modules 中的 r8168 自启项:

sudo sed -i ‘/r8168/d’ /etc/modules


:white_check_mark: 四、强制让 r8169 接管网卡(关键步骤)

即使 r8168 已卸载,有时设备仍被“绑定”在旧驱动上。需触发重新探测:

卸载当前网卡设备(假设设备号为 0000:02:00.0,通过 lspci -nn | grep 8168 获取)

echo “0000:02:00.0” | sudo tee /sys/bus/pci/drivers/r8168/unbind 2>/dev/null

通知内核重新 probe,自动匹配 r8169

sudo modprobe r8169

sudo sh -c ‘echo “0000:02:00.0” > /sys/bus/pci/drivers/r8169/bind’

:mag: 获取设备号方法:

lspci -nn | grep “10ec:8168|10ec:8111”

输出示例:02:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15)

设备号即:0000:02:00.0(注意补全前缀 0000:)


:white_check_mark: 五、验证是否成功切换为 r8169

lspci -k | grep -A 3 -i ethernet

:white_check_mark: 正确结果应显示:

Kernel driver in use: r8169

Kernel modules: r8168 r8169

再检查网络接口是否恢复:

ip link show | grep -A2 “state UP|state DOWN”

sudo ethtool enp0s3 | grep “Link detected”


:white_check_mark: 六、(可选)永久优化:设置 r8169 优先绑定

为避免未来内核更新后再次错绑,可创建 udev 规则强制绑定:

echo ‘SUBSYSTEM==“pci”, ATTR{vendor}==“0x10ec”, ATTR{device}==“0x8168”, DRIVER==“”, RUN+=“/bin/sh -c ‘echo 0000:%p > /sys/bus/pci/drivers/r8169/bind’”’ | sudo tee /etc/udev/rules.d/99-r8169-priority.rules

sudo udevadm control --reload

:warning: 注意:%p 是 udev 变量,会自动展开为设备路径(如 0000:02:00.0),无需手动填写。


如按以上步骤操作,系统将完全回归使用内核原生 r8169 驱动,r8168 不再参与任何环节。

如遇异常(如无法联网、无网卡设备),可随时恢复:

→ 删除 /etc/modprobe.d/blacklist-r8168.conf

→ 执行 sudo modprobe r8168

→ 重启即可回退。

需要我为你生成一键脚本或适配特定发行版(如 Deepin 23 / Ubuntu 24.04),欢迎随时告知。

2 个赞

在输入这个命令的时候就提示错误了sudo nano /etc/modprobe.d/blacklist-r8168.conf
sudo: nano:找不到命令,怎么办?
我的机子断流也许就这个驱动的问题

sudo apt install nano

能生成一个脚本吗?openkylin 2.0sp2