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

デバイスが切断/接続されると、正しい権限が登録されます。

関連情報