这次配置 WOL 的目标很明确:让这台 Arch Linux 主机在关机后仍能通过局域网 Magic Packet 唤醒。实际排查时,关键并不是把一条命令跑通,而是先确认真正负责唤醒的有线网卡,再把设置写进 NetworkManager 的连接配置,最后确认 PCI 设备在关机状态下仍允许唤醒。

当前这台机器的有线控制器是 Realtek RTL8125 2.5GbE,内核使用 r8169 驱动。最终采用 NetworkManager 的 802-3-ethernet.wake-on-lan=magic,没有手动写死 hidraw 一类会变化的设备编号,也没有为了应用设置主动断开当前网络。

0. 当前机器与目标参数

先把这次实机环境记下来,后面每一步的判断都基于这些结果:

项目

实际值

说明

系统

Arch Linux,内核 7.1.5-arch1-2

x86_64

有线接口

enp130s0

当前 UP,连接名为 Wired connection 1

网卡

Realtek RTL8125 2.5GbE

内核驱动 r8169

MAC

8C:32:23:3B:46:F3

发送 Magic Packet 时使用

IPv4

192.168.1.212/24

网关 192.168.1.1

无线接口

wlp129s0f0

当前未连接,本次不使用

目标不是让无线网卡参与 WOL,而是让 enp130s0 在关机后监听目的 MAC 为 8C:32:23:3B:46:F3 的 Magic Packet。

1. 先确认网卡、连接和驱动

第一步不要直接对默认网卡名执行配置。接口名、NetworkManager 连接名和 PCI 驱动是三个不同层次,先分别确认:

uname -a
cat /etc/os-release
ip -brief link
nmcli -t -f DEVICE,TYPE,STATE,CONNECTION device status
readlink -f /sys/class/net/enp130s0/device/driver
lspci -nnk | sed -n '/Ethernet controller/,+3p'

这次得到的关键结果是:

enp130s0        UP      8c:32:23:3b:46:f3
wlp129s0f0      DOWN    2e:e1:b5:62:dc:b8
enp130s0:ethernet:connected:Wired connection 1
/sys/bus/pci/drivers/r8169
Realtek RTL8125 2.5GbE Controller [10ec:8125]

因此后面的对象必须写成连接名 Wired connection 1、设备名 enp130s0,不能把无线接口的 MAC 当成唤醒地址。

2. 发现默认 WOL 没有被 NetworkManager 强制打开

查询连接配置:

nmcli -f connection.id,connection.interface-name,802-3-ethernet.wake-on-lan   connection show 'Wired connection 1'

原始结果为:

connection.id:                          Wired connection 1
connection.interface-name:              enp130s0
802-3-ethernet.wake-on-lan:             default

default 不是“已经确认使用 Magic Packet”,而是把决定权留给驱动和系统默认值。为了让重启、重新连接后仍保持同一行为,需要把它改成明确的 magic

这台机器当时没有安装 ethtool,所以没有把“驱动当前显示的 Wake-on 字段”误当成已验证结果。NetworkManager 已经提供了持久化入口,先用它完成配置;需要查看驱动能力时再额外安装 ethtool。

3. 用 NetworkManager 设置 Magic Packet

执行下面两条命令:

nmcli connection modify 'Wired connection 1'   802-3-ethernet.wake-on-lan magic
nmcli device reapply enp130s0

第一条修改连接配置,第二条把新属性重新应用到当前设备。这里使用 device reapply,不执行 connection down/up,这样不会为了改 WOL 主动切断当前 SSH 或桌面网络。

重新读取配置确认结果:

nmcli -f connection.id,connection.interface-name,802-3-ethernet.wake-on-lan   connection show 'Wired connection 1'
connection.id:                          Wired connection 1
connection.interface-name:              enp130s0
802-3-ethernet.wake-on-lan:             magic

这里的 magic 表示只响应标准 Magic Packet,不会因为普通广播或任意局域网流量就唤醒主机,是这次配置的最终 NetworkManager 参数。

4. 再确认 PCI 设备允许系统唤醒

NetworkManager 的连接配置正确,不代表 PCI 电源管理一定允许唤醒。直接读取网卡对应设备的开关:

cat /sys/class/net/enp130s0/device/power/wakeup

本机返回:

enabled

这个结果说明内核层的 PCI 唤醒开关已经打开。如果这里是 disabled,即使连接属性是 magic,关机后也可能没有任何反应,需要先处理电源管理或固件设置。

想同时确认驱动能力,可以安装并查询 ethtool:

sudo pacman -S ethtool
sudo ethtool enp130s0

重点看 Supports Wake-on:Wake-on: 两行。常见的 Magic Packet 标记是 g;如果驱动明确不支持 g,NetworkManager 的配置不会凭空增加硬件能力。

5. BIOS/UEFI 和关机状态的前置条件

WOL 需要主板在关机后继续给网卡提供待机电源。BIOS/UEFI 中通常要打开:

  • Wake on LANResume by LAN

  • Power On By PCI-E

  • 关闭会切断 PCIe 待机供电的 ErPDeep Sleep 等选项

系统侧可以先用 systemctl poweroff 做一次完整关机测试。关机后网线必须仍插在这块 RTL8125 网卡上,交换机端口的链路灯通常也应保持亮起或闪烁。睡眠唤醒和 S5 软关机唤醒是两种电源状态,测试时要记录是在 suspend 还是 poweroff 后成功。

6. 从局域网发送 Magic Packet

在同一局域网的另一台 Linux 设备上安装 wakeonlan

sudo pacman -S wakeonlan
wakeonlan -i 192.168.1.255 8C:32:23:3B:46:F3

192.168.1.255 是本机当前 192.168.1.0/24 网段的广播地址,MAC 参数必须写有线网卡的 8C:32:23:3B:46:F3。不要把这个包直接暴露到公网;跨网段唤醒需要路由器支持定向广播或单独的 WOL 中继。

如果同网段广播被交换机过滤,可以先在发送端抓包确认是否真的发出了 102 字节左右的 Magic Packet,再尝试路由器支持的定向广播。抓包只用于确认发送端和网络路径,不能替代 BIOS 和网卡待机供电检查。

7. 常见失败点与本次排查结论

把无线 MAC 当成唤醒地址

本机无线接口是 wlp129s0f0,状态为未连接;WOL 目标是连接状态为 UP 的 enp130s0。有线和无线的 MAC 不同,必须以实际插网线的接口为准。

只改临时 ethtool 状态

sudo ethtool -s enp130s0 wol g 可以立即生效,但重新连接或重启后可能恢复默认。本次把 802-3-ethernet.wake-on-lan magic 写入 NetworkManager 连接,因此配置本身是持久的;ethtool 更适合用来读取能力和验证驱动结果。

只看到 NetworkManager 属性就认为一定能唤醒

连接属性、PCI power/wakeup、BIOS/UEFI 待机供电和交换机广播转发是四个独立环节。本机确认了前两项:连接值为 magic,PCI 唤醒为 enabled;剩下两项要在实际关机和发包时验证。

8. 最终复盘清单

# 连接和接口
nmcli -t -f DEVICE,TYPE,STATE,CONNECTION device status
nmcli -f connection.id,connection.interface-name,802-3-ethernet.wake-on-lan   connection show 'Wired connection 1'

# PCI 唤醒开关
cat /sys/class/net/enp130s0/device/power/wakeup

# 可选:驱动能力
sudo ethtool enp130s0

# 同网段发送
wakeonlan -i 192.168.1.255 8C:32:23:3B:46:F3

这次最终配置没有修改 IP、网关或路由,也没有安装常驻服务;WOL 的核心只涉及有线连接的唤醒属性、PCI 电源开关、固件待机供电和 Magic Packet 的目的 MAC。把这几个层次分开检查后,后续复盘时可以很快判断问题是在 NetworkManager、驱动、BIOS 还是局域网广播路径。