局域网唤醒在 Windows 中有效,但在 Ubuntu 16.04 中无效

局域网唤醒在 Windows 中有效,但在 Ubuntu 16.04 中无效

我正在运行 16.04 服务器,并且已通过以下方式设置了局域网唤醒

{ethtool - s <NIC> wol g}

{auto <NIC>
iface <NIC> inet dhcp
up ethtool -s <NIC> wol g}

/etc/network/interfaces

我用rtcwake -m mem它来测试,但无法启动服务器。我使用 ngrep 来控制服务器接收魔术包,并尝试在服务器上安装 Windows 以确认硬件支持 WOL。

其他人报告说,他们可以通过电源按钮关闭来解决此问题,但这没有任何效果。

我错过了什么?

答案1

我找到了解决方案

该问题是由于 sky2 NIC 驱动程序中的一个错误而引起的,该错误显然已经存在好几年了。

可以使用评论中描述的 setpci 方法解决本文

我有一台 Shuttle 设备,配有 Marvell Technology Group Ltd. 88E8056 PCI-E 千兆以太网控制器(修订版 12)。我一直在运行 Ubuntu 10.04 LTS 和 XBMC,使用 Sky2 驱动程序 v1.25。在此设置下,WOL 运行良好。

作为另一个故事的一部分,我最近不得不升级到 12.04 LTS,并遇到了 WOL 问题,Sky2 v1.30 不再起作用

在 sky2_wol_init 函数期间,Sky2 驱动程序由于 Y2_HW_WOL_ON 和 Y2_HW_WOL_OFF 的参数处理以及寄存器写入而失败。

我绝不是 Linux 开发人员,但使用lspcisetpci命令的组合,我嗅出了 Marvell 设备中由驱动程序 v1.25 和驱动程序 v1.30 设置的寄存器,现在在运行 v1.30 驱动程序时使用 setpci 手动设置寄存器。Wakeonlan 再次与 12.04 LTS 和 v1.30 驱动程序配合使用,无需重新编译!

该寄存器(在我的系统中)位于 0x41,需要将其值设置为 0x80。我的 Marvell 芯片位于 PCI 总线上的 02:00.0,使用 可以找到lspci

我在用于运行 ethtool 序列的相同启动脚本中添加了此命令:

setpci -s 02:00 41.b=80

所以,这是一个卑鄙的黑客行为,但效果很好。如果我知道如何在我的系统上构建内核驱动程序,我会修复 sky2.c 驱动程序……

尽管我没有与海报相同的控制器,但它仍然有效。

相关内容