我想让 USB 音频设备能够直通 QEMU。我创建了一个 udev 规则,但它不起作用。我想知道如何调试这个问题?
SUBSYSTEM=="usb", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="8808", MODE="0666"
答案1
这就是我最终隔离问题的方法。 Udev 根据从 USB 主机控制器到设备本身的设备属性层次结构检查规则规范。这些不同的节点具有可以在 udev 规则中指定的属性集合。
要查看观察规则的执行情况,请使用以下命令:
udevadm control --log-priority=debug
journalctl -f
如果即使在重新加载 udev 并重新安装设备后也没有在日志中看到您的规则,请确保文件名格式与 udev 期望一致:99-name.rules
要查看观察 udev 事件,请使用以下命令:
udevadm monitor --environment
要查看特定设备的属性,请使用以下命令:
udevadm info -q all -a /path/to/device/as/seen/in/aformentioned/logs
您将看到一系列属性块,如下所示
looking at device '/devices/...':
KERNEL=="event3"
SUBSYSTEM=="input"
DRIVER==""
looking at parent device '/devices/...':
KERNELS=="input23"
SUBSYSTEMS=="input"
DRIVERS==""
ATTRS{name}=="Speed Dragon USB Advanced Audio Device"
ATTRS{phys}=="usb-0000:00:14.0-5/input3"
ATTRS{properties}=="0"
ATTRS{uniq}==""
looking at parent device '/devices/...':
KERNELS=="1-5"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="16"
ATTRS{bMaxPower}=="100mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 4"
ATTRS{bcdDevice}=="0100"
ATTRS{bmAttributes}=="80"
ATTRS{busnum}=="1"
ATTRS{configuration}==""
ATTRS{devnum}=="11"
ATTRS{devpath}=="5"
ATTRS{idProduct}=="8808"
ATTRS{idVendor}=="0d8c"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Speed Dragon"
ATTRS{maxchild}=="0"
ATTRS{product}=="USB Advanced Audio Device"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="removable"
ATTRS{speed}=="12"
ATTRS{urbnum}=="7861"
ATTRS{version}==" 2.00"
将我的设备与最后一个块相匹配,我最终意识到我的 udev 规则应该指定SUBSYSTEMS=="usb"
而不是SUBSYSTEM=="usb"
.这是一个令人悲伤的发现:(
一旦指定了正确的规则:
请注意,无效或不正确的属性将被默默忽略。
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="8808", MODE="0666"
Udev 是通过以下方式重新加载的:
sudo udevadm control --reload-rules
并且设备被拔出/插入,正确的权限被注册。