笔记本S3/S4因Lid开合导致唤醒
新收了一台 4K 屏 32 内存的 ThinkPad X1 Carbon Gen9,准备用于安装 Arch Linux 使用。 之前那台笔记本 SF314-512 上小问题比较多,包括但不限于 Hibernate 唤醒偶尔失败、风扇调度可能导致狂转以及 Intel MIPI Camera 工作不正常。
So,新机(其实比旧机还老一代)在参照 Wiki 设置好 Sound Open Firmware 之后基本就开箱即用了。
但是在我设置好 Swap 分区之后尝试 S4 休眠时发现如果我在休眠之后开盖,机器也会随开盖解除休眠。
进入 BIOS 设置中一顿查找也没有找到我认为可以关闭的设置(这里我还以为是开盖开机,因为使用 Swap 分区 resume 的流程一般是在 initramfs 中的 init 脚本找到有效的内存休眠镜像之后,而之前的流程和正常开机一样,因为我只测试了 Hibernate 没有测试 Sleep 所以怀疑是开盖自动开机)。
通过搜索 Arch Wiki 的 Power management/Wakeup triggers 页面和让 AI 帮忙分析得知这台机器的开盖唤醒可能是通过 ACPI LID 设备实现的。
# cat /proc/acpi/wakeup | grep -i lid
LID S4 *enabled platform:PNP0C0D:00
这里查找到一个 Sysfs node platform:PNP0C0D:00,查看文件夹/sys/devices/platform/PNP0C0D:00/可以找到power/wakeup文件并读取到内容enabled。
$ find /sys -name PNP0C0D:00 -type d
find: ‘/sys/kernel/tracing’: Permission denied
find: ‘/sys/kernel/debug’: Permission denied
/sys/devices/platform/PNP0C0D:00
/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00
find: ‘/sys/fs/pstore’: Permission denied
find: ‘/sys/fs/bpf’: Permission denied
下面参考 Wiki 中 Persistent settings 中的 Event-driven with udev 编写规则并使用 udevadm test /sys/devices/platform/PNP0C0D:00 进行测试后如果 power/wakeup 变为 disabled 则规则生效。
ACTION=="add|change", KERNEL=="PNP0C0D:00", SUBSYSTEM=="platform", ATTR{power/wakeup}="disabled"
此时关闭开盖从 S3/S4 唤醒应已被持久化设置,附新旧机 fastfetch。
