笔记本电脑挂起后立即唤醒

笔记本电脑挂起后立即唤醒

我的笔记本电脑在挂起后立即唤醒(或者挂起失败?它们是两种不同的情况吗?)。它是旧的东芝 Satellite C855D-S5105,8Gb RAM。它最近安装了 bodhi Linux(Ubuntu 的衍生版本,因此在很多方面它的工作方式与 Ubuntu 相同)。我找到的解决方案都不起作用。 BIOS 中的两个候选者被禁用(局域网唤醒键盘唤醒)。还有一个触摸板,没有鼠标或蓝牙接收器。下面我发布相关信息,并附有来源。

$ uname -a
Linux Orion 5.4.0-107-generic #121-Ubuntu SMP Thu Mar 24 16:04:27 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

尝试识别唤醒的候选者(假设它挂起并唤醒)。
这里似乎有一些设备启用了唤醒(参见)。

$ cat /proc/acpi/wakeup | grep enabled
Device  S-stateStatus   Sysfs node
OHC1      S3    *enabled   pci:0000:00:12.0       <- ?
OHC3      S3    *enabled   pci:0000:00:16.0       <- ?
EHC1      S3    *enabled   pci:0000:00:12.2       <- ?
EHC3      S3    *enabled   pci:0000:00:16.2       <- ?
LID0      S4    *enabled   platform:PNP0C0D:00    <- Lid

$ lspci | grep "00:1[2,6]."
00:12.0 USB controller: Advanced Micro Devices, Inc. [AMD] FCH USB OHCI Controller (rev 11)
00:12.2 USB controller: Advanced Micro Devices, Inc. [AMD] FCH USB EHCI Controller (rev 11)
00:16.0 USB controller: Advanced Micro Devices, Inc. [AMD] FCH USB OHCI Controller (rev 11)
00:16.2 USB controller: Advanced Micro Devices, Inc. [AMD] FCH USB EHCI Controller (rev 11)

这里似乎没有启用唤醒功能的设备(来源)。

$ cat /sys/bus/usb/devices/*/power/wakeup
disabled
disabled
disabled
disabled
disabled
disabled
disabled    
$ ll /sys/bus/usb/devices/*/power/wakeup
-rw-r--r-- 1 root root 4,0K abr  6 07:33 /sys/bus/usb/devices/1-3/power/wakeup
-rw-r--r-- 1 root root 4,0K abr  6 07:33 /sys/bus/usb/devices/usb1/power/wakeup
-rw-r--r-- 1 root root 4,0K abr  6 07:33 /sys/bus/usb/devices/usb2/power/wakeup
-rw-r--r-- 1 root root 4,0K abr  6 07:33 /sys/bus/usb/devices/usb3/power/wakeup
-rw-r--r-- 1 root root 4,0K abr  6 07:33 /sys/bus/usb/devices/usb4/power/wakeup
-rw-r--r-- 1 root root 4,0K abr  6 07:33 /sys/bus/usb/devices/usb5/power/wakeup
-rw-r--r-- 1 root root 4,0K abr  6 07:33 /sys/bus/usb/devices/usb6/power/wakeup

尝试找出挂起失败的原因。它看起来就像没有一样失败(如这里),但我不确定它实际上挂起并醒来,或者它退出挂起(如果它们是两个不同的东西)。

$ journalctl -b | grep -nH suspend
(standard input):1576:abr 06 07:28:55 Orion sudo[1196]:     root : TTY=unknown ; PWD=/home/santiago ; USER=root ; COMMAND=/usr/sbin/pm-suspend
(standard input):1578:abr 06 07:28:58 Orion kernel: PM: suspend entry (deep)
(standard input):1583:abr 06 07:29:04 Orion kernel: printk: Suspending console(s) (use no_console_suspend to debug)
(standard input):1627:abr 06 07:29:04 Orion kernel: PM: suspend exit

添加可能有用的行。看起来唤醒发生在第 1591 行和第 1592 行之间。

$ journalctl -b | grep -nH -A 40 -B 40 suspend
...
(standard input):1578:abr 06 07:28:58 Orion kernel: PM: suspend entry (deep)
(standard input)-1579-abr 06 07:28:58 Orion kernel: Filesystems sync: 0.191 seconds
(standard input)-1580-abr 06 07:29:04 Orion kernel: Freezing user space processes ... (elapsed 0.004 seconds) done.
(standard input)-1581-abr 06 07:29:04 Orion kernel: OOM killer disabled.
(standard input)-1582-abr 06 07:29:04 Orion kernel: Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
(standard input):1583:abr 06 07:29:04 Orion kernel: printk: Suspending console(s) (use no_console_suspend to debug)
(standard input)-1584-abr 06 07:29:04 Orion kernel: wlp2s0: deauthenticating from d0:6e:de:8e:25:f6 by local choice (Reason: 3=DEAUTH_LEAVING)
(standard input)-1585-abr 06 07:29:04 Orion kernel: sd 0:0:0:0: [sda] Synchronizing SCSI cache
(standard input)-1586-abr 06 07:29:04 Orion kernel: sd 0:0:0:0: [sda] Stopping disk
(standard input)-1587-abr 06 07:29:04 Orion kernel: ACPI: Preparing to enter system sleep state S3
(standard input)-1588-abr 06 07:29:04 Orion kernel: PM: Saving platform NVS memory
(standard input)-1589-abr 06 07:29:04 Orion kernel: Disabling non-boot CPUs ...
(standard input)-1590-abr 06 07:29:04 Orion kernel: IRQ 30: no longer affine to CPU1
(standard input)-1591-abr 06 07:29:04 Orion kernel: smpboot: CPU 1 is now offline
(standard input)-1592-abr 06 07:29:04 Orion kernel: ACPI: Low-level resume complete
(standard input)-1593-abr 06 07:29:04 Orion kernel: PM: Restoring platform NVS memory
(standard input)-1594-abr 06 07:29:04 Orion kernel: LVT offset 0 assigned for vector 0x400
(standard input)-1595-abr 06 07:29:04 Orion kernel: microcode: reload patch_level=0x05000119
(standard input)-1596-abr 06 07:29:04 Orion kernel: Enabling non-boot CPUs ...
(standard input)-1597-abr 06 07:29:04 Orion kernel: x86: Booting SMP configuration:
(standard input)-1598-abr 06 07:29:04 Orion kernel: smpboot: Booting Node 0 Processor 1 APIC 0x1
(standard input)-1599-abr 06 07:29:04 Orion kernel: microcode: CPU1: patch_level=0x05000119
(standard input)-1600-abr 06 07:29:04 Orion kernel: CPU1 is up
(standard input)-1601-abr 06 07:29:04 Orion kernel: ACPI: Waking up from system sleep state S3
(standard input)-1602-abr 06 07:29:04 Orion kernel: [drm] Found smc ucode version: 0x00010601
(standard input)-1603-abr 06 07:29:04 Orion kernel: rtlwifi: rtlwifi: wireless switch is on
(standard input)-1604-abr 06 07:29:04 Orion kernel: [drm] PCIE GART of 1024M enabled (table at 0x0000000000162000).
(standard input)-1605-abr 06 07:29:04 Orion kernel: radeon 0000:00:01.0: WB enabled
...

没有 Nvidia 驱动程序,例如这里。显卡是ATI Radeon。

$ dpkg -l | grep nvidia
ii  bodhi-background-invidia              0.01                                all          Bodhi Sunshine Invidia

有关的

  1. https://bbs.archlinux.org/viewtopic.php?id=263268

答案1

我设法避免了唤醒,如下所示。我编写了一个disable_devices_from_wakeup.sh 包含以下内容的脚本(灵感来自

#!/bin/bash

declare -a devices=(EHC1 EHC3 OHC1 OHC3)
for device in "${devices[@]}" ; do
    sudo sh -c "echo $device > /proc/acpi/wakeup"
done

将其设置为可执行文件并运行它。现在我拥有所有 4 台设备disabled,并且笔记本电脑只能通过盖子或电源按钮唤醒。因此,在不确切知道负责唤醒的设备的情况下,问题就消失了。

在进一步测试中,4 个设备中的任何一个单独处于某种enabled状态就足以防止挂起。这对我来说看起来很奇怪,但我没有花时间分别理解每一个。

待办事项:

  1. 让改变永久化。是相关的问题。

答案2

此问题的许多答案都会禁用用于将 PC 从挂起状态唤醒的特定设备,但总是出现新设备、更新和其他情况,问题就会再次出现。相反,此脚本会禁用除盖子 (LID) 和睡眠按钮 (SLPB) 之外的所有用于将 PC 从睡眠状态唤醒的设备:

#! /bin/bash
case $1 in
    pre)
        declare -a keep_devices=(SLPB LID) # <-- Add entries to keep activated here
        # Get the currently active devices in 
        readarray -t enabled_devices < <( grep enabled /proc/acpi/wakeup | awk '{print $1}' )
        # if it's enabled and not in our whitelist, disable it
        for device in "${enabled_devices[@]}"; do
            if [[ ! " ${keep_devices[*]} " =~ " ${device} " ]]; then
                echo ${device} > /proc/acpi/wakeup
            fi
        done
    ;;
esac

遵循建议这里对于 Ubuntu,我复制了此脚本以在睡眠开始时运行:

sudo cp disable-wakeup-devices /usr/lib/systemd/system-sleep/
sudo chmod 755 /usr/lib/systemd/system-sleep/disable-wakeup-devices

相关内容