4 分钟阅读
环境:ZorinOS 18.1 / GNOME / XWayland / systemd-sleep
问题现象
选择"挂起"后,显示器熄灭约 20 秒,随后系统自动唤醒并进入锁屏界面。机箱风扇和指示灯始终未停转,表现上与"锁定"无异。
初步排查:确认睡眠状态配置
首先确认当前默认睡眠状态:
cat /sys/power/mem_sleep
若输出为 s2idle [deep],说明 S3(深度睡眠)已是默认值,配置本身没有问题。
背景知识:Linux 支持多种 ACPI 睡眠状态。
s2idle是纯软件轻度睡眠,CPU 停转但外设不断电,风扇和灯不会停;deep(S3)才是真正的硬件挂起,对应 Windows 的睡眠行为。若此处显示[s2idle],需在 GRUB 添加内核参数mem_sleep_default=deep修正。
定位真实原因:查看 suspend 日志
journalctl -b | grep -iE "wake|resume|suspend|PM:" | tail -40
关键日志片段:
PM: suspend entry (deep)
bluetoothd[787]: Controller resume with wake event 0x0
PM: suspend exit
PM: suspend entry (s2idle)
Failed to put system to sleep. System resumed again: Device or resource busy
分析:
- 系统成功进入 S3(
suspend entry (deep)) - 约 20 秒后蓝牙控制器产生
wake event 0x0将系统唤醒 - systemd-sleep 降级尝试 s2idle,但此时蓝牙驱动状态已乱,报
Device or resource busy,彻底失败 - 系统回到锁屏界面
wake event 0x0 是空事件,代表蓝牙控制器收到了外部广播包(如附近手机或穿戴设备的 BLE advertising),产生硬件中断并唤醒了系统,而非用户主动操作触发。
确认唤醒源
查看蓝牙设备的真实 sysfs 路径:
readlink -f /sys/class/bluetooth/hci0/device
# 输出示例:/sys/devices/pci0000:00/0000:00:01.3/0000:03:00.0/usb1/1-6/1-6:1.0
查看 ACPI 唤醒表:
cat /proc/acpi/wakeup
找到 PTXH(蓝牙所在的 USB 主控制器,对应 0000:03:00.0),状态为 *enabled——这意味着即使 USB 设备层面的 wakeup 已禁用,上层 PCIe USB 控制器仍有权唤醒系统。
验证假设:
bluetoothctl power off
# 再次尝试挂起 → 系统正常进入深度睡眠,风扇停转,指示灯熄灭
假设成立。
修复方案
方案 A:禁用 PTXH 的 ACPI 唤醒权限(推荐)
蓝牙功能完全保留,仅剥夺其在 ACPI 层面唤醒系统的资格。唤醒后蓝牙照常工作。
临时生效(测试用):
# 此命令为 toggle,执行一次 enabled → disabled,再执行一次则还原
echo PTXH | sudo tee /proc/acpi/wakeup
grep PTXH /proc/acpi/wakeup # 确认输出为 *disabled
永久生效(创建 systemd 服务):
sudo nano /etc/systemd/system/disable-ptxh-wakeup.service
[Unit]
Description=Disable PTXH ACPI wakeup (Bluetooth USB controller)
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'grep -q "PTXH.*enabled" /proc/acpi/wakeup && echo PTXH > /proc/acpi/wakeup || true'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now disable-ptxh-wakeup.service
方案 B:睡眠钩子(若方案 A 影响其他设备唤醒)
若 PTXH 下还有需要保留唤醒能力的设备(如无线键鼠接收器),改用 systemd-sleep 钩子,在挂起前自动关闭蓝牙,唤醒后自动恢复:
sudo nano /etc/systemd/system/bluetooth-sleep.service
[Unit]
Description=Disable Bluetooth on suspend, re-enable on resume
Before=sleep.target
StopWhenUnneeded=yes
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=bluetoothctl power off
ExecStop=bluetoothctl power on
[Install]
WantedBy=sleep.target
sudo systemctl enable bluetooth-sleep.service
根本原因总结
| 层级 | 现象 | 原因 |
|---|---|---|
| 硬件 | 蓝牙控制器产生唤醒中断 | 附近 BLE 设备持续广播,控制器收包后触发 ACPI 唤醒 |
| 内核 | wake event 0x0 | 无具体 HCI 事件的空唤醒,典型的 advertising 包触发 |
| systemd | 降级 s2idle 后仍失败 | 蓝牙驱动被意外唤醒后状态异常,持有资源锁 |
| 表现 | 看起来像"锁定" | 挂起失败后 logind 触发锁屏兜底 |
附:挂起相关基础概念速查
| 概念 | 行为 | ACPI 状态 |
|---|---|---|
| 锁定(Lock) | 进程继续运行,仅屏蔽输入输出 | 无(用户态行为) |
| 挂起(Suspend) | 状态保存在内存,硬件断电 | S3(Suspend to RAM) |
| 休眠(Hibernate) | 状态写入磁盘,完全断电 | S4(Suspend to Disk) |
| s2idle | 轻度睡眠,CPU 停但外设不断电 | S0ix |
排查于 2026 年 5 月 · ZorinOS 18.1