记录一次解决机械革命无界15X睡眠自动唤醒方法

最近重装了一直系统,之前使用的是 archlinux,因为之前用的 xfs想换为 btrfs,而且想要测试下 CachyOS,也是基于 archlinux的一个发行版,但是安装后机革的 bios比较垃圾,各种问题,比较明显的就是休眠后会自动唤醒,硬盘不断的通电,刚买的电脑硬盘通电都几千次了,之前用 arch的时候没有记录,现在记录下解决方法。

上个系统的时候我是设置了内核参数,原本不支持深度睡眠的,强制设置为深度睡眠了,后面又改了一大堆最终可以不自动唤醒了,这次记录正常的解决思路。

~ ❯ cat /sys/power/mem_sleep
[s2idle]

只支持 s2idle,不支持 deep

找ai问了一大堆,又是禁用网络检查,禁用网卡自动唤醒的,但是都不是正常的思路,正常应该先模拟一下挂起的操作,使用 systemctl suspend 命令会自动挂起,然后过几十秒又自动亮屏,这就是被中断了,解锁后使用 dmesg查看唤醒的日志:

~ ❯ sudo dmesg

[ 2107.773888] PM: suspend-to-idle
[ 2107.773890] amd_pmc: SMU idlemask s0i3: 0x3ffb3ebd
[ 2123.854437] Timekeeping suspended for 15.707 seconds
[ 2123.854480] PM: Triggering wakeup from IRQ 1
[ 2123.854486] PM: Triggering wakeup from IRQ 9
[ 2123.854587] ACPI: EC: ACPI EC GPE status set
[ 2123.854613] ACPI: EC: ACPI EC GPE dispatched
[ 2123.897461] ACPI: EC: ACPI EC work flushed
[ 2123.897483] ACPI: PM: Wakeup after ACPI Notify sync
[ 2123.897485] PM: resume from suspend-to-idle
[ 2123.898797] ACPI: \_SB_.PEP_: Successfully transitioned to state lps0 exit
[ 2123.899163] ACPI: \_SB_.PEP_: Successfully transitioned to state lps0 ms exit
[ 2123.899268] ACPI BIOS Error (bug): Could not resolve symbol [\_SB.ACDC.RTAC], AE_NOT_FOUND (20240827/psargs-332)
[ 2123.899274] ACPI Error: Aborting method \_SB.PEP._DSM due to previous error (AE_NOT_FOUND) (20240827/psparse-531)
[ 2123.899280] ACPI: \_SB_.PEP_: Failed to transitioned to state screen on
[ 2123.899448] ACPI: EC: interrupt unblocked
[ 2124.054388] PM: noirq resume of devices complete after 155.084 msecs
[ 2124.056537] PM: early resume of devices complete after 2.002 msecs
[ 2124.063519] [drm] PCIE GART of 512M enabled (table at 0x00000080FFD00000).
[ 2124.063596] amdgpu 0000:65:00.0: amdgpu: SMU is resuming...
[ 2124.067293] amdgpu 0000:65:00.0: amdgpu: SMU is resumed successfully!
[ 2124.072497] yt6801 0000:02:00.0 enp2s0: 1 Tx hardware queues,
[ 2124.072499] yt6801 0000:02:00.0 enp2s0:  8192 byte fifo per queue
[ 2124.072511] yt6801 0000:02:00.0 enp2s0: 4 Rx hardware queues,
[ 2124.072512] yt6801 0000:02:00.0 enp2s0:  8192 byte fifo per queue
[ 2124.116109] nvme nvme0: 16/0/0 default/read/poll queues
[ 2124.543651] amdgpu 0000:65:00.0: amdgpu: ring gfx_0.0.0 uses VM inv eng 0 on hub 0
[ 2124.543656] amdgpu 0000:65:00.0: amdgpu: ring comp_1.0.0 uses VM inv eng 1 on hub 0
[ 2124.543658] amdgpu 0000:65:00.0: amdgpu: ring comp_1.1.0 uses VM inv eng 4 on hub 0
[ 2124.543659] amdgpu 0000:65:00.0: amdgpu: ring comp_1.2.0 uses VM inv eng 6 on hub 0
[ 2124.543660] amdgpu 0000:65:00.0: amdgpu: ring comp_1.3.0 uses VM inv eng 7 on hub 0
[ 2124.543661] amdgpu 0000:65:00.0: amdgpu: ring comp_1.0.1 uses VM inv eng 8 on hub 0
[ 2124.543662] amdgpu 0000:65:00.0: amdgpu: ring comp_1.1.1 uses VM inv eng 9 on hub 0
[ 2124.543663] amdgpu 0000:65:00.0: amdgpu: ring comp_1.2.1 uses VM inv eng 10 on hub 0
[ 2124.543664] amdgpu 0000:65:00.0: amdgpu: ring comp_1.3.1 uses VM inv eng 11 on hub 0
[ 2124.543665] amdgpu 0000:65:00.0: amdgpu: ring sdma0 uses VM inv eng 12 on hub 0


主要看上面4、5行:

[ 2123.854480] PM: Triggering wakeup from IRQ 1
[ 2123.854486] PM: Triggering wakeup from IRQ 9

触发激活任务的就是这两个。还可以有另一种方法,用于查看上一次唤醒系统的唤醒中断号:

~ ❯ cat /sys/power/pm_wakeup_irq
1

输出为1,然后使用:

cat /proc/interrupts

会打印系统中所有的中断信息,按照输出查询中断号为1的中断,如下图:
image-20250407135640797

i8042是主板上的 PS/2 控制器芯片,一般连接内置触摸板或者键盘,我在网上查了相关信息,这个导致的误中断相关信息很多,基本可以确认就是他的原因了。

然后禁用唤醒操作,位置在 /sys/devices/platform/i8042/serio0/power/wakeup,查看当前状态为:

~ ❯ cat /sys/devices/platform/i8042/serio0/power/wakeup
enabled

在root下执行:

echo disabled | tee /sys/bus/platform/devices/i8042/power/wakeup

然后再 cat /sys/devices/platform/i8042/serio0/power/wakeup看到变成 disabled,然后手动触发挂起 systemctl suspend,测试几分钟没有自动唤醒说明成功。如果要持久化下面提供两种方法,配置 systemd 或 udev 规则:

  • 方法一:通过 systemd sleep 钩子
    创建文件 /etc/systemd/system/disable-ps2-wakeup.service

    [Unit]
    Description=Disable PS/2 controller wakeup
    
    [Service]
    Type=oneshot
    ExecStart=/bin/sh -c "echo disabled > /sys/devices/platform/i8042/serio0/power/wakeup"
    
    [Install]
    WantedBy=multi-user.target
    

    启用服务:

    sudo systemctl enable disable-ps2-wakeup.service
    
  • 方法二:通过 udev 规则
    创建文件 /etc/udev/rules.d/90-disable-ps2-wakeup.rules

    # 禁用 PS/2 控制器子设备(serio0)的唤醒功能
    ACTION=="add", SUBSYSTEM=="serio", KERNEL=="serio0", \
      RUN+="/bin/sh -c 'echo disabled > /sys$env{DEVPATH}/power/wakeup'"
    

    重新加载 udev 规则:

    sudo udevadm control --reload
    sudo udevadm trigger --action=add --subsystem-match=serio #手动触发
    

参考文档: