问题描述
这真的很烦人,因为我必须在暂停后拔掉鼠标,以确保偶尔的碰撞不会唤醒系统。我在系统设置中没有找到任何可以通过谷歌搜索禁用此功能的内容。
最佳方法
我还没有检查BIOS,但我已经找到了解决方案!
简短摘要:在 /proc/acpi/wakeup
中,您可以查看当前启用了哪些设备从挂起状态恢复。该列表显示了所谓的 “Devices” 的名称(缩写)。示例 “PWRB” 表示 “power button”。
如果将 device-names 写入该文件,则可以在启用/禁用之间切换它们。
我根据在其中找到该信息的博客编写了 a small HowTo for disabling wakeup-by-mouse 。
次佳方法
感谢所有发帖者,因为鼠标唤醒给我带来了很大的不便,我在这里得到了答案。我希望在解决方案中添加我的想法,因为这可能在更多情况下有所帮助。我必须禁用 /proc/acpi/wakeup
中的 3 个不同项目。我的设备: EHC1, EHC2, XHCI
。前 2 个是 USB2,第三个是 USB3 条目。请注意,虽然我的鼠标的 USB 收发器已插入 USB2 端口,并且任何 USB3 端口中都没有任何内容,但计算机将在鼠标移动时唤醒,直到所有 3 个项目都被禁用。
$ cat /proc/acpi/wakeup | sort
Device S-state Status Sysfs node
EHC1 S3 *disabled pci:0000:00:1d.0
EHC2 S3 *disabled pci:0000:00:1a.0
GLAN S4 *enabled pci:0000:08:00.0
.. ,, ..
USB7 S3 *disabled
WLAN S3 *disabled pci:0000:03:00.0
XHCI S3 *disabled pci:0000:07:00.0
要在每次启动时禁用唤醒项,您可以将类似的内容添加到 /etc/rc.local
..
echo EHC1 > /proc/acpi/wakeup
echo EHC2 > /proc/acpi/wakeup
echo XHCI > /proc/acpi/wakeup
对于在 cat /proc/acpi/wakeup | sort
下作为 enabled
发布的每个项目,测试哪些项目需要禁用(如 here 所示),方法是在终端中运行以下每个命令,然后测试鼠标是否唤醒系统(无需重新启动):
sudo sh -c "echo EHC1 > /proc/acpi/wakeup"
sudo sh -c "echo EHC2 > /proc/acpi/wakeup"
sudo sh -c "echo XHCI > /proc/acpi/wakeup"
(就我而言,即使在使用其他 USB 端口进行测试后,第一个就足够了)
如果/etc/rc.local
文件不存在
根据 this 帖子,运行:
printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
该文件应类似于:
#!/bin/bash
echo EHC1 > /proc/acpi/wakeup
echo EHC2 > /proc/acpi/wakeup
echo XHCI > /proc/acpi/wakeup
exit 0
重启。
如果仍然不起作用,可能是文件 /etc/systemd/system/rc-local.service
丢失或配置不正确。
测试用
sudo /etc/init.d/rc.local start
和
sudo systemctl status rc-local
以下 How to Enable /etc/rc.local with Systemd :
创建文件:
sudo nano /etc/systemd/system/rc-local.service
然后添加以下内容。
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
保存并关闭文件。要在 Nano 文本编辑器中保存文件,请按 Ctrl+O,然后按 Enter 确认。要退出文件,请按 Ctrl+X。
检查一切正常,没有错误:
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
重新启动以查看更改。
第三种方法
我使用的解决方案是 udev 规则,它禁用特定 USB 设备的唤醒。它应该不知道设备插入哪个端口。
使用以下内容创建 /etc/udev/rules.d/90-usb-wakeup.rules
(根据需要修改 idVendor
和 idProduct
,请参阅 lsusb
的输出,它以以下形式提供 ID: vendor:product
):
# Disable waking up from Logitech unified receiver
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c52b", ATTR{power/wakeup}="disabled"
要在不重新启动的情况下应用它:
-
跑步:
\n
sudo udevadm control --reload-rules\n
\n
-
断开并重新连接 USB 设备。\n
灵感来自https://wiki.archlinux.org/title/udev#Waking_from_suspend_with_USB_device
第四种方法
此解决方案适用于 Ubuntu 15.10、18.04、20.04、22.04
通过拔下并重新插入鼠标并搜索 /sys/bus/usb/devices/*
文件夹来查找鼠标 idProduct 和 idVendor。忽略名称中带有 :
的链接。例如,点击 3-3
的链接,但\n忽略 3-3:1.0
现在尝试读取 idProduct 和 idVendor。例如:\n cat /sys/bus/usb/devices/7-2.3/idProduct
=> 2000
,\n cat /sys/bus/usb/devices/7-2.3/idVendor
=> 24ae
。
最后我在/lib/systemd/system-sleep
目录中创建一个脚本,将其命名为mouse-suspend.sh
#!/bin/bash
# From lsusb: Bus 007 Device 008: ID 24ae:2000
idProduct=2000
idVendor=24ae
# Get sys device path by vendorId and productId
function find_device()
{
local vendor=$1
local product=$2
vendor_files=( $(egrep --files-with-matches "$vendor" /sys/bus/usb/devices/*/idVendor) )
for file in "${vendor_files[@]}"; do
local dir=$(dirname "$file")
if grep -q -P "$product" "$dir/idProduct"; then
printf "%s\n" "$dir"
return
fi
done
}
sysdev=$(find_device $idVendor $idProduct)
if [ ! -r "$sysdev/power/wakeup" ]; then
echo $idVendor:$idProduct not found 1>&2
exit 1
fi
case "$1" in
enabled|disabled)
echo $1 > "$sysdev/power/wakeup"
;;
*)
echo "$0 enabled -- to enable the wakeup for this device"
echo "$0 disabled -- to disable the wakeup for this device"
;;
esac
grep --color=auto -H ".*" "$sysdev/power/wakeup"
exit 0
如果不起作用则运行 sudo chmod +x mouse-suspend.sh && ./mouse-suspend.sh enabled
第五种方法
上述解决方案( https://askubuntu.com/a/265389/1467620 )有效,但它很粗糙,而且它还禁用了键盘唤醒,这实际上很有用。
更精细的替代方案可以是这样的:\n首先,我们首先枚举连接到系统的 USB 设备:
lsusb | sort
从这里,哪一个是鼠标就很明显了:
Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver
然后我们继续查找设备映射到的位置:
grep enabled /sys/bus/usb/devices/*/power/wakeup
/sys/bus/usb/devices/2-1.2.6/power/wakeup:enabled
/sys/bus/usb/devices/2-1.2.7/power/wakeup:enabled
最后,为了弄清楚哪个是哪个,我们使用:
dmesg | grep Logitech | grep -o -P "usb.+?\s"
usb 2-1.2.7:
此时很明显需要禁用哪一个:
sudo sh -c "echo 'disabled' > /sys/bus/usb/devices/2-1.2.7/power/wakeup"
注意:每次需要以超级用户身份 echo 时,sh -c
是必需的,否则系统将不允许重定向到特权文件。
然后,只需暂停系统并验证鼠标不会唤醒系统,而键盘会唤醒它。
这不会在系统重新启动后继续存在,因此您需要 re-run 最后一个命令,或者将其添加到 .bashrc
或 .zshrc
。
自从我安装 16.04 以来,这个问题在 Ubuntu 上一直困扰着我,而且可能永远存在,我不明白为什么 Canonical 不会在系统设置中添加它。
来源:https://codetrips.com/2020/03/18/ubuntu-disable-mouse-wake-from-suspend/
第六种方法
可笑,但是插拔、插回来确定设备代码的方法是最不繁琐的。所以:
-
寻找
grep . /sys/bus/usb/devices/*/power/wakeup | grep enabled
使用 plug-out-plug-in 方法找出罪犯
-
禁用
sudo sh -c "echo 'disabled' > /sys/bus/usb/devices/YOUR_DEVICE/power/wakeup"
受到这个 blog post 的启发
第七种方法
对我有用的解决方案是从 here 获得的。
首先,我们首先枚举连接到系统的 USB 设备:
lsusb | sort
从这里,哪一个是鼠标就很明显了:
Bus 002 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver
然后我们继续查找设备映射到的位置:
grep enabled /sys/bus/usb/devices/*/power/wakeup
/sys/bus/usb/devices/2-1.2.6/power/wakeup:enabled
/sys/bus/usb/devices/2-1.2.7/power/wakeup:enabled
最后,为了弄清楚哪个是哪个,我们使用:
dmesg | grep Logitech | grep -o -P "usb.+?\s"
usb 2-1.2.7:
此时很明显需要禁用哪一个:
sudo sh -c "echo 'disabled' > /sys/bus/usb/devices/2-1.2.7/power/wakeup"
(注意:每次需要以超级用户身份回显时,都需要 sh -c,否则系统将不允许重定向到特权文件)。
然后,只需暂停系统并验证鼠标不会唤醒系统,而键盘会唤醒它。
这不会在系统重新启动后继续存在,因此您需要 re-run 最后一个命令,或者将其添加到您的 .bashrc 或 .zshrc
重新启动后运行命令\n运行命令 sudo crontab -e
\n然后在新行中添加 @reboot
和要在重新启动后运行的命令。例如:\n @reboot sudo sh -c "echo 'disabled' > /sys/bus/usb/devices/3-3/power/wakeup"
保存文件并尝试重新启动计算机。不要将此命令添加到您的 .bashrc 中,它可能会阻止您的计算机启动。