我的 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 的回答,但有更多细节和一些改进。