远程唤醒WOL启动服务器或电脑
1. 场景:
因为新型肺炎的原因,交通受阻,无法去公司上班,只能在家远程工作,但是放假前服务器全关掉了,现在也没人去开,然后群里有人说服务器是支持远程唤醒的,可以远程启动,于是启动了部分服务器,但是对于不支持远程唤醒的服务器还是没办法。借此机会总结一下WOL技术的原理和操作方法。
2. 远程唤醒原理(WOL)
2.1 WOL原理
其实是网络唤醒,即Wake-on-LAN,通俗的讲成了远程唤醒。WOL可以实现通过网络启动的主要原因就是来自于网卡对WOL的支持。除此外,还有WOL的扩展Wake-on-Wireless-LAN(WoWLAN),即通过无线网卡来唤醒电脑,同样的也需要无线网卡的支持。不过目前来说,似乎大部分机器都无法直接通过无线网卡来唤醒。
WOL的原理是:通过向网卡发送一个特定格式的数据包,网卡识别到这个数据包之后,配合硬件等设备来启动电脑或者服务器。虽然电脑或服务器关机了,但是如果是支持WOL的网卡,则网卡仍然是通电的,所以仍然能够接受来自局域网络内的数据包。
特定的数据包称为唤醒魔包(Wake on Magic Packet),其数据格式如下:
FF FF FF FF FF FF MAC地址x16 密码段
前6个字节固定FF,后面跟网卡的物理地址重复16次,最后是4-6字节的密码段
将这个16进制的数据转换为二进制后,封装为UDP格式,然后发送到网络中,网卡接收到数据后进行处理,若为自己的MAC地址,则触发开机。
需要注意的是:发送数据包时最好采用UDP广播的形式,即例如192.168.0.255此类的地址,对192.168.0这个网段内的所有地址发送数据包。
2.2 python实现WOL唤醒
import socket
from binascii import a2b_hex
if __name__ == \'__main__\':
addr = \'192.168.0.255\'
port = 9
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
package = \'FFFFFFFFFFFF\'
for i in range(0, 16, 1):
# 网卡地址
package += \'B888E330D465\'
package += \'000000000000\'
udp.sendto(a2b_hex(package), (addr, port))
2.3 Java实现WOL唤醒
public static void main(String[] args) {
try {
InetAddress inetAddress = InetAddress.getByName("192.168.0.255");
int port = 9;
StringBuilder data = new StringBuilder("FFFFFFFFFFFF");
for (int i = 0; i < 16; i++) {
// 网卡地址
data.append("B888E330D465");
}
data.append("000000000000");
byte[] bytes = Hex.decodeHex(data.toString());
DatagramSocket datagramSocket = new DatagramSocket();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, inetAddress, port);
datagramSocket.send(packet);
} catch (DecoderException | IOException e) {
e.printStackTrace();
}
}
3. 远程唤醒操作步骤
3.1 环境说明
身边没有服务器,而且只带了个华为的小本本回来,所以没办法用这个笔记本测试,于是就拿出了8年前买的联想的thinkpad来测试。它网卡是支持WOL的。
3.2 先说测试结果
关机状态无法唤醒,很可能是硬件问题导致的;
睡眠状态下可以成功唤醒。
3.3 操作流程
-
在设备管理器中找到有线网卡,然后在“属性”中开启“魔术封包唤醒”以及“关机 网络唤醒”是否开启,然后在“电源管理”中打开“允许此设备唤醒计算机”。
-
电源管理中关闭“快速启动”
经过测试,“快速启动”对于休眠状态的唤醒无影响,但对于关机后唤醒是否有影响没测试到。
-
记录下网卡地址
找到对应网卡名称的物理地址记下来。
ipconfig/all
-
将待唤醒电脑休眠
-
下载个WOL工具来发送数据包。发送工具手机上以及电脑上都有相应的工具。这里下载个电脑版的,例如AP WOL Tool:
填入IP、MAC地址、子网掩码、端口后,点击start(wow)进行发送魔术包。电脑将被重新唤醒