KCi*_*nAZ 5 laptop lid kvm-switch wakeup
我使用的是无线罗技键盘,罗技统一接收器插入 KVM 切换器。我创建了一个 systemd 挂起快捷方式来挂起笔记本电脑(联想 IdeaPad)。笔记本电脑的盖子始终处于关闭状态。除非我打开笔记本电脑的盖子,否则我无法将联想从暂停状态唤醒。一旦盖子打开,笔记本电脑就会被唤醒。我希望能够在不打开盖子的情况下唤醒笔记本电脑。我不知道该怎么做。
我尝试了两件事,但都不起作用。首先,我启用了 Logitech Unifying Receiver 的唤醒文件 (proc/acpi/wakeup)。当我使用键盘时,它确实唤醒了笔记本电脑。问题是笔记本电脑在大约五分钟内醒来,而我没有任何输入。键盘或其他任何东西都没有活动。其次,我尝试了如何使用无线 USB 键盘将 Ubuntu 13.10 从挂起状态唤醒? 与第一个问题相同——笔记本电脑会在不可预测的时间唤醒,似乎是自行唤醒的。
当我使用 lsinput 查看设备时,我可以看到 Logitech 键盘。它的物理地址为 usb-0000:00:14.0-3.1.1:1。当我查看 proc/acpi/wakeup 时,我看到 pci:0000:00:14.0。没有 3.1.1 扩展。如果我查看 /sys/bus/usb/devices/1-3.1.1,我会发现它是罗技统一接收器。
如何将所有这些组合在一起以通过键盘输入唤醒,但抑制其他唤醒事件?
几天后,我发现了这一点——“与嵌入式控制器的交互,这是真正难以诊断问题的地方。嵌入式控制器 (EC) 包含控制外设的专有代码。” 来自https://wiki.ubuntu.com/Kernel/Reference/ACPITricksAndTips
可以说,这看起来相当困难,并且可能是我的联想特有的。
我遇到了同样的问题,并且也被我的 USB 没有出现在 /proc/acpi/wakeup 中所困扰。然而,最终,尽管许多解决方案表明这是必需的,但我不需要在 ACPI 中启用 USB。
相反,在我的 IR 设备连接的 USB 端口上启用唤醒就足够了。
查找您的设备 ID:
$ lsusb
Run Code Online (Sandbox Code Playgroud)
总线 002 设备 002:ID 8087:8001 英特尔公司
总线 002 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器
总线 001 设备 002:ID 8087:8009 英特尔公司总线 001
设备 001:ID 1d6b:0002 Linux Foundation 2.0根集线器
总线 004 设备 001:ID 1d6b:0003 Linux Foundation 3.0 根集线器
总线 003 设备 003:ID 13ba:0018 PCPlay 条形码 PCP-BCG4209
总线 003 设备 002:ID 1934:5168 Feature Integration Technology Inc. (Fintek) F71610A 或 F71612A消费类红外接收器/收发器
总线 003 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器
在上面的示例中,我的设备 ID 是5168。
Grep /sys/bus/usb 查找您的设备插入的端口:
$ grep 5168 /sys/bus/usb/devices/*/idProduct
Run Code Online (Sandbox Code Playgroud)
/sys/bus/usb/devices/3-13/idProduct:5168
这表明我的设备已插入总线 3、端口 13。
确认端口正确:
$lsusb -t
Run Code Online (Sandbox Code Playgroud)
/: 总线 04.端口 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
/: 总线 03.端口 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
|__ 端口 13: Dev 2,如果 0,类 = 供应商特定类,驱动程序 = mceusb,12M
|__ 端口 14:Dev 3,如果 0,类 = 人机接口设备,驱动程序 = usbhid,1.5M
|__ 端口 14:Dev 3,如果 1, Class=人机接口设备,Driver=usbhid,1.5M
/:总线02.端口1:Dev 1,Class=root_hub,Driver=ehci-pci/2p,480M |__端口1:Dev 2,如果为0,Class=Hub , Driver=hub/8p, 480M
/: 总线 01.端口 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M |
__ 端口 1: Dev 2, 如果 0, Class=Hub, Driver=hub /6p,480M
总线 3、端口 13 与 grep (3-13) 返回的总线/端口匹配
检查是否启用唤醒:
$ cat /sys/bus/usb/devices/3-13/power/wakeup
Run Code Online (Sandbox Code Playgroud)
残疾人
启用端口唤醒:
$ sudo sh -c 'echo "enabled" > /sys/bus/usb/devices/3-13/power/wakeup'
Run Code Online (Sandbox Code Playgroud)
检查是否启用唤醒:
$ cat /sys/bus/usb/devices/3-13/power/wakeup
Run Code Online (Sandbox Code Playgroud)
已启用
测试您的设备,它是否唤醒系统?
使此更改在重新启动后保持不变:
$ sudo nano /etc/rc.local
Run Code Online (Sandbox Code Playgroud)
在注释之后和“exit 0”之前添加以下行
# Enable Wake on IR for USB bus 3 port 13.
echo enabled > /sys/bus/usb/devices/3-13/power/wakeup
Run Code Online (Sandbox Code Playgroud)
现在愉快地从 USB 设备唤醒您的电脑。
限制
这种方法的一个问题是,如果 IR 设备插入的 USB 端口发生变化,那么专门启用该端口并没有帮助。
这篇文章提供了一种使用 Udev 规则根据插入的设备启用任何 IR 端口的方法。
参考
Kodi、MCE Remote 和 Ubuntu
使用键盘或鼠标从挂起状态唤醒
使用 Udev 规则启用 IR 设备
这个问题有三个可能适合您的答案:使用无线 USB 键盘或鼠标从挂起状态唤醒(对于任何 Linux 发行版)
在终端中点击:
grep . /sys/bus/usb/devices/*/power/wakeup
Run Code Online (Sandbox Code Playgroud)
对我来说,结果是发现所有 USB 都被禁用。现在,输入:
1.
sudo su
Run Code Online (Sandbox Code Playgroud)
我们现在拥有 root 权限。
2.我有8个USB端口(你有多少个USB端口就这样做),所以:
echo enabled > /sys/bus/usb/devices/usb1/power/wakeup
echo enabled > /sys/bus/usb/devices/usb2/power/wakeup
echo enabled > /sys/bus/usb/devices/usb3/power/wakeup
echo enabled > /sys/bus/usb/devices/usb4/power/wakeup
echo enabled > /sys/bus/usb/devices/usb5/power/wakeup
echo enabled > /sys/bus/usb/devices/usb6/power/wakeup
echo enabled > /sys/bus/usb/devices/usb7/power/wakeup
echo enabled > /sys/bus/usb/devices/usb8/power/wakeup
Run Code Online (Sandbox Code Playgroud)
继续测试吧。现在您可以从任何无线或有线 USB 键盘和鼠标中唤醒。
那么,我们必须启用所有这些的原因是因为在下一步中,我们将在 rc.local 中编写此命令,以便在每次重新启动后执行该命令,并且在重新启动后一些 Linux 发行版(可能是全部)更改 USB 端口。 我们不用担心启用它们会出什么问题,因为linux处于挂起或休眠状态,它不能使用wifi下载任何东西,所以如果我们不刻意唤醒它,它就不会被唤醒。 。
下一步:
3.
sudo nano /etc/rc.local
Run Code Online (Sandbox Code Playgroud)
然后我们将步骤 2 中的所有内容粘贴到那里(当然是在 exit 0 之前)。
就是这样。从现在开始,我们可以使用无线 USB 和鼠标从挂起状态唤醒。
我希望它对你们所有人都有效。本指南是在测试了互联网上所有其他可能的解决方案后制定的。
除了上面的指南之外,我想添加此信息,因为我最近发现一些无线 USB 设备从睡眠状态唤醒后,会恢复为禁用状态。我再说一遍,只有部分 USB 设备可以做到这一点,而不是全部。这就是为什么我没有在我的指南中添加这个小指南。
因此,您按照我上面的说明进行操作,并且您的电脑成功唤醒,但在当天晚些时候,它突然无法再次唤醒。
解决方案:
打开终端并执行以下操作:
lsusb
Run Code Online (Sandbox Code Playgroud)
在您的键盘设备 ID 信息中,前 4 位数字是供应商 ID,接下来的 4 位数字是产品 ID(参见屏幕截图)
接下来做:
sudo nano /etc/udev/rules.d/10-wakeup.rules
Run Code Online (Sandbox Code Playgroud)
其中“wakeup”输入您想要的脚本名称。如果您有许多其他 udev 规则,则数字 10 是优先级,数字越低,“规则”将在其他规则之前执行。
复制粘贴此内容并将供应商 ID 和产品 ID 替换为您自己的无线键盘供应商 ID 和产品 ID。
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="062a", ATTRS{idProduct}=="4101" RUN+="/bin/sh -c 'echo enabled > /sys/bus/usb/devices/usb8/power/wakeup'"
Run Code Online (Sandbox Code Playgroud)
*usb8对我来说是我的无线键盘(您也可以在屏幕截图(Bus 008)中看到),将其替换为您自己的。
Ctrl+O保存,Ctrl+X退出并重新启动。
帕夫洛斯·西奥多鲁的回答非常有帮助。我想补充一点,您可以通过grep几次管道dmesg ,然后一次egrep,最后使用tail确保它是最新的,找到您的鼠标/键盘在启动时连接到的 USB 设备入口。
使用此方法,您不必在所有USB 端口上启用唤醒。
我将以下内容放入我的 /etc/rc.local 文件中,即使从一个 USB 端口移动到另一个端口,它每次都会找到我的 Logitech 接收器。只需将 dmesg 中的键盘或鼠标名称替换为“Logitech K270”即可
KB="$(dmesg | grep "Logitech K270 as" | grep -o -P "usb.{0,5}" | egrep -o ".{0,3}$" | tail -1)"
echo enabled > /sys/bus/usb/devices/${KB}/power/wakeup
Run Code Online (Sandbox Code Playgroud)
这可以在启动时运行,但似乎不能在从挂起唤醒时运行,因此我必须将脚本文件放在 /lib/systemd/system-sleep/ 中。创建它,将其设置为全局可执行文件,并为其指定一个以 00 到 99 之间的两位数开头的名称。我的脚本如下,再次用 dmesg 替换您的键盘/鼠标用语:
#!/bin/sh
# Action script to enable wake after suspend by keyboard or mouse
if [ $1 = post ]
then
KB="$(dmesg | grep "Logitech K270 as" | grep -o -P "usb.{0,5}" | egrep -o ".{0,3}$" | tail -1)"
echo enabled > /sys/bus/usb/devices/${KB}/power/wakeup
fi
if [ $1 = pre ]
then
KB="$(dmesg | grep "Logitech K270 as" | grep -o -P "usb.{0,5}" | egrep -o ".{0,3}$" | tail -1)"
echo enabled > /sys/bus/usb/devices/${KB}/power/wakeup
fi
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我无法解释,“后”睡眠if语句仅在每次唤醒时都有效......但“前”睡眠if语句似乎每次都有效。
小智 0
截至 2021 年 9 月 10 日,将启用状态设置为永久不适用于 Ubuntu 18+ 上的少数设备。
@Pavlos Theodorou的精彩答案(也是此处的答案 2 )解决了这个问题。链接到这里的帖子。