Usb

如何調試 udev 規則?

  • September 5, 2020

我想讓一個 USB 音頻設備可以通過 QEMU 訪問。我創建了一個 udev 規則,但它不起作用。我想知道如何調試這個問題?

SUBSYSTEM=="usb", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="8808", MODE="0666"

這就是我最終隔離問題的方式。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

並且設備被拔出/插入,註冊了正確的權限。

引用自:https://unix.stackexchange.com/questions/470960