是否可以阻止 USB 设备的功能?

是否可以阻止 USB 设备的功能?

我有一个与无线手持遥控器 (Dupad G20S Pro Plus) 通信的 USB 设备。它在我的 Debian 盒子上运行得很好。我试图解决的问题是防止遥控器上的电源按钮关闭系统(我猜遥控器更适合智能电视)。

我至少通过 lsusb 找出了有问题的设备功能是:

% lsusb -vd 4842:0001
...
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0
      bInterfaceProtocol      1 Keyboard
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               2.01
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     121
          Report Descriptor: (length is 121)
...
            Item(Local ): Usage, data= [ 0x81 ] 129
                            System Power Down
...

有没有办法在某些内核级别阻止此功能?我确实发现我可以使用 systemd-inhibit 阻止一般关闭,但更愿意使用较低级别的东西(例如 udev)。

更新

这是针对 Debian 服务器(不是桌面)的。正在捕获关键事件以用于家庭自动化目的。

答案1

解决方案的线索(对于基于 systemd 的 linux 主机)来自人登录.conf(8)

只有带有“power-switch”udev 标签的输入设备才会被监视以获取键/盖开关事件。

实际上这个标签是由默认 udev 规则

SUBSYSTEM=="input", KERNEL=="event*", ENV{ID_INPUT_KEY}=="1", TAG+="power-switch"

我能够通过注释该文件(/etc/udev/rules.d/70-power-switch.rules)中的规则来阻止该操作。

附加信息:

我最初的修复尝试是在新文件中删除具有此新规则的标签/etc/udev/rules.d/80-power-switch.rules(在 后处理70-power-switch.rules):

SUBSYSTEM=="input", KERNEL=="event*", TAG-="power-switch"

尽管我的 systemd 版本支持标签删除(249),但我无法让它工作。我最好的猜测是 systemd 已经收到原始标签的警报,并且不支持删除该标签。

答案2

我试图解决的问题是防止遥控器上的电源按钮关闭系统

首先要做的是找出如何这在 Linux 中有效,以及 Linux 系统的哪一部分监听“电源按钮”事件(实际上我很惊讶其中一部分会监听)。描述符可能涉及也可能不涉及其中。

我尝试的第一件事是识别输入设备(查看 中的符号链接/dev/input/by-*,它们映射到具体的/dev/input/eventX。您可以使用evtest它来查看其中哪一个产生其他按键。然后evtest --grab对其执行 a 操作,如果电源按钮停止工作,它会被稍后的某个阶段处理(例如您的桌面环境,所以看看您使用的是哪一个,如果您可以配置它)如果它仍然有效,则它处于较早的阶段(内核模块,因此您需要启动)。查看内核)。

答案3

如果遥控器上的电源按钮仅在您登录时关闭系统,那么它可能是由您的桌面环境处理的。

Debian 的默认桌面环境是 GNOME,它通过gsd-media-keysGNOME 设置守护进程的插件来处理这些事情。我自己更喜欢 KDE,所以我手头没有可以用来测试这个的 GNOME 系统。但通过谷歌搜索,我发现配置此类内容的旧方法在现代版本的 GNOME 中不再有效:​​-(


如果遥控器的电源按钮在无人登录时也导致关机,则可能是由 处理的logind。在这种情况下,解决方案可能很简单。

在 中/etc/systemd/logind.conf,有许多注释掉的行用于确定如何处理某些特殊键和开关。

默认情况下,所有这些行都被注释掉,并使logind按键和开关执行它们通常应该执行的操作,例如键盘上的“电源”键将触发受控关闭。由于遥控器的电源按钮可能冒充 USB 键盘上的“电源”键,因此这正是您想要禁用的功能!

你会发现像这样的注释掉的行/etc/systemd/logind.conf

#HandlePowerKey=poweroff

您需要编辑该文件以取消注释该行,并将其更改为:

HandlePowerKey=ignore

老实说,我不确定对logind配置的更改是否会立即生效,还是只有在重新启动后才能生效。手册页似乎没有提到这个事实,并且似乎没有记录的方式来表明logind它应该重新加载其配置。

相关内容