[!Tip] 其实最主要的就是看一下电源管理那里的就是不要设置成混合睡眠(hybrid sleep)这种 直接设置成suspend to RAM

Arch Linux(KDE Plasma + Wayland)盖上笔记本自动关机 / 睡死问题排查笔记

问题现象

盖上笔记本盖后,系统本应执行 suspend to RAM(睡眠),但实际上直接进入 hibernate(休眠到磁盘)自动关机

日志显示类似:

Lid closed
The system will hibernate now!

这表明系统并未执行 suspend,而是触发了 hibernate。

症状表现为:

  • 盖上盖子后风扇停转、完全断电。

  • 唤醒时不是快速恢复,而是重新开机。

  • 有时表现为“睡死”,无法唤醒。


原因分析

1. KDE Plasma 覆盖了 systemd-logind 的行为

KDE 的电源管理守护进程 PowerDevil 会通过 D-Bus 拦截盖盖子事件,可能设置为:

  • “休眠”(Hibernate)

  • “关机”(Shut down) 即使 /etc/systemd/logind.conf 中设置为 HandleLidSwitch=suspend,KDE 的设置仍可能覆盖。


2. systemd 启用了 suspend-then-hibernate 模式

systemd 可能配置为在 suspend 一段时间后自动转入 hibernate。

若延迟时间设置太短(甚至为 0),系统会“立即”从 suspend 转入 hibernate,看起来像直接关机。


3. logind.conf 配置未生效或被覆盖

可能的情况:

  • 配置行仍被注释(以 # 开头)。

  • 修改后未重启 systemd-logind 服务。

  • /etc/systemd/logind.conf.d/ 目录中存在覆盖文件。


4. suspend 或 hibernate 功能异常

常见问题:

  • suspend 无法进入或立即唤醒 → ACPI/驱动问题。

  • hibernate 无法恢复 → resume 参数或 swap 设置错误。

  • suspend 失败 → 系统自动 fallback 到 hibernate 或 poweroff。


5. 硬件 / 内核兼容问题

部分内核版本(尤其是新 LTS 版或部分 Intel GPU)在 Wayland 环境下 suspend 存在兼容性问题。

若 suspend 失败,系统可能直接执行 fallback:

suspend → failed → hibernate → poweroff


解决步骤

目标

让盖上盖子时系统执行可靠的 suspend(睡眠到内存),而非自动关机或休眠到磁盘。


1. 调整 KDE Plasma 设置(最常见原因)

路径:

系统设置 → 电源管理 → 节能(Energy Saving)

在以下两处修改:

  • “使用电源时”(On AC Power)

  • “使用电池时”(On Battery)

选项 “盖上笔记本盖时”(When laptop lid closed)

  • 设置为 Sleep(睡眠)

  • 不要选择 Hibernate 或 Shut down

  • 避免选择 Do nothing

保存后:

systemctl --user restart org_kde_powerdevil

若仍异常,可临时停用 PowerDevil 以测试:

systemctl --user stop org_kde_powerdevil

2. 禁用 systemd 的混合睡眠 / 自动休眠

创建配置文件:

sudo mkdir -p /etc/systemd/sleep.conf.d/
sudo nano /etc/systemd/sleep.conf.d/disable-hybrid.conf

添加内容:

[Sleep]
AllowSuspendThenHibernate=no
AllowHybridSleep=no
AllowHibernation=yes
HibernateDelaySec=3600

保存并重启服务:

sudo systemctl restart systemd-logind

测试:

systemctl suspend

确认进入的是 suspend,而非 hibernate。


3. 检查 logind.conf 配置

编辑:

sudo nano /etc/systemd/logind.conf

确保以下行被取消注释(去掉 #):

HandleLidSwitch=suspend
HandleLidSwitchDocked=ignore
HandleLidSwitchExternalPower=suspend
LidSwitchIgnoreInhibited=no

保存并重启:

sudo systemctl restart systemd-logind

查看是否生效:

loginctl show-logind | grep HandleLid

4. 测试 suspend 与 hibernate

测试 suspend

systemctl suspend

若失败或立即唤醒,查看日志:

journalctl -b -u systemd-suspend

修复方式:

  • 强制使用 deep 模式:

      echo deep | sudo tee /sys/power/mem_sleep
    

    永久写入:

      [Sleep]
      MemorySleepMode=deep
    

    写入 /etc/systemd/sleep.conf

  • 移除外接 USB、更新内核:

      sudo pacman -Syu linux linux-headers
    

测试 hibernate(若想保留)

systemctl hibernate

若失败,检查:

  • swap 分区或文件存在:

      swapon --show
    
  • /etc/mkinitcpio.confHOOKS 含有 resume

  • /etc/default/grub 加入:

      GRUB_CMDLINE_LINUX_DEFAULT="quiet resume=UUID=<swap分区UUID>"
    
  • 更新配置:

      sudo mkinitcpio -P
      sudo grub-mkconfig -o /boot/grub/grub.cfg
    

若 hibernate 导致“睡死”,可禁用:

sudo systemctl mask hibernate.target hybrid-sleep.target

5. 进一步排查

查看盖盖子事件日志:

journalctl -b -u systemd-logind -u systemd-suspend

检查唤醒源:

cat /proc/acpi/wakeup

禁用不需要的:

echo LID0 > /proc/acpi/wakeup

查看电源状态:

upower -d

更新系统:

sudo pacman -Syu

若问题持续,可尝试:

  • 使用 linux-zenlinux-lts 内核

  • 设置 LidSwitchIgnoreInhibited=no 强制 logind 响应盖子事件


总结

问题类型 主要原因 解决方案
盖盖子直接关机 KDE 触发 Hibernate 修改 KDE 电源设置为 Sleep
睡眠一会自动关机 启用 suspend-then-hibernate 禁用 AllowSuspendThenHibernate
盖盖子无反应 logind.conf 被 KDE 抑制 LidSwitchIgnoreInhibited=no
睡死无法唤醒 ACPI / 内核问题 强制 deep 模式、更新内核
无法休眠恢复 resume 参数错误 修复 GRUB 与 initramfs 配置