Linux之WoWLAN无线网络唤醒

什么是 WoWLAN?

WoWLAN 是 Wake on Wireless LAN 的缩写,中文可译为“无线局域网唤醒”。它是一种允许计算机在关闭或处于低功耗状态(如挂起或休眠)时,通过无线网络接收特定的唤醒信号(如 Magic Packet)来重新启动的技术。这种技术特别适用于笔记本电脑或其他移动设备,因为它们通常依赖于无线网络连接。

WoWLAN 是传统 Wake on LAN (WoL) 技术的无线版本。传统的 WoL 通过有线以太网实现,而 WoWLAN 则扩展了这一功能,使其可以通过 Wi-Fi 网络实现。

前面写了一篇关于WoL的记录:
https://notes.z-dd.online/2024/08/21/Linux%E4%B9%8BWOL%E7%BD%91%E7%BB%9C%E5%94%A4%E9%86%92/

WoWLAN 的工作原理

  1. 硬件支持
    要使用 WoWLAN 功能,需要以下硬件支持:

    • 支持 WoWLAN 的无线网卡。
    • 主板 BIOS/UEFI 中启用相关唤醒功能(如 Wake on PCI-E 或类似选项)。
  2. 操作系统支持
    在 Linux 系统中,WoWLAN 功能由内核和无线网卡驱动程序提供支持。常见的无线网卡驱动(如 iwlwifiath9k)通常都支持 WoWLAN。

  3. 唤醒信号
    类似于传统的 WoL,WoWLAN 也依赖特定的唤醒信号。最常见的唤醒信号是 Magic Packet,它是一个包含目标设备 MAC 地址的数据包。此外,还可以配置其他触发条件,例如特定的网络流量模式。

  4. 低功耗模式
    在系统进入挂起或休眠状态时,无线网卡会保持最低功耗的监听模式,等待唤醒信号的到来。一旦接收到匹配的信号,无线网卡会触发系统的唤醒操作。

在 Linux 中启用和配置 WoWLAN

1. 检查无线网卡是否支持 WoWLAN

首先,确认你的无线网卡是否支持 WoWLAN 功能。可以使用以下命令:

iw phy | grep WoWLAN

如果输出中包含 WoWLAN,说明你的无线网卡支持该功能。
比如手上的RTL的wifi输出如下:

WoWLAN support:
		 * wake up on disconnect
		 * wake up on magic packet
		 * wake up on pattern match, up to 12 patterns of 1-128 bytes,
		   maximum packet offset 0 bytes
		 * can do GTK rekeying
		 * wake up on GTK rekey failure
		 * wake up on network detection, up to 4 match sets

有些无线网卡驱动可以需要通过内核参数来配置启用 WoWLAN 功能,具体参数可能因驱动而异。

2. 查看当前 WoWLAN 配置

使用 iw 工具查看当前的 WoWLAN 设置:

iw phy0 wowlan show

其中 phy0 是无线网卡的物理设备名称。你可以通过以下命令列出所有无线网卡:

iw dev

3. 启用 WoWLAN

要启用 WoWLAN,可以使用 iw 命令。例如,启用基于 Magic Packet 的唤醒功能:

iw phy0 wowlan enable magic-packet

你还可以启用其他唤醒条件,例如:

  • any:任何数据包都可以触发唤醒。
  • disconnect:当无线连接断开时触发唤醒。
  • gtk-rekey-failure:当 GTK 密钥重置失败时触发唤醒。

示例:

iw phy0 wowlan enable magic-packet disconnect gtk-rekey-failure

4. 测试 WoWLAN

MagicPacket 唤醒为例,
确保系统进入挂起状态后,尝试通过网络发送 Magic Packet 来唤醒设备。可以使用 etherwakewakeonlan 工具发送 Magic Packet。

示例:

sudo etherwake -i wlan0 <MAC地址>

或者:

wakeonlan <MAC地址>

注意:

  • 可能需要禁用省电模式
    sudo iw dev wlan0 set power_save off  # 禁用省电模式(可能影响 WoWLAN)

    5. 自动配置 WoWLAN(可选)

    如果你希望每次系统挂起时自动启用 WoWLAN,可以在挂起脚本中添加相应的命令。例如,在 systemd 的挂起服务中添加一个自定义脚本:

创建 /etc/systemd/system/wowlan-enable.service 文件:

[Unit]
Description=Enable WoWLAN on suspend
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/usr/bin/iw phy0 wowlan enable magic-packet

[Install]
WantedBy=sleep.target

然后启用并启动该服务:

sudo systemctl enable wowlan-enable.service
sudo systemctl start wowlan-enable.service

注意事项

  1. 电源管理设置
    确保无线网卡的电源管理设置不会干扰 WoWLAN 功能。可以通过以下命令禁用电源管理:

    sudo iwconfig wlan0 power off
  2. BIOS/UEFI 设置
    某些 BIOS/UEFI 可能需要手动启用与 PCIe 或无线网卡相关的唤醒功能。

  3. 网络环境
    WoWLAN 对网络环境有一定的要求。例如,路由器可能需要支持转发 Magic Packet,且目标设备必须在同一个子网中。

  4. 安全性
    使用 WoWLAN 时需要注意安全问题,因为任何能够访问网络的人都可能触发唤醒操作。建议仅在受信任的网络环境中使用,并结合防火墙等措施进行保护。

总结

WoWLAN 是一种非常实用的功能,尤其是在需要远程唤醒移动设备的场景下。Linux 系统提供了强大的工具(如 iwsystemd)来配置和管理 WoWLAN。通过正确配置硬件和软件,可以轻松实现无线唤醒功能。不过,在实际使用中需要注意硬件兼容性、网络环境和安全性等问题。

参考