禁止特定设备唤醒系统

禁止特定设备唤醒系统

我找到了类似的主题,但找不到答案。

在我的系统(Xubuntu 20.04)中grep . /sys/bus/usb/devices/*/power/wakeup仅提供此功能

/sys/bus/usb/设备/1-1/power/wakeup:已禁用
/sys/bus/usb/设备/2-1/power/wakeup:已禁用
/sys/bus/usb/devices/3-13/power/wakeup:已禁用
/sys/bus/usb/devices/3-14/power/wakeup:已禁用
/sys/总线/USB/设备/3-5/电源/唤醒:已禁用
/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-5/power/

活动持续时间  
异步  
自动暂停  
自动暂停延迟 ms  
连接持续时间  
控制  
等级  
坚持  
运行时活动儿童  
运行时活动时间  
运行时启用  
运行时状态  
运行时暂停时间  
运行时使用情况  
醒来  
唤醒中止计数  
唤醒活动  
唤醒活动计数
唤醒计数
唤醒到期次数
唤醒最后时间_ms
唤醒最大时间_ms
唤醒总时间_毫秒

然而,无线鼠标(+ 2.4GHz USB 适配器)可将系统从挂起状态唤醒。有什么方法可以禁用该特定 USB 端口/设备吗?

lshw

          *-usbhost:0      
                产品:xHCI 主机控制器
                供应商:Linux 5.4.0-70-generic xhci-hcd
                物理 ID:0
                总线信息:usb@3
                逻辑名称:usb3
                版本:5.04
                功能:usb-2.00
                配置:驱动程序=集线器插槽=15 速度=480Mbit/s
              *-USB:0
                   描述:鼠标
                   产品:无线鼠标
                   供应商:Genius
                   物理 ID:5
                   巴士信息:USB@3:5
                   版本:10.01
                   功能:USB-1.10
                   配置:驱动程序=usbhid 最大功率=100mA 速度=12Mbit/s

lsusb -t

    /:总线 04.端口 1:Dev 1,Class=root_hub,驱动程序=xhci_hcd/6p,5000M
    /: 公共汽车03.端口 1:设备 1,类别=root_hub,驱动程序=xhci_hcd/15p,480M
        |__端口 5:设备 8,如果为 0,则类 = 人机接口设备,驱动程序 = usbhid,12M
        |__ 端口 10:Dev 2,If 2,Class=Audio,Driver=snd-usb-audio,480M
        |__ 端口 10:设备 2,如果 0,类别=视频,驱动程序=uvcvideo,480M
        |__ 端口 10:Dev 2,If 3,Class=Audio,Driver=snd-usb-audio,480M
        |__ 端口 10:Dev 2,If 1,Class=Video,Driver=uvcvideo,480M
        |__ 端口 12:设备 3,如果为 0,则类别 = 供应商特定类别,驱动程序 = mt7601u,480M
        |__ 端口 13:设备 4,如果为 0,则类别=无线,驱动程序=btusb,12M
        |__ 端口 13:设备 4,如果 1,类别=无线,驱动程序=btusb,12M
        |__ 端口 14:设备 5,如果为 0,则类 = 人机接口设备,驱动程序 = usbhid,1.5M
    /:总线 02.端口 1:Dev 1,Class=root_hub,驱动程序=ehci-pci/2p,480M
        |__ 端口 1:设备 2,如果 0,类别=Hub,驱动程序=hub/8p,480M
    /:总线 01.端口 1:Dev 1,Class=root_hub,驱动程序=ehci-pci/2p,480M
        |__ 端口 1:设备 2,如果 0,类别=Hub,驱动程序=hub/6p,480M

但由于/sys/bus/usb/devices似乎没有相关内容,我不确定要配置什么以及如何配置。

答案1

将值disabled而不是写入enabled文件/sys/bus/usb/devices/3-5/power/wakeup可以正常工作:当值为时disabled,相应的鼠标或键盘不会唤醒计算机,但如果值为enabled- 它们会唤醒它。此帮助脚本针对具有特定vendorId和的设备执行此操作productId

#!/bin/bash
### Put it here: /usr/bin/usb-resume-control

while getopts v:p:s: flag
do
    case "${flag}" in
      v) vendor=${OPTARG};;
      p) product=${OPTARG};;
      s) state=${OPTARG};;
    esac
done
if [ -z "$vendor" -o -z "$product" ]; then
        echo -en "Usage: $0 -v vendorId -p productId -s state\nin any order, where vendorId and productId are both from [lsusb] and state can be enable or disable\n"
        exit 1;
fi
if [ -z $state ]; then
        stateTo="disabled"
fi
DEVICES=/sys/bus/usb/devices

for a in `ls $DEVICES`; do
  if [ -f "$DEVICES/$a/idVendor" -a -f "$DEVICES/$a/idProduct" ]; then
    idVendor=`cat "$DEVICES/$a/idVendor"`
    idProduct=`cat "$DEVICES/$a/idProduct"`
    if [ -f "$DEVICES/$a/product" ]; then 
      productName=`cat "$DEVICES/$a/product"`
    fi
    WAKEUPFILE="$DEVICES/$a/power/wakeup"
    if [ $idVendor = $vendor -a $idProduct = $product -a -f "$WAKEUPFILE" ]; then
      oldState=`cat "$WAKEUPFILE"`
      echo "$state" > "$WAKEUPFILE"
      newState=`cat "$WAKEUPFILE"`
      echo Bus-port:$a vendor=$idVendor product=$idProduct name=$productName WakeUp: old=$oldState new=$newState
    fi
  fi
done

为了自动化流程,请创建一个包含以下内容的systemd单元文件:/etc/systemd/system/control-usb-wakeup-mouse.service

[Unit]
Description=Control wakeup of USB device before sleep so they will or not resume the computer
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/usr/bin/usb-resume-control -v 045e -p 0745 -s disabled
StandardOutput=journal

[Install]
WantedBy=sleep.target

将 vendorId 和 productId 更新为您的 USB 设备(参见 的输出lsusb)。之后针对设备运行以下命令:

chmod 755 /etc/systemd/system/control-usb-wakeup-mouse.service
systemctl daemon-reload
systemctl enable control-usb-wakeup-mouse.service

现在提到的设备无法唤醒睡眠后的计算机。

答案2

有时,USB 端口的 BIOS 设置可用于在挂起期间启用/禁用电源和/或启用/禁用唤醒。

但您可能还需要禁用相关 USB 控制器/集线器的唤醒功能。请尝试以下操作:

cat /proc/acpi/wakeup

我实际上不知道如何确认这里的设备名称是你想要的设备,因为这里列出的名称与你在其他地方看到的不同,但就我而言,我的 USB 设备是 EHC1、EHC2 和 XHC

您可以通过以下方式在启用和禁用之间切换:

sudo -s
echo XHC > /proc/acpi/wakeup
exit

但我不确定这是否是永久性的改变。我不确定使它永久化的最佳方法,我只是制作了一个可执行脚本来回显我需要的命令,并将其添加到 roots crontab 中,如下所示:

@reboot /etc/my_script

答案3

我知道这有点过时了,但我也遇到过这个问题,其他解决方案都不起作用。我找到了一个更简单的解决方案,希望它能有所帮助。

什么乌格利奇说关于写值已禁用代替已启用文件中的/sys/bus/usb/devices/3-5/power/wakeup设置正确无误。不过需要说明的是,这只能在重新启动之前起作用,重新启动后,它才会再次启用。

一个快速而肮脏的方法来设置“永久”禁用是简单地回显已禁用进入 **/*/power/wakeup 文件/etc/rc.local文件。

echo disabled > /sys/bus/usb/devices/3-5/power/wakeup

在最后一行之前/etc/rc.local文件应该可以解决问题。

相关内容