如何防止驱动程序将 USB 设备绑定到特定总线上?

如何防止驱动程序将 USB 设备绑定到特定总线上?

我有两个 Logitech Unifying 接收器的设置,每个接收器都绑定了一个键盘。其中一个接收器将由设备所连接的物理机使用,另一个必须传递给 QEMU 虚拟机。

我可以按照中的说明手动解除绑定一个接收器如何使用Linux内核驱动程序绑定/取消绑定USB-HID设备接口?。这种方法有一些缺点:

  • 我必须通过查看 dmesg 手动确定设备标识符。
  • 每次关闭虚拟机以及每次重新启动时,都必须重复解除绑定过程。

然后我试图找到阻止 USB 驱动程序绑定它的内核模块选项,并找到了quirks选项usbhid。不幸的是,无法使用此参数,因为我有两个具有相同供应商和设备 ID 的相同接收器。

这两个设备可通过其独立的总线来区分。也就是说,lsusb看起来像:

Bus 001 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 002 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver

有没有办法阻止hid-logitech-dj(或usbhid)将USB设备绑定到某个总线上?

目标机器运行带有 Linux 3.9 内核的 Arch Linux 64 位。

答案1

在 UDEV 中,可以添加规则来搜索特定总线并将选项设置为“ignore_device”。您是否提到了您的内核版本或操作系统?

答案2

首先看一下我的回答在这里- 您应该拥有了解 USB 设备如何连接所需的所有信息。

然后,您可以在跑步时连接设备udevadm monitor以查看正在触发哪些事件以及udevadm test --action=<action> <path>执行哪些操作乌德夫正在服用。

系统规则应该位于/lib/udev/rules.d- 您很可能希望在/etc/udev/rules.d路径中覆盖它们,这样它们就不会被软件包升级覆盖。你有两个选择:

  1. 将规则复制/lib/udev/rules.d到相同的路径/名称/etc/udev/rules.d并进行编辑 - 这是最简单的,因为您只需稍微更改匹配的过滤器即可排除您的设备/总线组合。 Udev 将不会运行任何有匹配的 etc 规则的系统规则。 Otoh 任何 udev 维护者的更改都必须由我手动添加。

  2. 创建后续规则(带有更高优先级,因此它在之后运行)并覆盖早期规则所采取的操作(例如删除或更改RUN操作)。

如果没有要覆盖的现有规则,则只需添加规则来执行所需的额外工作,例如运行取消绑定/绑定命令。

要查找适当的规则过滤器,您可以使用usevadm info <path>查看设备属性。通过-a开关,您将获得所有系统文件系统设备的属性及其所有父节点,也都可以用于匹配(对于属性重复,使用第一个匹配)。

man udev有关编写规则的详细说明,请参阅(7)。

相关内容