我有两个 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
路径中覆盖它们,这样它们就不会被软件包升级覆盖。你有两个选择:
将规则复制
/lib/udev/rules.d
到相同的路径/名称/etc/udev/rules.d
并进行编辑 - 这是最简单的,因为您只需稍微更改匹配的过滤器即可排除您的设备/总线组合。 Udev 将不会运行任何有匹配的 etc 规则的系统规则。 Otoh 任何 udev 维护者的更改都必须由我手动添加。创建后续规则(带有更高优先级,因此它在之后运行)并覆盖早期规则所采取的操作(例如删除或更改
RUN
操作)。
如果没有要覆盖的现有规则,则只需添加规则来执行所需的额外工作,例如运行取消绑定/绑定命令。
要查找适当的规则过滤器,您可以使用usevadm info <path>
查看设备属性。通过-a
开关,您将获得所有系统文件系统设备的属性及其所有父节点,也都可以用于匹配(对于属性重复,使用第一个匹配)。
man udev
有关编写规则的详细说明,请参阅(7)。