如何永久更改 /proc/acpi/wakeup?

Jol*_*lan 21 suspend proc wakeup

我的 Ubuntu 12.04 在暂停后立即唤醒时遇到问题。我通过更改 /proc/acpi/wakeup 中的设置解决了该问题,如以下问题中所建议:如何防止从挂起和/或休眠状态立即唤醒?.

更改设置后,系统完美进入挂起状态并保持挂起状态,但在我将其唤醒后,/proc/acpi/wakeup 中的设置与我设置的不同。

暂停前:

cat /proc/acpi/wakeup
Device  S-state   Status   Sysfs node
SMB0      S4    *disabled  pci:0000:00:03.2
PBB0      S4    *disabled  pci:0000:00:09.0
HDAC      S4    *disabled  pci:0000:00:08.0
XVR0      S4    *disabled  pci:0000:00:0c.0
XVR1      S4    *disabled  
P0P5      S4    *disabled  
P0P6      S4    *disabled  pci:0000:00:15.0
GLAN      S4    *enabled   pci:0000:03:00.0
P0P7      S4    *disabled  pci:0000:00:16.0
P0P8      S4    *disabled  
P0P9      S4    *disabled  
USB0      S3    *disabled  pci:0000:00:04.0
USB2      S3    *disabled  pci:0000:00:04.1
US15      S3    *disabled  pci:0000:00:06.0
US12      S3    *disabled  pci:0000:00:06.1
PWRB      S4    *enabled   
SLPB      S4    *enabled
Run Code Online (Sandbox Code Playgroud)

我告诉系统挂起,它正常工作。但后来唤醒后,设置更改为:

USB0      S3    *disabled  pci:0000:00:04.0
USB2      S3    *enabled   pci:0000:00:04.1
US15      S3    *disabled  pci:0000:00:06.0
US12      S3    *enabled   pci:0000:00:06.1
Run Code Online (Sandbox Code Playgroud)

或者

USB0      S3    *enabled   pci:0000:00:04.0
USB2      S3    *enabled   pci:0000:00:04.1
US15      S3    *enabled   pci:0000:00:06.0
US12      S3    *enabled   pci:0000:00:06.1
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?


谢谢您的答复。不幸的是它没有解决我的问题。

所有的

/sys/bus/usb/devices/usb1/power/wakeup
/sys/bus/usb/devices/usb2/power/wakeup
/sys/bus/usb/devices/usb3/power/wakeup
/sys/bus/usb/devices/usb4/power/wakeup
Run Code Online (Sandbox Code Playgroud)

/sys/bus/usb/devices/3-1/power/wakeup
Run Code Online (Sandbox Code Playgroud)

设置为禁用,并且笔记本电脑在进入睡眠状态后仍会自行唤醒。它似乎唯一做出反应的是 /proc/acpi/wakeup 中的设置,每次我关闭/重新启动笔记本时,这些设置都会不断更改(重置)。

Gjj*_*urg 11

我在 Ubuntu 12.10 上再次遇到了这个问题。不幸的是,用户 MTS 的建议对我也不起作用。但是,您可以编写一个脚本来/proc/acpi/wakeup在每次挂起之前自动设置 USB 属性。

解决方案基于创建挂起钩子(基于此 Archwiki 文章)。将以下内容另存为/usr/lib/pm-utils/sleep.d/45fixusbwakeup,并确保使其可执行 ( chmod +x /usr/lib/pm-utils/sleep.d/45fixusbwakeup)。

#!/bin/bash
case $1 in
    hibernate)
            echo "Going to suspend to disk!"
            ;;
    suspend)
            echo "Fixing acpi settings."
            for usb in `cat /proc/acpi/wakeup | grep USB | cut -f1`;
            do
                    state=`cat /proc/acpi/wakeup | grep $usb | cut -f3 | cut -d' ' -f1 | tr -d '*'`
                    echo "device = $usb, state = $state"
                    if [ "$state" == "enabled" ]
                    then
                            echo $usb > /proc/acpi/wakeup
                    fi
            done
            echo "Suspending to RAM."
            ;;
    thaw)
            echo "Suspend to disk is now over!"
            ;;
    resume)
            echo "We are now resuming."
            ;;
    *)
            echo "Somebody is callin me totally wrong."
            ;;
esac
Run Code Online (Sandbox Code Playgroud)

这样做是将当前启用的每个USB 设备的状态更改为禁用。如果您只想更改特定的 USB 设备,请更改脚本中的 for 循环。例如只更改 USB1 和 USB3 更改

for usb in `cat /proc/acpi/wakeup | grep USB | cut -f1`;
Run Code Online (Sandbox Code Playgroud)

for usb in 'USB1' 'USB3';
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助其他有同样问题的人。这种方法为我解决了这个问题。


MTS*_*MTS 10

也许http://forum.xbmc.org/showthread.php?tid=121158会有所帮助?

这就是它所说的:

对于那些正在更新到 3.2 内核的人(由于最近的 root 漏洞,每个人都应该这样做),您会注意到您的 USB 唤醒可能已损坏。他们更改了默认唤醒策略 ( http://www.spinics.net/lists/linux-usb/msg53661.html ),因此您需要进行一些更改:

  • 您不再需要在 中启用唤醒/proc/acpi/wakeup,默认情况下已启用
  • 除了设备中的设备外,您还需要为 USB 集线器启用唤醒 /sys/bus/usb/devices/*/power/wakeup

所以这:

echo USB1 > /proc/acpi/wakeup
echo enabled > /sys/bus/usb/devices/3-1/power/wakeup
Run Code Online (Sandbox Code Playgroud)

变成:

echo enabled > /sys/bus/usb/devices/usb3/power/wakeup
echo enabled > /sys/bus/usb/devices/3-1/power/wakeup
Run Code Online (Sandbox Code Playgroud)

希望这可以避免其他人解决相同的问题。


小智 7

对于Ubuntu的15+,你必须使用systemd替代rc.local。您可以在 google 上搜索“创建 systemd 服务”并按照说明进行操作,但请注意,将输出重定向到/proc/acpi/wakeup很棘手。要使其正常工作,您必须执行以下操作:

/bin/sh -c '/bin/echo XHC > /proc/acpi/wakeup'
Run Code Online (Sandbox Code Playgroud)

服务文件的示例输出(例如,/etc/systemd/system/suspendfix.service):

[Unit]
Description=fix to prevent system from waking immediately after suspend

[Service]
ExecStart=/bin/sh -c '/bin/echo XHC > /proc/acpi/wakeup'
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

或者在这个要点中