UpSnap 局域网唤醒失败:排查网口灯与 BIOS 设置

太阳作者太阳
原创内容采用 CC-4.0 协议发布,转载请注明出处
Wake-on-LANUpSnap网络排查Windows

问题背景

在 NAS/fnOS 上用 UpSnap 管理局域网设备唤醒时,目标 Windows 台式机的 IP、MAC、子网掩码看起来都正确,但点击唤醒没有效果。容器、网络广播和目标电脑的设置都有可能影响结果,需要顺着连接过程逐项核对。

最后解决问题的是目标电脑主板 BIOS 中的网卡唤醒开关。启用后,这台电脑关机时网口灯仍然亮着,UpSnap 也能正常唤醒它;此前关机后网口灯会熄灭。下面保留从 Windows 检查到 BIOS 设置的排查过程。

UpSnap 配置证据

UpSnap 运行在 Linux NAS 的 Compose 中,host 网络和能力设置参考了 UpSnap 5.4.1 官方 Compose 示例。这样发包直接使用宿主机的网络,便于处理局域网广播。

核心配置片段:

services:
  upsnap:
    image: ghcr.m.daocloud.io/seriousm4x/upsnap:5.4.1
    container_name: base_upsnap
    restart: unless-stopped
    network_mode: host
    cap_add:
      - NET_RAW
    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges:true
    environment:
      - TZ=Asia/Shanghai
      - UPSNAP_HTTP_LISTEN=0.0.0.0:8090
    volumes:
      - /vol1/1000/volumes/upsnap/data:/app/pb_data

这里保留当时的镜像版本、8090 端口和 NAS 数据目录。镜像使用了 DaoCloud 镜像地址,也可以按官方示例改用 ghcr.io/seriousm4x/upsnap:5.4.1;数据目录应按自己的磁盘布局调整。

UPSNAP_SCAN_RANGE 在官方示例中用于设备发现,手动填写设备时不必为了唤醒而额外写死扫描网段。

配置校验命令:

docker compose -f deploy/fnos/base/docker-compose.yml config --quiet

校验结果无输出,退出码为 0,说明 Compose 语法通过。该步骤只验证配置结构,不代表 WOL 一定可用。

这是原部署文件的位置。独立保存为当前目录的 compose.yaml 时,可以用下面的命令检查并启动,再在浏览器打开 http://NAS的局域网IP:8090 添加设备:

docker compose -f compose.yaml config --quiet
docker compose -f compose.yaml up -d upsnap
docker compose -f compose.yaml logs --tail 100 upsnap

Windows 侧检查命令

先确认当前在线时的有线网卡、MAC 和链路状态:

Get-NetAdapter | Format-Table -Auto Name,InterfaceDescription,Status,MacAddress,LinkSpeed

关键输出已脱敏:

Name    InterfaceDescription                Status  MacAddress         LinkSpeed
以太网  Realtek PCIe GbE Family Controller  Up      00-E2-69-**-**-8F  1 Gbps

这个结果证明目标机器使用的是有线 Realtek 网卡,且 UpSnap 中填写的 MAC 与系统识别到的物理网卡一致。

确认 IP 和网关:

Get-NetIPConfiguration -InterfaceAlias '以太网' |
  Format-List InterfaceAlias,IPv4Address,IPv4DefaultGateway,DNSServer

关键输出已脱敏:

InterfaceAlias     : 以太网
IPv4Address        : {192.168.2.x}
IPv4DefaultGateway : {192.168.2.1}

如果子网掩码为 255.255.255.0,该网段的广播地址应为 192.168.2.255。这说明 UpSnap 里 IP/掩码字段本身不是明显错误点。

网卡唤醒能力检查

检查 Realtek 驱动暴露的 WOL 和节能属性:

Get-NetAdapterAdvancedProperty |
  Where-Object {
    $_.DisplayName -match 'Wake|魔术|Magic|WOL|Shutdown|关机|唤醒|PME|Energy|节能|EEE|Green|绿色' -or
    $_.RegistryKeyword -match 'Wake|Wol|Magic|PME|EEE|Energy|Green'
  } |
  Select-Object Name,DisplayName,DisplayValue,RegistryKeyword,RegistryValue |
  Format-Table -Auto

关键输出:

Name    DisplayName             DisplayValue  RegistryKeyword
以太网  魔术封包唤醒            开启          *WakeOnMagicPacket
以太网  样式比对唤醒            开启          *WakeOnPattern
以太网  关机 网络唤醒           开启          S5WakeOnLan
以太网  节能乙太网路            开启          *EEE
以太网  环保节能                开启          EnableGreenEthernet
以太网  Advanced EEE            关闭          AdvancedEEE
以太网  网络唤醒和关机连接速度  10 Mbps 优先  WolShutdownLinkSpeed

这个输出能得出两个结论:

  1. Windows 驱动侧的核心 WOL 选项已经开启,包括魔术包唤醒和 S5 关机网络唤醒。
  2. Realtek 的节能以太网和绿色节能仍处于开启状态,后续应作为影响关机链路的候选项处理。

再确认 Windows 是否允许该设备唤醒系统:

powercfg /devicequery wake_armed

关键输出:

Realtek PCIe GbE Family Controller

这说明该网卡已经在 Windows 的可唤醒设备列表中。

快速启动检查

检查快速启动注册表值:

Get-ItemProperty `
  -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power' `
  -Name HiberbootEnabled -ErrorAction SilentlyContinue |
  Select-Object HiberbootEnabled

输出:

HiberbootEnabled
----------------
               1

单看这个值会怀疑 Windows 快速启动影响 WOL。但继续检查系统可用睡眠状态:

powercfg /a

关键输出:

休眠
    尚未启用休眠。

快速启动
    休眠不可用。

因此本次不能把快速启动作为已确认根因。注册表值存在,但系统当前休眠不可用,快速启动也不可用。

主板和 BIOS 证据

读取主板型号:

Get-CimInstance Win32_BaseBoard |
  Select-Object Manufacturer,Product,Version,SerialNumber |
  Format-List

关键输出:

Manufacturer : MAXSUN
Product      : MS-Challenger H610M-D
Version      : V5

读取 BIOS 信息:

Get-CimInstance Win32_BIOS |
  Select-Object Manufacturer,SMBIOSBIOSVersion,ReleaseDate |
  Format-List

关键输出:

Manufacturer      : American Megatrends International, LLC.
SMBIOSBIOSVersion : 5.27
ReleaseDate       : 2023/9/27

不同主板的选项名称不同,可能出现 Wake on LAN、PME 或 PCIe 唤醒等字样。例如 ASUS 的 WOL 设置说明使用 Power On By PCI-E。这个名称只用于帮助查找,不能据此把其他品牌的菜单路径套到这块铭瑄主板上。

最后解决:在 BIOS 中启用网卡唤醒

Windows 侧已经启用了魔术包唤醒和 S5 网络唤醒,但目标电脑关机后网口灯仍然熄灭。这个现象让我把排查重点转向主板,而没有继续反复修改 UpSnap 的设备记录。

最后在主板 BIOS 中启用网卡唤醒,保存设置并重新进入系统,再正常关机,问题就解决了。前后变化很直接:

  • 修改前:关机后网口灯熄灭,UpSnap 无法唤醒电脑。
  • 修改后:关机后网口灯仍亮,UpSnap 可以唤醒电脑。

复现这一步时,保持电脑电源线接通、电源开关开启,网线和交换机连接不变。在 BIOS 中打开网卡唤醒,保存后正常关机,先观察这台机器的网口灯,再从 UpSnap 发起唤醒,确认电脑实际启动。

网口灯是这次很有效的现场线索,但灯亮不能单独证明 WOL 已配置成功,灯灭也不能严格等同于整机完全断电。不同网卡有不同的指示灯和低功耗行为。Microsoft 的系统电源状态说明区分了 S5 软关机与 G3 机械断电:系统关机后仍可能保留部分待机供电,完全断开电源则无法接收网络唤醒请求。

因此,这次的结论是这台电脑需要在 BIOS 中启用网卡唤醒,Windows 网卡属性里的开关不能代替主板设置。没有留下 ErP、Fast Boot 或 Realtek 节能项变更后的对照记录,不能把它们也写成这次已经确认的原因。

其他机器仍然失败时怎样继续查

查主板手册时,可以留意原排查清单中的这些选项名称:

Wake On PME
Power On By PCI-E
Resume By PCI-E Device
PCI-E Device Wake Up
PME Event Wake Up

还可以核对下面这些电源设置是否影响该机型关机后的网卡供电,不需要为了套用清单一次全部关闭:

ErP
EuP
Deep Sleep
Fast Boot

原来的 Realtek 排查清单还包括以下两项;只有继续排查时才逐项调整、观察并记录结果:

节能乙太网路
环保节能

如果 BIOS 和驱动设置已经核对,仍要区分 UpSnap 与发包路径的问题,可以从同一网段的 Linux 宿主机直接发送魔术包。下面保留原来的独立发包方案,TARGET_MAC 必须换成目标有线网卡的完整 MAC,广播地址也要按实际子网调整;它是排障方法,不是本次新增的成功测试日志:

docker run --rm --network=host alpine sh -c \
  "apk add --no-cache awake && awake -b 192.168.2.255 -p 9 TARGET_MAC"

awake 的命令说明中,-b 指定广播地址,-p 指定目标端口。若所用 Alpine 仓库没有这个包,改用宿主机已有的 WOL 工具;软件包安装失败不等于魔术包已经发出。若直接发包能唤醒而 UpSnap 不能,再回头查设备记录、广播地址和容器日志;如果两者都失败,再核对交换机、VLAN、网络隔离和目标机器电源状态。