Usb
如何調試 udev 規則?
我想讓一個 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
並且設備被拔出/插入,註冊了正確的權限。