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

장치가 분리/연결되면 올바른 권한이 등록됩니다.

관련 정보