如何使 /proc/acpi/wakeup 的更改永久生效?

如何使 /proc/acpi/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

我告诉系统暂停,它正常工作。但稍后唤醒它后,设置更改为:

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

或者

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

有任何想法吗?


谢谢你的回复。遗憾的是它没有解决我的问题。

所有的

/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

/sys/bus/usb/devices/3-1/power/wakeup

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

答案1

我在 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

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

for usb in `cat /proc/acpi/wakeup | grep USB | cut -f1`;

for usb in 'USB1' 'USB3';

希望这能帮助遇到同样问题的人。这种方法为我解决了这个问题。

答案2

也许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

变成:

echo enabled > /sys/bus/usb/devices/usb3/power/wakeup
echo enabled > /sys/bus/usb/devices/3-1/power/wakeup

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

答案3

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

/bin/sh -c '/bin/echo XHC > /proc/acpi/wakeup'

服务文件的示例输出(例如/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

或者在这里要旨

答案4

根据@Hrishikesh Kadam 的回答,但有更多细节和一些改进。

相关内容