社区里面已经有很多关于 WOL 的优质文章,写本文的目的是为了丰富社区中关于 WOL 话题的相关内容,UP 会以问题为导向尝试解释一些使用过程中的问题,如果你在折腾 WOL 的过程中遇到了一些困难没有找到答案,那么或许本文能够帮到你。
本文内容较长,没耐心的可以跳到最后一章看总结。如有错误,请不吝惜指正,谢谢!
WOL 的设置过程 UP 就不赘述了,请参考下面其他博主的文章:
少数派文章:《不用开机键,你的 Windows 也能随时就绪:WoL 网络唤醒入门》
网络唤醒是需要硬件支持的,需要满足以下两点(绝大多数现今的电脑都能满足,除非你的电脑真的很老旧):
使用支持 ATX 2.01 标准的电源;
主板需要支持 PCIE 2.2 标准:
在 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 的选项,其中的关键词有(参考自少数派文章):
ACPI
PCIE 设备开机
Automatic Power On
Wake on LAN/WLAN
Power Management
Power On by Onboard LAN
Power On by PCI-E Devices
......
以 Up 的华擎 Z370M Pro4 主板 BIOS 为例,这块主板的 BIOS 中没有很直观的 “wake”、“WOL”等关键字,网络唤醒的开启设置放到了“ACPI 配置 --> PCIE 设备开机”中:
另一个例子是 UP 的公司电脑:
电源关闭后无法唤醒电脑的原因有很多,这一章我们从操作系统层面 —— Windows 的电源管理策略开始讲起。
首先,Windows 官方文档《 System Power States 》中讲述到,Windows 系统自身(抛开 BIOS 不谈)是不支持“快速启动”和“关机”状态下的网络唤醒,只支持“睡眠”、“休眠”状态下的网络唤醒:
睡眠(Sleep),属于 S3 电源状态;
快速启动(Fast Startup),属于 S4 电源状态;
休眠(Hibernate),属于 S4 电源状态;
关机(Soft off),属于 S5 电源状态
对于我们普通用户,电脑的电源状态在我们的感知上无非就“开”和“关”两种,但是对于系统和硬件来说,除了“开”和“关”之外还有很多种状态——ACPI 标准定义了包括 S0~S5 在内的多种电源状态(ACPI Power State),比如我们上面写到的睡眠(Sleep, S3)、休眠(Hibernate, S4)或关机(Soft Off, S5)等,Windows 官方文档《 System Power States 》中就列出了 ACPI 规范中的多种电源状态(Power State) 。
对于“快速启动(fast startup, S4)”:从 Windows 8.1 开始到 Windows 11,“快速启动”作为系统默认的“关机”方式,是不支持网络唤醒的,这也是为什么在 WOL 的教程中会让你关闭“快速启动”:
“快速启动”:快速启动是一种关机类型,它使用休眠文件来加快后续的启动速度,在这种关机状态下,Windows 系统不支持网络唤醒。“快速启动”与“休眠”同属于 S4 电源状态。
“快速启动”属于“hybrid shutdown(混合关机)”,是关机的一种类型:
虽然“快速启动”与“休眠(Hibernate)”同属于电源状态 S4,但 Windows 10 中系统只会对前者禁用网络唤醒;当用户明确指示 Windows 系统进入“休眠”模式时,Windows 是支持网络唤醒的(《Wake on LAN (WOL) behavior in Windows 10》):
官方文档解释了快速启动和休眠这两种电源状态在 WOL 下的区别
有些教程会让你在 Windows 中关闭“休眠”功能来解决网络唤醒无法生效的问题,但很明显不会产生作用,因为 Windows 是支持“休眠”状态下的网络唤醒,造成无法唤醒的原因并不在“休眠”模式上。
对于“关机(soft off, S5)”,Windows 也是不支持网络唤醒的,那么这里就很矛盾了,既然 Windows 不支持关机后网络唤醒,那么网络唤醒这个东西怎么还会存在?
实际这时候产生作用的就是主板了:
主板的硬件支持能让电脑能从“关机(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 可从硬盘中恢复您的工作。如果打开了混合睡眠,让计算机进入睡眠状态的同时,计算机也自动进入了混合睡眠状态。
为什么我关闭了“快速启动”选项依然无法实现唤醒?
在网卡设备的“高级”选项卡中,尝试关闭“节能以太网”、“绿色以太网”、“节能模式”等相关的设置,可参考《Wake on LAN doesn't work when power down from Windows》。
“只允许幻数据包唤醒计算机”建议勾上。
不然会存在电脑被“误”唤醒的情况(虽然几率不大)。因为不是只有这一种数据包能够唤醒电脑,也就是说,你的网卡在待机的过程中,可能会被内部网络上传输的数据包“误导”从而唤醒你的主机。普通家庭网络还好,但如果是企业网络的话,网络环境相对比较“吵杂”,电脑被误唤醒的几率会大一些,因此对于我们来说勾上此选项是不会错的(不勾也是可以的,不勾选是为了利用这一特性来实现网络唤醒,但那种场景绝大多数人接触不到,也没必要。关于“误”唤醒的更多内容,请参考微软官方文章《Unwanted wake-up events occur when you enable the Wake On LAN feature》)。
请安装完整的网卡驱动,否则可能无法实现网络唤醒(参考自 wiki):
关键字:来电开机、深度睡眠
大家看完上面 Windows 下的电源策略后,我们再去看 BIOS 的相关内容就会好理解一些。
这里我们以一个场景来展开:停电了,恢复供电之后网络唤醒却不起作用了,这是为什么?
这种情形等同于把主机的电源线拔掉再插进去。
我们在上文讲过:
如果你设置了网络唤醒,你的电脑在睡眠(S3)、休眠(S4)或关机(S5)时,你的网卡还是会处于待机状态......
再具体点说,电源会向网卡提供 5V 的电流以保证网卡处在待机(Standby)状态,只要网卡保持在待机状态,那么在其他条件都满足的情况下,网卡就可以接收到网络唤醒的信号以实现网络开机。那么当停电后,恢复供电时,由于有些主板不支持恢复到“先前”的状态,对于网卡来说就是无法恢复到“待机”状态,因此这时候网络唤醒就不起作用了。
所以当你在设置 BIOS 时,你需要检查一下你的 BIOS 是否支持“来电开机”或者“断电恢复”:
有些主板的来电恢复功能,能够支持恢复到“上一个状态”,比如说恢复到 S4 或者 S5 状态:
关于 BIOS 的设置,另一方面还需要禁用主板的“深度睡眠”功能,因为在这种状态下是无法实现网络唤醒的。
关于“深度睡眠”,不同的 BIOS 可能叫法不同,有的叫“深度节能模式”,有的叫“超低电量模式”等,但本质上是一样的。
场景:关电脑一段时候后,外网的网络唤醒失效。
原因是因为长时间的离线,导致了路由器 ARP 表中电脑的 MAC 信息被删除,因此外网发过来的数据包无法正确传递到电脑的网卡,从而无法唤醒。
社区里有博主详细讲解过这种情况:
解决办法是在路由器中使用 ARP 绑定功能,将 IP 与 网卡的 MAC 地址进行绑定(UP 这里使用的是 Pandava,ARP 绑定功能在“内网 LAN -> DHCP 服务器 -> 静态 IP 设置”中):
在路由器的端口转发中也要设置好相应的规则:
解决了 ARP 的问题后,那么在这一章,UP 要补充的是关于外网唤醒的一些信息补充。
需要了解的是,唤醒魔包是通过 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”工具之外,还有“eth-wake”、“wol”工具等,可以参考社区里其他博主的文章:
回过头来,对于外网唤醒来说,比较好的一种方式就是通过外网下达指令,来让内网的机器来发起唤醒魔包。就好比上面《使用快捷指令实现WOL开启电脑的》中利用路由器来发起广播从而唤醒电脑。
前面我们讲了很多内容,这里我们做个总结,没有耐心的朋友可以直接看着一部分。
关于在 BIOS 中找不到网络唤醒的选项:
如果在 BIOS 设置中找不到比较明显的“wake”、“WOL”等相关的网络唤醒设置选项,那么请去到电源的相关设置中去查找,关键词包括 ACPI、PCIE 等;
从硬件层面上:
只要能够让电脑的网卡进入待机模式,或者说恢复到待机模式,那么网卡就能接收唤醒指令来执行电脑唤醒,从这一点出发:
Windows 的“睡眠”和“休眠”模式能够使网卡进入待机状态,而“快速启动”这种关机形式则不行,可以利用 powercfg /a 命令查看本机所支持的相关睡眠模式,了解硬件支持的程度;
BIOS 的“深度睡眠”模式(或者其他名字)无法让网卡处在待机模式,需要在 BIOS 中关闭;
BIOS 如果不支持断电恢复的相关功能(“断电恢复”、“来电开机”、“Restore AC Power Loss”等),网卡也就无法恢复到原来的待机模式,这也是为什么会出现停电恢复后无法网络唤醒的情况。
从 Windows 系统层面上:
在设置上,需要排除会影响到网卡待机,或者会让电脑被“误”开机的因素:
关闭“快速启动”设置,这一模式是造成 Windows 7 升级到 Windows 10 后无法唤醒的原因之一;
需要开启“只允许幻数据包唤醒计算机”,避免电脑被“误”唤醒;
如果其他条件都满足下依然无法实现网络唤醒,那么请尝试在网卡设备的“高级”选项卡中关闭“节能以太网”、“绿色以太网”、“节能模式”等相关的“节能”设置;
请安装完整的网卡驱动;
从网络层面上:
关机一段时候后无法外网唤醒电脑,是因为电脑长时间的离线导致了路由器 ARP 表中电脑的 MAC 信息被删除,解决办法是使用路由器的 ARP 绑定功能将 IP 和 MAC 地址进行绑定;
“唤醒魔包”工作在 OSI 模型的第二层,无关 IP 地址、传输协议(TCP或UDP)和端口,所以我们在设置路由器的端口转发时,只要保证在从外网发送过来的唤醒数据包转发到正确的 IP 地址即可,端口号和协议无需太过于关注(只要不影响其他端口转发规则即可);
但如果你想要在 Windows 中测试外网的网络唤醒功能,那么在路由器的端口转发中就需要明确指定 UDP 协议,并且在 Windows 中开放相应的端口来接受转发过来的数据;
个人认为的最佳实践:外网通过 SSH 来命令内网的设备(路由器或主机)发起广播来实现网络唤醒。
好处在于:
无需 ARP 绑定,无需被唤醒的电脑有固定的 IP;
诸如“wakeonlan”等命令可以批量唤醒电脑;
通过 SSH 更安全;
配合相关的软件(如 IOS 的捷径),可以实现方便快捷的一键唤醒(如语音命令 Siri 执行快捷指令);
(完)
阅读全文
笔记本的无线网卡可以关机唤醒吗,试了半天只能睡眠唤醒
真干货,能解决问题。我的机器搞了半天,就是因为快速启动导致无法网络唤醒。
zerotier搭建局域网本身就不稳定,依赖其他节点,所以你开不了机,很正常!
真的是干货,很多方面都涉及了!学习了!我是利用frp作端口映射来实现远程开机,看到你的通过局域网的nas来开启局域网电脑,虽然麻烦点,确实是一种备选方案。
我使用zerotier把openwrt路由器和手机连接成局域网,然后通过openwrt插件网络唤醒来开机,但是刚关机大概十来秒是能看到电脑网卡的,也能唤醒,但是过了一会在插件里面就找不到电脑网卡了,但是网卡灯是亮着的,这是什么情况呢?
我也是华擎的主板。bios打开了pcie设备开机,但是普通关机无法唤醒,只有休眠状态能唤醒
干货赞!
今天想远程桌面老家的电脑,发现不能唤醒了,以前是可以的。网上找原因看到这篇,才知道是半个月前的一次停电导致网卡失去待机状态导致的(远程进老家群晖看到有个异常关机事件)。可能我BIOS里市电恢复后的选项选了POWER OFF,这只有下次回去才能知道了。
但如果设置成POWER ON的话,岂不是每次停电后来电电脑就自己开机了一直浪费电。
Last State这个选项不知道有没有,如果这个可以让网卡恢复到待机状态那就最好了。
笔记本win11最新版本
驱动Install_PCIE_Win11_11016_02232024.exe 最新版
禁用了wifi驱动(这个选项开不开都一样)
节能去掉了,路由器是wrt,erp也设置了
powercfg 只有休眠
bios 只有一个wake on lan ,其他节能相关设置都没有。
笔记本不断电电源+网线连接。
休眠情况下能一直唤醒,休眠 - shutdown - 休眠 - shutdown 这样切换也能保持唤醒
但是单纯shutdown - shutdown 就无效,请问您遇到过这种情况么。
PME打开,节能以太网改成仅唤醒时,幻数据包唤醒打开
没打驱动吗?英特尔网卡打上驱动就有中文了
增加一条:
群晖--控制面板--硬件和电源--启用局域网1的网络唤醒
该开的都开了 rogz790主板 网卡高级设置没有开启pme 关机状态下网卡灯可以亮 h3c路由器也绑定了 还是过一段时间就唤不醒了 前段时间还可以
virtualbox vmware这些虚拟机里装的系统,能wol实现唤醒吗?
不错,脑子学会了,等会回去试试看。谢谢~
请教下,我的nuc12在win11下网卡没有电源管理选项,是不是就不能网络唤醒了?网卡是i225-v,驱动在intel工具里显示为最新。
smzdm已经是我心中的干货圣地了,好难得能找到这篇对于远程开机的介绍,作为一个电脑小白,我觉得其实win系统里有很多实用的设计,但是老百姓用法简单,很多功能可能一辈子都用不上,或者本来有兴趣想试试来着,但是因为看不懂而被劝退了非常可惜。作者这篇介绍非常详细,要是我一开始摸索WOL的时候能看到就太好了!
请问是啥问题
如何联系你,有些wol问题请教
映射外网的端口号是随便搞的吧,有的文章写9,你的文章写999. 。 任意端口映射到外网,外网用magic packet打过去就开机了吧?
有空帮我看一下嘛,sleep可以唤醒,shutdown不行,快速启动已经关了,网络适配器里面wol都开启了,bios里面节能也都disable了。
请选择举报理由