
背景
家里有一台装了 Ubuntu 的 GPU 服务器(hostname: gpu-nvdia),平时配置了网络唤醒(WOL),需要跑大模型时远程发 magic packet 唤醒,用完后 SSH 执行关机。
最近出现了一个奇怪的问题:执行关机命令后,机器成功关机,但大约十几秒钟后会自动重新启动。
排查过程
第一步:确认关机命令本身没问题
远程 SSH 执行关机时,有一个常见坑:SSH 断开时 shutdown 进程被 SIGHUP 信号中断,导致关机流程没走完。
改用以下方式确保关机进程不受 SSH 断开影响:
bash
sudo systemd-run --on-active=5 systemctl poweroff执行后机器确实正常关机了,但十几秒后仍然自动重启。说明问题不在关机命令本身。
第二步:查看启动日志和唤醒设备
查看 ACPI 唤醒设备列表和启动记录:
bash
sudo journalctl -b 0 | grep -iE "wake|wol|acpi|power|pme"
cat /proc/acpi/wakeup
last -x | head -30从 last -x 可以看到,今天的两次关机都在约 1 分钟内自动重启:
shutdown system down Fri Apr 17 20:55 - 20:56 (00:01)
shutdown system down Fri Apr 17 20:30 - 20:31 (00:01)而 4 月 6 日之前的记录关机都是正常的。
/proc/acpi/wakeup 的输出中,注意到以下设备处于 enabled 状态:
PXSX S4 *enabled pci:0000:05:00.0 ← 可疑
XHCI S4 *enabled pci:0000:00:14.0 ← USB 控制器
AWAC S4 *enabled platform:ACPI000E:00第三步:排查 RTC 定时唤醒
AWAC 是 ACPI 实时时钟,enabled 状态意味着可能有定时唤醒。先查:
bash
cat /sys/class/rtc/rtc0/wakealarm输出为空,排除 RTC 定时唤醒。
第四步:查看可疑 PCI 设备
查看 0000:05:00.0 是什么设备:
bash
lspci -v -s 0000:05:00.0输出:
05:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411
Kernel driver in use: r8169是网卡。再查网卡的 WOL 状态:
bash
ethtool enp5s0 | grep -i wake输出:
Supports Wake-on: pumbg
Wake-on: g找到根因了。
根本原因
网卡 WOL 开启(Wake-on: g,即 magic packet 模式),同时网卡对应的 ACPI power/wakeup 也处于 enabled 状态。
这两个条件叠加,导致机器关机后,局域网内其他设备(路由器、NAS、Mac Mini 等)发出的普通网络广播包也能触发唤醒,而不仅仅是 magic packet。
关机十几秒后重启,正好是局域网广播的时间窗口。
解决方案
WOL 的 magic packet 唤醒是在网卡固件层处理的,不依赖 ACPI 的 power/wakeup。因此可以禁用 ACPI 层面的网卡唤醒权限,同时保留 magic packet 唤醒能力。
临时禁用(当前生效):
bash
echo disabled | sudo tee /sys/bus/pci/devices/0000:05:00.0/power/wakeup
sudo ethtool -s enp5s0 wol g持久化(重启后仍然生效):
创建 systemd service:
bash
sudo nano /etc/systemd/system/disable-pcie-wakeup.service写入以下内容:
ini
[Unit]
Description=Disable PCIe ACPI wakeup for NIC
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo disabled > /sys/bus/pci/devices/0000:05:00.0/power/wakeup'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target启用服务:
bash
sudo systemctl enable disable-pcie-wakeup.service
sudo systemctl start disable-pcie-wakeup.service总结
| 现象 | 根因 |
|---|---|
| 关机后十几秒自动重启 | 网卡 ACPI power/wakeup 为 enabled,局域网广播触发唤醒 |
| WOL 功能仍然正常 | magic packet 唤醒由网卡固件处理,不依赖 ACPI 唤醒权限 |
关键命令速查:
bash
# 查看网卡 WOL 状态
ethtool enp5s0 | grep -i wake
# 查看 ACPI 唤醒设备
cat /proc/acpi/wakeup
# 查看 RTC 定时唤醒
cat /sys/class/rtc/rtc0/wakealarm
# 禁用网卡 ACPI 唤醒
echo disabled | sudo tee /sys/bus/pci/devices/0000:05:00.0/power/wakeup记录于 2026-04-17,适用于同类 WOL + 自动重启问题的排查参考。