ACPI唤醒事件是计算机系统通过ACPI规范定义的机制,允许系统从睡眠状态(如S3)被特定事件激活,这些事件可由外设(键盘、鼠标)、定时器或网络信号等触发,实现节能与快速恢复的平衡。
在 Linux 系统中,”唤醒”(Wakeup)通常指的是将处于睡眠状态(Sleep State)或休眠状态(Hibernate State)的计算机恢复到正常工作状态(S0 状态),这个过程依赖于硬件(ACPI)的支持和操作系统的正确配置,以下是关于 Linux 如何唤醒的详细说明:
Linux 的唤醒功能主要基于 ACPI (Advanced Configuration and Power Interface) 标准实现,ACPI 定义了不同的睡眠状态(S1-S5)以及允许哪些硬件事件可以将系统从这些状态中唤醒。
-
睡眠状态 (Suspend to RAM – S3):
- 这是最常见的”睡眠”模式,系统将当前运行状态(内存内容)保持通电,同时关闭 CPU、硬盘、显示器等大部分组件的电源。
- 唤醒源: 需要非常低的功耗且能产生中断信号的设备,常见唤醒源包括:
- 电源按钮 (Power Button): 按下机箱或键盘上的电源按钮。
- 键盘按键 (Keyboard): 按下键盘上的任意键或特定键(如空格键,取决于配置)。
- 鼠标移动/点击 (Mouse): 移动 USB 或 PS/2 鼠标或点击其按钮。
- 网络唤醒 (Wake-on-LAN – WOL): 接收到特定的”魔术包”(Magic Packet)网络数据帧。
- 实时时钟闹钟 (RTC Alarm): 预设的时间到达。
- USB 设备: 插入/拔出 USB 设备(如 U 盘)、USB 键盘/鼠标活动(如果支持)。
- 串口/调制解调器活动 (Modem Ring): 电话线振铃(较少见)。
- 特定 PCI/PCIe 设备事件: 如某些扩展卡产生的中断。
-
休眠状态 (Suspend to Disk – S4):
- 系统将内存内容完整地写入硬盘交换空间或特定休眠文件,然后完全关闭电源,恢复时,系统从硬盘读取保存的状态并恢复到内存中。
- 唤醒源: 通常只有电源按钮可以唤醒处于休眠状态的系统,因为系统是完全断电的,其他设备(如键盘、鼠标、网卡)没有通电,无法产生唤醒信号,唤醒过程本质上是一个冷启动过程,由 BIOS/UEFI 和引导加载程序(如 GRUB)检测到休眠镜像并触发恢复流程。
在 Linux 中管理和配置唤醒源
Linux 通过 /sys
和 /proc
文件系统提供了查看和配置唤醒源的接口:
-
查看当前可用的唤醒源 (
/proc/acpi/wakeup
– 较旧系统):- 打开终端,输入:
cat /proc/acpi/wakeup
- 输出示例:
Device S-state Status Sysfs node P0P2 S4 *disabled pci:0000:00:1c.2 EHC1 S4 *enabled pci:0000:00:1d.0 EHC2 S4 *enabled pci:0000:00:1a.0 XHC S4 *enabled pci:0000:00:14.0 HDEF S4 *disabled pci:0000:00:1b.0 ... LID0 S4 *enabled platform:PNP0C0D:00
Status
列:*enabled
表示该设备当前被配置为唤醒源,*disabled
表示不是唤醒源。Device
列: 标识硬件设备(如 USB 控制器EHC1/EHC2/XHC
, 网卡GLAN
, 电源按钮PWRB
, 笔记本盖LID0
等)。- 注意:
/proc/acpi/wakeup
接口在较新的内核中可能被弃用,推荐使用/sys
。
- 打开终端,输入:
-
查看和配置唤醒源 (
/sys/bus/usb/devices/.../power/wakeup
– 更现代):- 这是更推荐的方式,唤醒源配置通常位于
/sys
文件系统下对应设备的power/wakeup
文件中。 - 查看 USB 设备唤醒能力:
# 列出所有 USB 设备及其 wakeup 状态 grep . /sys/bus/usb/devices/*/power/wakeup
- 查看特定设备(如 USB 鼠标)的唤醒状态:
- 先找到设备路径,使用
lsusb
找到鼠标的Bus
和Device
号。 - 然后查看(假设路径是
1-1.2
):cat /sys/bus/usb/devices/1-1.2/power/wakeup
- 输出通常是
enabled
或disabled
。
- 先找到设备路径,使用
- 启用/禁用特定设备的唤醒功能:
- 需要 root 权限 (sudo)。
- 启用唤醒(例如启用 USB 鼠标唤醒):
echo enabled | sudo tee /sys/bus/usb/devices/1-1.2/power/wakeup
- 禁用唤醒:
echo disabled | sudo tee /sys/bus/usb/devices/1-1.2/power/wakeup
- 其他设备: 类似的方法可以应用于 PCI 设备(路径如
/sys/bus/pci/devices/0000:00:1d.0/power/wakeup
)等。
- 这是更推荐的方式,唤醒源配置通常位于
-
配置网络唤醒 (Wake-on-LAN – WOL):
- 步骤 1:检查网卡是否支持 WOL:
sudo ethtool <interface_name> # 如 ethtool enp0s3
- 在输出中查找
Supports Wake-on
和Wake-on
行。g
通常表示支持”魔术包”唤醒。Wake-on
是d
(disabled),需要启用它。 - 步骤 2:启用 WOL:
sudo ethtool -s <interface_name> wol g # 启用魔术包唤醒
- 步骤 3:使 WOL 设置持久化(重启后生效):
- 编辑网络配置文件(如
/etc/network/interfaces
或使用netplan
/NetworkManager
配置),在对应网卡配置中添加一行wakeonlan g
或类似指令(具体取决于发行版和网络管理工具)。 - 或者创建一个 systemd service 或 udev rule 在每次启动时应用
ethtool
命令。
- 编辑网络配置文件(如
- 步骤 4:在 BIOS/UEFI 中启用 WOL 支持。
- 步骤 5:从另一台计算机发送魔术包。 使用
wakeonlan
命令或专门的 WOL 工具,需要目标机器的 MAC 地址。
- 步骤 1:检查网卡是否支持 WOL:
-
配置 RTC 唤醒 (定时唤醒):
- 步骤 1:检查 RTC 是否支持唤醒:
cat /sys/class/rtc/rtc0/device/power/wakeup # rtc0 是系统 RTC
- 如果显示
enabled
或disabled
,说明支持。 - 步骤 2:设置唤醒时间:
- 使用
rtcwake
命令(需要 root):sudo rtcwake -m mem -s 3600 # 1 小时后从睡眠 (mem) 唤醒 sudo rtcwake -m disk -t $(date +%s -d "tomorrow 08:00") # 明天早上 8 点从休眠 (disk) 唤醒
-m
指定目标睡眠状态 (mem
=S3,disk
=S4,standby
=S1,off
=S5)。-s
指定从现在起多少秒后唤醒。-t
指定从 Epoch (1970-01-01 UTC) 起多少秒后唤醒(用date +%s -d "..."
计算)。
- 使用
- 步骤 3:进入睡眠/休眠:
rtcwake
命令在设置好 RTC 闹钟后,通常会立即尝试将系统置于指定的睡眠状态,也可以单独设置闹钟,然后使用systemctl suspend
或systemctl hibernate
。
- 步骤 1:检查 RTC 是否支持唤醒:
常见唤醒问题排查
-
设备无法唤醒:
- 检查 BIOS/UEFI 设置: 确保 ACPI 功能(尤其是 S3 支持)和相关的唤醒选项(如 USB Wake, PCIE Wake, WOL)已启用,这是最常见的原因。
- 检查内核日志: 使用
dmesg | grep -i acpi
或dmesg | grep -i wake
查看启动和睡眠/唤醒过程中的相关消息,可能有错误提示。 - 检查
/var/log/syslog
或journalctl
: 系统日志可能包含更详细的电源管理事件记录。 - 确认设备支持唤醒: 不是所有键盘、鼠标或 USB 设备都支持从深度睡眠中唤醒系统。
- 确认设备被正确配置为唤醒源: 使用上述
/sys
或/proc/acpi/wakeup
方法检查并启用。 - 尝试不同的睡眠状态: 有时 S3 在特定硬件组合上有问题,尝试
deep
(S4-ish) 或s2idle
(更浅的睡眠) 状态(通过/sys/power/mem_sleep
选择)。 - 更新 BIOS/UEFI 和内核: 电源管理问题常通过固件和内核更新修复。
-
设备意外唤醒:
- 检查唤醒源: 系统唤醒后,立即查看内核日志 (
dmesg
) 或/proc/acpi/wakeup
(如果可用),通常会记录是哪个设备触发了唤醒。 - 禁用可疑设备的唤醒功能: 根据日志找到的设备名,使用
/sys
接口将其wakeup
属性设置为disabled
,常见的”捣乱者”包括 USB 鼠标(过于灵敏)、以太网卡(网络杂讯)、某些有问题的 PCIe 设备。
- 检查唤醒源: 系统唤醒后,立即查看内核日志 (
重要提示:
- 权限: 修改
/sys
下的文件(尤其是/sys/bus/*/devices/*/power/wakeup
和/proc/acpi/wakeup
)通常需要 root 权限 (使用sudo
)。 - 持久化: 通过
/sys
和/proc
接口进行的更改通常是临时的,系统重启后会失效,要使唤醒设置永久生效,需要:- 创建 udev rules。
- 在系统启动脚本(如
/etc/rc.local
,但更推荐 systemd service)中添加启用命令。 - 配置网络管理工具(对于 WOL)。
- 使用发行版提供的特定配置工具(如果存在)。
- 硬件差异: 唤醒功能高度依赖于具体的硬件(主板、芯片组、外设)和 BIOS/UEFI 实现,不同机器上的可用选项和行为可能差异很大。
- 安全: 启用 WOL 或 RTC 唤醒意味着系统可能在无人值守时自动启动,请考虑物理环境安全,禁用不需要的唤醒源也有助于节能和防止意外唤醒。
Linux 系统的唤醒依赖于 ACPI 标准和硬件支持,用户可以通过 /sys
和 /proc
文件系统查看、启用或禁用各种硬件设备(如键盘、鼠标、网卡、RTC)作为唤醒源,常见的唤醒方式包括按电源键、敲击键盘、移动鼠标、接收 WOL 魔术包和设置 RTC 闹钟,配置时务必检查并启用 BIOS/UEFI 中的相关选项,并注意设置持久化问题,遇到唤醒问题时,仔细检查 BIOS 设置、内核日志和系统日志是诊断的关键。
引用说明:
- 基于 Linux 内核文档 (Documentation/admin-guide/pm/ 和 Documentation/power/ on https://www.kernel.org/doc/)。
- ACPI 规范 (https://uefi.org/specifications) 提供了唤醒事件定义的基础。
ethtool
和rtcwake
命令的手册页 (man ethtool
,man rtcwake
) 提供了具体用法细节。- Arch Linux Wiki (https://wiki.archlinux.org/) 的 “Power management/Suspend and hibernate” 和 “Wake-on-LAN” 页面是实践配置的宝贵社区资源。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/7316.html