![udev 规则中各种父设备的属性](https://linux22.com/image/65508/udev%20%E8%A7%84%E5%88%99%E4%B8%AD%E5%90%84%E7%A7%8D%E7%88%B6%E8%AE%BE%E5%A4%87%E7%9A%84%E5%B1%9E%E6%80%A7.png)
我在理解如何在规则中评估来自不同父设备的 udev 设备属性时遇到一些困难。我想为特定的串行USB设备(HUAWEI Modem)编写一条规则,其属性walk如下:
$ 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
必须有一个条件才能执行。