通过网络唤醒远程 Linux 主机
当想要从外边连接家里的电脑主机时,可以通过搭建虚拟私有网络进行访问(比如可以参考旧文《使用 Nebula 搭建点对点的虚拟私有网络》)。但是家里的电脑主机并不总是开机,因此还需要先开机才行。幸运的是,可以利用 Wake-on-LAN
(网络唤醒)技术,动动小手,即可远程开机。
当然,首先需要进行一番设置才行。这需要设置路由器、电脑BIOS,以及网卡。
设置 🔗
设置路由器 🔗
目前很多路由器都支持远程配置,比如对于我的TP-LINK路由器,可以通过手机上的“TP-LINK物联”移动应用进行远程配置。进入路由器的“设置”-“更多功能”:
然后点击“远程唤醒设置”-”添加设置“,此时可以看到当前通过有线网络连接到路由器的所有设备。接着把电脑主机添加到“远程唤醒设备”列表即可。
设置 BIOS 🔗
如果有主板的说明书,那么可以首先确认一下电脑主板是否支持“远程唤醒”或者“远程开机”。找不到的话,就在网上找找资料确定一下。不同的电脑主板,可能有不同的设置项。
对于我的微星主板来说,电脑通电后,按住Del
键,即可进入BIOS设置
中,主要进行如下设置:
- “高级”-“整合周边设备”-“网卡ROM启动”:设置为“允许”
- “高级”-“电源管理设置”-“ERP Ready”:设置为“禁止”
- “高级”-“唤醒事件设置”-“PCIE设备唤醒”:设置为“允许”
设置网卡 🔗
进入 Linux 服务器后,安装 ethtool
工具:
sudo apt-get install -y ethtool
然后通过 ip addr
列出当前的网络接口,通过 IP 地址找到网卡,即 Network Interface Card,简称 NIC
。在我的机器上,它是 enp42s0
。然后参考 Ubuntu 的帮助文档《Enabling WoL in the NIC 》,逐步设置。
首先执行:
sudo ethtool <NIC>
这条命令会返回这个设备(即NIC)的能力。其中如果包含类似如下的一行:
Supports Wake-on: <letters>
并且 <letters>
里包含了字母g
,那么说明这个网卡设备是支持网络唤醒的“魔法包”的。此时,在这条命令的输出中,还会包含如下一行:
Wake-on: <letters>
如果这里的 <letters>
里包含了 g
而不是 d
,那么说明网络唤醒是开启的;如果 <letters>
里包含了 d
,那么说明还没有开启。那么使用如下命令开启(主机将<NIC>
替换为真实的设备名称,比如enp42s0
):
sudo ethtool -s <NIC> wol g
在系统每次启动后自动启用网络唤醒 🔗
在完成以上配置,尽管可以完成网络唤醒。但是每次启动后,网络唤醒又被禁用了。因此,需要在每次开机后,再次启用。在 Ubuntu 的 WakeOnLan 文档中,提到了通过修改 /etc/network/interfaces
文件达到这个目的。但是在 Ubuntu 22.04 LTS 上,并没有这个文件。但是,可以在 /etc/network/if-up.d/
创建脚本。关于 /etc/network/interfaces
的说明,参见 interfaces的文档。
于是,使用 sudo
创建 /etc/network/if-up.d/wol
文档:
sudo touch /etc/network/if-up.d/wol
sudo chmod +x /etc/network/if-up.d/wol
其内容如下:
#!/bin/sh
ETHTOOL=/sbin/ethtool
test -x $ETHTOOL || exit 0
ethtool -s enp42s0 wol g
测试 🔗
完成以上配置后,在图形界面关闭电脑,或使用 sudo shutdown now
关闭电脑。电脑关机后,打开“TP-LINK物联”移动应用里,再次进入“设置”-“更多功能”-“远程唤醒设置”。在设备列表中,可以看到之前添加的设备此时是“离线”状态,此时点一下“唤醒”按钮,就会听到电脑主机开机了。为了验证在每次系统启动能够自动启用网络唤醒,请务必多测试几次。
注意:在命令行中应该使用
shutdown
命令关闭电脑,而不是halt
命令。因为halt
命令是关闭操作系统,但不会在硬件上关机;而shutdown
不仅关闭系统,也关闭硬件(即断电)。经测试,使用halt
关闭系统后,在我的电脑上是无法进行网络唤醒的。
原理简述 🔗
“远程唤醒”的原理是计算机的网卡在关机或者睡眠状态下仍然可以监听网络上的特定数据包,当收到特定格式的数据包时,就会触发计算机从低功耗状态唤醒。这个数据包,也被称为 Magic Packet,即“魔法包”。