内核更新后 Realtek 以太网无法工作

内核更新后 Realtek 以太网无法工作

将 CentOS 7.7 内核从 3.10.0-957.27.2 更新到 3.10.0-1062.9.1 后,以太网停止工作。以太网端口上的 LED 不会亮起,任何 ping 操作都会导致“主机无法访问”。

中的文件看起来一切正常/etc/sysconfig/network-scripts,并且中的输出/var/log/messages似乎表明接口正常运行。最后,我启动了较旧的 3.10.0-957.27.2 内核,以太网端口立即开始再次工作。

当我运行时,lspci -nnk它将以太网控制器列为:

07:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 03)
    Subsystem: Realtek Semiconductor Co., Ltd. RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168]
    Kernel driver in use: r8169
    Kernel modules: r8169

两个内核的输出lspci相同,包括正在使用的“r8169”驱动程序。

看起来 Realtek 驱动程序包含在内核中,因为我看到以下目录下有很多 Realtek 文件:

/usr/lib/modules/3.10.0-1062.9.1.el7.x86_64/kernel/drivers/net/ethernet/realtek

但我发现虽然 Realtek 驱动程序文件名相同,但大小和日期已针对较新的内核进行了更新。

让以太网控制器与最新内核协同工作的最佳方法是什么?

答案1

我是 OP,我找到了一个简单的解决方案,感谢 Kate,她在上面评论并提供了一个 CentOS 错误报告的链接。显然,这是 1062 内核中的一个已知问题,驱动程序不知何故没有按正确的顺序加载。

立即激活以太网端口的快速解决方法是卸载 r8169 驱动程序,然后重新加载,但这在重新启动后不起作用:

# rmmod r8169
# modprobe r8169

不过,您可以完全跳过这一步,使用配置文件在正确的时间加载 Realtek 模块,用一行代码即可解决整个问题。我可以确认,这在多次重启后仍然有效:

# echo realtek > /etc/modules-load.d/realtek.conf
(then reboot)

有一件奇怪的事情是,当我从旧的 957 内核启动并执行时,lsmod我发现 realtek 模块也没有被加载,尽管以太网端口工作正常。旧的 957 内核和新的 1062 内核都加载了 r8169 模块。但无论如何,1062 内核没有按正确的顺序加载某些东西,这个修复了这个问题,所以我现在一切都很好了。再次感谢 Kate!

答案2

我遇到的唯一解决方案是:

cat <<EOF| sudo tee /etc/systemd/system/load-realtek-driver.service
[Unit]
Description=Load Realtek drivers.
Before=network-online.target
    
[Service]
Type=simple
ExecStartPre=/usr/sbin/rmmod r8169
ExecStart=/usr/sbin/modprobe r8169
  
[Install]
WantedBy=multi-user.target
EOF
    
sudo systemctl enable load-realtek-driver.service

或者您也可以使用 Nano 或任何其他文本编辑器打开这样的服务文件:

sudo nano /etc/systemd/system/load-realtek-driver.service

然后将其添加到该文件:

[Unit]
Description=Load Realtek drivers.
Before=network-online.target

[Service]
Type=simple
ExecStartPre=/usr/sbin/rmmod r8169
ExecStart=/usr/sbin/modprobe r8169

[Install]
WantedBy=multi-user.target

然后像这样启动服务:

sudo systemctl start load-realtek-driver.service

并启用它以便它可以在重启时启动,如下所示:

sudo systemctl enable load-realtek-driver.service

希望对大家有帮助!

答案3

还可以使用 crontab -e 添加此命令

@reboot sleep 20  && /usr/sbin/rmmod  r8169 && /usr/sbin/modprobe r8169

答案4

这是一个相当老的话题,但仍然存在的问题,我在 2023 年已经解决了,这是由安全启动BIOS/EFI 中的选项。

我想知道有多少人尝试过启动旧内核或尝试收集模块/驱动程序信息并注入更新的模块但无济于事。

只是禁用安全启动选项是我遇到的(唯一)解决方案。Linux 内核模块/驱动程序并不总是经过签名,而且肯定将要与安全机器 BIOS 发生冲突(并被其禁用)。

我认为安全启动造成的问题比它预防或解决的问题还多。

希望这可以帮助。

相关内容