규칙의 다른 상위 장치에서 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
위해서는 조건이 있어야 합니다 .