wol


WOL 的设置过程 UP 就不赘述了,请参考下面其他博主的文章:

                              

少数派文章:《不用开机键,你的 Windows 也能随时就绪:WoL 网络唤醒入门

一、为什么我在 BIOS 找不到 WOL 的设置?

网络唤醒是需要硬件支持的,需要满足以下两点(绝大多数现今的电脑都能满足,除非你的电脑真的很老旧):

在 PCIE 2.2 标准之前,那些旧的主板上会有一个用于网络唤醒的接口( WAKEUP-LINK header )需要使用一个特殊的电缆线连接到网卡上才能实现网络唤醒。但是在 PCIE 2.2 标准开始,那些支持此项标准的主板和网卡就不再需要前面所说的网络唤醒电缆线了,因为待机时的电源是通过 PCIE 总线转发的。(参考自 Wiki:Wake-on-LAN

也就是说,如果你设置了网络唤醒,你的电脑在睡眠(S3)、休眠(S4)或关机(S5)时,你的网卡还是会处于待机状态,那么此时网卡待机时所需要的电源就是由 PCIE 总线转发的。

不同的主板对网卡待机的电源策略不同,并不是所有主板都支持网卡在睡眠(S3)、休眠(S4)或关机(S5)时处于待机(Standby)状态。

因此我们在 BIOS 中查找 WOL 有关的设置时,往往需要到电源的相关选项中去寻找关于 WOL 的选项,其中的关键词有(参考自少数派文章):

以 Up 的华擎 Z370M Pro4 主板 BIOS 为例,这块主板的 BIOS 中没有很直观的 “wake”、“WOL”等关键字,网络唤醒的开启设置放到了“ACPI 配置 --> PCIE 设备开机”中:

另一个例子是 UP 的公司电脑:

二、为什么电源关闭后无法唤醒电脑: Windows 电源管理策略和其他设置

(一)Windows 电源管理策略

电源关闭后无法唤醒电脑的原因有很多,这一章我们从操作系统层面 —— Windows 的电源管理策略开始讲起。

首先,Windows 官方文档《 System Power States 》中讲述到,Windows 系统自身(抛开 BIOS 不谈)是不支持“快速启动”和“关机”状态下的网络唤醒,只支持“睡眠”、“休眠”状态下的网络唤醒

对于我们普通用户,电脑的电源状态在我们的感知上无非就“开”和“关”两种,但是对于系统和硬件来说,除了“开”和“关”之外还有很多种状态——ACPI 标准定义了包括 S0~S5 在内的多种电源状态(ACPI Power State),比如我们上面写到的睡眠(Sleep, S3)、休眠(Hibernate, S4)或关机(Soft Off, S5)等,Windows 官方文档《 System Power States 》中就列出了 ACPI 规范中的多种电源状态(Power State) 。

“快速启动”:快速启动是一种关机类型,它使用休眠文件来加快后续的启动速度,在这种关机状态下,Windows 系统不支持网络唤醒。“快速启动”与“休眠”同属于  S4 电源状态。

“快速启动”属于“hybrid shutdown(混合关机)”,是关机的一种类型:

《System Power States》

虽然“快速启动”与“休眠(Hibernate)”同属于电源状态 S4,但 Windows 10 中系统只会对前者禁用网络唤醒;当用户明确指示 Windows 系统进入“休眠”模式时,Windows 是支持网络唤醒的(《Wake on LAN (WOL) behavior in Windows 10》):

官方文档解释了快速启动和休眠这两种电源状态在 WOL 下的区别

有些教程会让你在 Windows 中关闭“休眠”功能来解决网络唤醒无法生效的问题,但很明显不会产生作用,因为 Windows 是支持“休眠”状态下的网络唤醒,造成无法唤醒的原因并不在“休眠”模式上。

微软官方文档解释了 BIOS 的作用

主板的硬件支持能让电脑能从“关机(soft off,S5)”中实现网络唤醒,而 Windows 系统自身是不支持这一特性的。

另外,Windows 7 和 Windows 10 在 WOL 的实现上也是略有区别的,主要的区别就在于 Windows 7 没有“快速启动”。所以就会有人遇到从 Windows 7 升级到 Windows 10 之后网络唤醒失效的情况——其实就是因为 Windows 10 把“快速启动”作为系统默认的一种“关机”方式,导致网络唤醒失效,而由于 Windows 7 没有“快速启动”所以不存在这个问题(具体请参考《Wake on LAN (WOL) behavior in Windows 10》)。要解决此问题,你可能需要在 Windows 10 / 11 中关闭快速启动。

你可以在 CMD 或 Powershell 中使用 powercfg /a 命令查询目前系统上所有可用的、硬件可支持的“睡眠”策略:

之所以强调关于“睡眠”模式,是因为不同的硬件对“睡眠”模式的支持可能会存在较大的差异,这直接影响了 WOL 实现的与否。

关于“睡眠”模式下软硬件环境的状态,可以参考微软的 《System Sleeping States》。

混合睡眠”(更多请参考:HP知识库):混合睡眠是睡眠和休眠的组合 - 它将所有打开的文档和程序保存到内存和硬盘上,然后让计算机进入低耗能状态,以便可以快速恢复工作。如果发生电源故障,Windows 可从硬盘中恢复您的工作。如果打开了混合睡眠,让计算机进入睡眠状态的同时,计算机也自动进入了混合睡眠状态。

(二)其他需要注意的 Windows 设置说明

在网卡设备的“高级”选项卡中,尝试关闭“节能以太网”、“绿色以太网”、“节能模式”等相关的设置,可参考《Wake on LAN doesn't work when power down from Windows》。

不然会存在电脑被“误”唤醒的情况(虽然几率不大)。因为不是只有这一种数据包能够唤醒电脑,也就是说,你的网卡在待机的过程中,可能会被内部网络上传输的数据包“误导”从而唤醒你的主机。普通家庭网络还好,但如果是企业网络的话,网络环境相对比较“吵杂”,电脑被误唤醒的几率会大一些,因此对于我们来说勾上此选项是不会错的(不勾也是可以的,不勾选是为了利用这一特性来实现网络唤醒,但那种场景绝大多数人接触不到,也没必要。关于“误”唤醒的更多内容,请参考微软官方文章《Unwanted wake-up events occur when you enable the Wake On LAN feature》)。

单靠 Windows 自身提供的驱动可能无法实现网络唤醒

三、为什么停电后无法实现网络唤醒:BIOS 的电源管理策略

关键字:来电开机、深度睡眠

大家看完上面 Windows 下的电源策略后,我们再去看 BIOS 的相关内容就会好理解一些。

这里我们以一个场景来展开:停电了,恢复供电之后网络唤醒却不起作用了,这是为什么?

这种情形等同于把主机的电源线拔掉再插进去。

我们在上文讲过:

如果你设置了网络唤醒,你的电脑在睡眠(S3)、休眠(S4)或关机(S5)时,你的网卡还是会处于待机状态......

再具体点说,电源会向网卡提供 5V 的电流以保证网卡处在待机(Standby)状态,只要网卡保持在待机状态,那么在其他条件都满足的情况下,网卡就可以接收到网络唤醒的信号以实现网络开机。那么当停电后,恢复供电时,由于有些主板不支持恢复到“先前”的状态,对于网卡来说就是无法恢复到“待机”状态,因此这时候网络唤醒就不起作用了。

所以当你在设置 BIOS 时,你需要检查一下你的 BIOS 是否支持“来电开机”或者“断电恢复”:

有些主板的来电恢复功能,能够支持恢复到“上一个状态”,比如说恢复到 S4 或者 S5 状态:

断电后恢复到“上一个状态(Last State)”

关于 BIOS 的设置,另一方面还需要禁用主板的“深度睡眠”功能,因为在这种状态下是无法实现网络唤醒的。

关于“深度睡眠”,不同的 BIOS 可能叫法不同,有的叫“深度节能模式”,有的叫“超低电量模式”等,但本质上是一样的。

“Deep Power Off Mode(超低电量模式)”

四、为什么关机一段时候后外网无法网络唤醒:Magic Packet 与外网设置

场景:关电脑一段时候后,外网的网络唤醒失效

原因是因为长时间的离线,导致了路由器 ARP 表中电脑的 MAC 信息被删除,因此外网发过来的数据包无法正确传递到电脑的网卡,从而无法唤醒。

社区里有博主详细讲解过这种情况:

解决梅林路由长时间关机无法WOL唤醒群晖NAS问题并实现路由开机自动唤    #家庭Wi-Fi布网 #如何玩转NAS      作者:木头怀                                     

  为广域网WoL远程开机解决OpenWrt ARP绑定(IP/MAC绑定)无效的问题  #社区数码TAB #购物攻略 #家庭Wi-Fi布网  作者:永恒星空                             

解决办法是在路由器中使用 ARP 绑定功能,将 IP 与 网卡的 MAC 地址进行绑定(UP 这里使用的是 Pandava,ARP 绑定功能在“内网 LAN -> DHCP 服务器 -> 静态 IP 设置”中):

在路由器的端口转发中也要设置好相应的规则:

解决了 ARP 的问题后,那么在这一章,UP 要补充的是关于外网唤醒的一些信息补充。

(一)唤醒魔包(Magic psacket)与端口转发

需要了解的是,唤醒魔包是通过 OSI 网络模型中的“数据链路层”(二层)传播的,因此无关 IP、无关传输协议(TCP、UDP),网卡只要识别到特定广播帧就可以唤醒电脑。

但是由于路由器是工作在网络层(第三层),想要通过外网唤醒电脑,那么就要在路由器的端口转发中,向外网暴露相应的端口来接收唤醒魔包,并指定所要唤醒电脑的 IP 地址。

以 Up 来说,通过暴露到外网的 19999 端口来接收唤醒数据包,并转发到对应的 IP 地址:

在这个场景下,不需要强调传输协议和内网端口。我们前面讲过,唤醒魔包工作在第二层,无关 IP、无关传输协议,因此只要告诉路由器要转发到的 IP 地址,那么在 ARP 绑定的作用下,路由器就知道 IP 地址背后网卡的 MAC 地址,因此网卡就能够接收到数据包并唤醒电脑。因此,不管上面我们用什么端口号(在不影响其他端口的情况下)或者协议( TCP 或者 UDP ),都不影响我们唤醒电脑。

关于上述的原理,可参考:《Can I send a Wake On LAN packet without broadcasting?

但是,如果你在开机的情况下,想要在 Windows 中(或其他系统)测试外网唤醒,那么这种时候你就需要在路由器的端口转发规则中指定对应的端口号和协议,以便让路由器把数据包转发到 Windows 系统上。那么在这种情形下,网络唤醒则采用 UDP 协议传输。这里有篇文章说明了网络唤醒所使用的端口是否有讲究,并且也说明了网络唤醒数据包的工作原理:《Does it matter what UDP port a WOL signal is sent to?》。

(二)外网唤醒的最佳实践:通过内网唤醒

我们前面知道,如果要实现外网唤醒,需要通过 ARP 绑定来让路由器知道网卡的 MAC 地址,这种情况就需要把 IP 地址固定下来。但如果说你不知道电脑的 IP 地址,只知道网卡的 MAC 地址,那么这种时就没办法来使用 ARP 绑定。

在这种情况下,我们就可以利用内网的相关特性来实现网络唤醒。

首先我们要理解,“唤醒魔包(Magic Packet)”是一种广播帧,而路由器是无法转发广播帧的,这也就是为什么我们需要使用路由器的 ARP 绑定功能,来让路由器把外网传过来的唤醒魔包精确地转发到对应电脑的网卡上。

但是在内网下,则可以在子网内广播唤醒魔包,让内网下所有电脑的网卡都接收到数据包,当对应的网卡发现唤醒魔包内的 MAC 地址与自己 MAC 地址对应上时就会唤醒电脑,而发起唤醒数据包的一方就不需要知道想要唤醒的那一台电脑的 IP 地址。

举个例子,Up 的 NAS 虚拟机上安装了一个 Debian 系统,通过“wakeonlan”命令即可以广播唤醒魔包:

wakeonlan 命令说明

此命令还可以实现批量唤醒多个网卡

除了“wakeonlan”工具之外,还有“eth-wake”、“wol”工具等,可以参考社区里其他博主的文章:

      使用快捷指令实现WOL开启电脑的   #社区数码TAB #购物攻略    作者:wilson_alex                                   

       科普下电脑网络唤醒开机的那些事     #购物攻略    作者:开不了口k  22          

     捡垃圾 篇二:天猫精灵 实现 电脑开机 (使用 uhttp cgi webhook  #社区数码TAB #购物攻略 #我爱捡垃圾  作者:Titanium 17                              

回过头来,对于外网唤醒来说,比较好的一种方式就是通过外网下达指令,来让内网的机器来发起唤醒魔包。就好比上面《使用快捷指令实现WOL开启电脑的》中利用路由器来发起广播从而唤醒电脑。

五、总结

前面我们讲了很多内容,这里我们做个总结,没有耐心的朋友可以直接看着一部分。

关于在 BIOS 中找不到网络唤醒的选项

硬件层面上:

只要能够让电脑的网卡进入待机模式,或者说恢复到待机模式,那么网卡就能接收唤醒指令来执行电脑唤醒,从这一点出发:

Windows 系统层面上:

在设置上,需要排除会影响到网卡待机,或者会让电脑被“误”开机的因素:

网络层面上:

个人认为的最佳实践:外网通过 SSH 来命令内网的设备(路由器或主机)发起广播来实现网络唤醒。

好处在于:

 


豫ICP备12024565号-1   E-mail:admin@hlc8.com