如何调试 udev 规则?

如何调试 udev 规则?

我想让 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

并且设备被拔出/插入,正确的权限被注册。

相关内容