udev 규칙의 다양한 상위 장치 속성

udev 규칙의 다양한 상위 장치 속성

규칙의 다른 상위 장치에서 udev 장치 속성을 평가하는 방법을 이해하는 데 약간의 어려움이 있습니다. 다음과 같이 walk 속성을 사용하여 특정 직렬 USB 장치(HUAWEI 모뎀)에 대한 규칙을 작성하고 싶습니다.

$ udevadm info --attribute-walk --name=/dev/ttyUSB0

  looking at device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="generic"
    ATTRS{port_number}=="0"

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0':
    KERNELS=="1-1.3:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbserial_generic"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="02"
    ATTRS{bInterfaceProtocol}=="01"
    ATTRS{bNumEndpoints}=="03"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3':
    KERNELS=="1-1.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="1.3"
    ATTRS{idVendor}=="12d1"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 4"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="5"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="500mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0001"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="4561"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="HUAWEI"
    ATTRS{removable}=="removable"
    ATTRS{idProduct}=="1506"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="HUAWEI MOBILE"

장치를 식별하기 위해 다음 udev 규칙을 사용해 보았습니다.

ACTION=="add", KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="00", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506", RUN+="/usr/bin/systemctl start modem_dialer"

하지만 안타깝게도 인터페이스 장치의 속성과 ATTRS{bInterfaceNumber}=="00"물리적 장치의 속성을 동시에 사용할 수는 없습니다. ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506"둘 중 하나를 사용하면 잘 작동하지만 함께 사용하면 규칙이 더 이상 작동하지 않습니다.

하나의 규칙에서 서로 다른 상위 장치의 속성을 함께 사용하는 것에 대해 누락된 사항이 있습니까? 다른 부모의 부동산을 사용하는 것이 문제가 될 수 있는 다른 이유가 있습니까?

그건 그렇고, 그 배포판은 Arch Linux ARM입니다.

답변1

여러 상위 속성을 사용하려면 여러 규칙과 GOTO를 사용해야 합니다. 이 같은.

SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}!="00", GOTO="huawei_end"
ACTION=="add", KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506", RUN+="/usr/bin/systemctl start modem_dialer"
LABEL="huawei_end"

답변2

설명된 두 가지 규칙을 사용할 수 있습니다.여기(아마도 이 문서에서 발견된 또 다른 깔끔한 트릭과 결합되었을 수 있습니다.블로그 게시물더 다양하고 쉽게 섭취할 수 있도록):

ACTION=="add", SUBSYSTEM=="usb", ENV{USB_IDS}="%s{idVendor}:%s{idProduct}"
ACTION=="add", ENV{USB_IDS}=="12d1:1506", ATTRS{bInterfaceNumber}=="00", RUN+="/usr/bin/systemctl start modem_dialer"

그러나 첫 번째 규칙은 올바른 값을 포함하는 노드와 고유하게 일치해야 합니다 idVendor. 그렇지 않으면 올바른 값으로 설정되고 두 번째 규칙이 일치한다는 idProduct보장이 없습니다 . USB_IDS그러나 USB 리프 노드와 보편적으로 일치하는 속성은 없습니다. :/

답변3

반전 논리가 적은 대안은 다음과 같습니다.

# Match our dongle
KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506", GOTO="huawei"
# Did not match our dongle, skip the dongle rules
SUBSYSTEMS=="usb", GOTO="huawei_end"

LABEL="huawei"
ATTRS{bInterfaceNumber}=="00", SYMLINK+="ttyHuawei0", RUN+="/usr/bin/systemctl start modem_dialer"
ATTRS{bInterfaceNumber}=="01", SYMLINK+="ttyHuawei1"

LABEL="huawei_end"

점프가 실행되기 huawei_end위해서는 조건이 있어야 합니다 .

관련 정보