let*_*try 5 usb devices udev symbolic-link
我有 3 个 USB 转串口设备通过 USB 集线器连接到 PC。它们根据插入顺序分配设备路径(即 /dev/ttyUSB0 或 /dev/ttyUSB1 或 /dev/ttyUSB2 )。我的应用程序将如果给定 USB 设备的设备路径保持静态,则使用起来会容易得多。
\n\n计划是编写 udev 规则,使用唯一的串行属性来标识设备,然后将其符号链接到静态名称下。该设备的属性是:
\n\nuser->/dev:udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB1)\n\n looking at device \'/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1\':\n KERNEL=="ttyUSB1"\n SUBSYSTEM=="tty"\n DRIVER==""\n\n looking at parent device \'/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1\':\n KERNELS=="ttyUSB1"\n SUBSYSTEMS=="usb-serial"\n DRIVERS=="ftdi_sio"\n ATTRS{port_number}=="0"\n ATTRS{latency_timer}=="1"\n...\n\n looking at parent device \'/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.2\':\n KERNELS=="3-1.2"\n SUBSYSTEMS=="usb"\n DRIVERS=="usb"\n ATTRS{bDeviceSubClass}=="00"\n ATTRS{bDeviceProtocol}=="00"\n ATTRS{devpath}=="1.2"\n ATTRS{idVendor}=="0403"\n ATTRS{speed}=="12"\n ATTRS{bNumInterfaces}==" 1"\n ATTRS{bConfigurationValue}=="1"\n ATTRS{bMaxPacketSize0}=="8"\n ATTRS{busnum}=="3"\n ATTRS{devnum}=="18"\n ATTRS{configuration}==""\n ATTRS{bMaxPower}=="90mA"\n ATTRS{authorized}=="1"\n ATTRS{bmAttributes}=="a0"\n ATTRS{bNumConfigurations}=="1"\n ATTRS{maxchild}=="0"\n ATTRS{bcdDevice}=="0600"\n ATTRS{avoid_reset_quirk}=="0"\n ATTRS{quirks}=="0x0"\n ATTRS{serial}=="AL01QGTY" ===> This attribute is unique to each device\n ATTRS{version}==" 2.00"\n ATTRS{urbnum}=="15"\n ATTRS{ltm_capable}=="no"\n ATTRS{manufacturer}=="FTDI"\n ATTRS{removable}=="unknown"\n ATTRS{idProduct}=="6001"\n ATTRS{bDeviceClass}=="00"\n ATTRS{product}=="FT232R USB UART"\n\n ...\n\n looking at parent device \'/devices/pci0000:00\':\n KERNELS=="pci0000:00"\n SUBSYSTEMS==""\n DRIVERS==""\nRun Code Online (Sandbox Code Playgroud)\n\n该ATTRS{serial}属性对于每个设备都是唯一的。但是,这仅在父设备下可用。我将规则写入位于 的名为 usb_d.rules 的文件中user->/etc/udev/rules.d。该规则如下所示:
#matching parent device to access serial number\nSUBSYSTEM=="usb", KERNEL=="3-1.1", DRIVERS=="usb", ATTRS{serial}=="AL01QGTY", SYMLINK+=\xe2\x80\x9ddevice_AL01QGTY\xe2\x80\x9d\nRun Code Online (Sandbox Code Playgroud)\n\n/dev这应该在我的目录中创建一个带有名称的符号链接device_AL01QGTY,但没有创建这样的符号链接。我不确定我哪里出错了。
PS:附上 udevadm 测试的输出:
\n\nuser->/etc/udev/rules.d:udevadm test $(udevadm info -q path -n /dev/ttyUSB1)\ncalling: test\nversion 204\n\n=== trie on-disk ===\ntool version: 204\nfile size: 5774636 bytes\nheader size 80 bytes\nstrings 1271756 bytes\nnodes 4502800 bytes\nload module index\nread rules file: /lib/udev/rules.d/40-crda.rules\nread rules file: /lib/udev/rules.d/40-gnupg.rules\nread rules file: /lib/udev/rules.d/40-hyperv-hotadd.rules\nread rules file: /lib/udev/rules.d/40-inputattach.rules\nread rules file: /lib/udev/rules.d/40-joystick.rules\nread rules file: /lib/udev/rules.d/40-libgphoto2-6.rules\nGOTO \'libgphoto2_usb_end\' has no matching label in: \'/lib/udev/rules.d/40-libgphoto2-6.rules\'\nread rules file: /lib/udev/rules.d/40-libopenni-sensor-pointclouds0.rules\nread rules file: /lib/udev/rules.d/40-libopenni2-0.rules\nread rules file: /lib/udev/rules.d/40-libsane.rules\nread rules file: /lib/udev/rules.d/40-usb-media-players.rules\nread rules file: /lib/udev/rules.d/40-usb_modeswitch.rules\nread rules file: /lib/udev/rules.d/40-xdiagnose.rules\nread rules file: /lib/udev/rules.d/42-usb-hid-pm.rules\nread rules file: /lib/udev/rules.d/50-firmware.rules\nread rules file: /lib/udev/rules.d/50-udev-default.rules\nread rules file: /lib/udev/rules.d/55-dm.rules\nread rules file: /lib/udev/rules.d/56-hpmud.rules\nread rules file: /lib/udev/rules.d/60-cdrom_id.rules\nread rules file: /lib/udev/rules.d/60-keyboard.rules\nread rules file: /lib/udev/rules.d/60-pcmcia.rules\nread rules file: /lib/udev/rules.d/60-persistent-alsa.rules\nread rules file: /lib/udev/rules.d/60-persistent-input.rules\nread rules file: /lib/udev/rules.d/60-persistent-serial.rules\nread rules file: /lib/udev/rules.d/60-persistent-storage-dm.rules\nread rules file: /lib/udev/rules.d/60-persistent-storage-tape.rules\nread rules file: /lib/udev/rules.d/60-persistent-storage.rules\nread rules file: /lib/udev/rules.d/60-persistent-v4l.rules\nread rules file: /lib/udev/rules.d/61-accelerometer.rules\nread rules file: /lib/udev/rules.d/61-gnome-bluetooth-rfkill.rules\nread rules file: /lib/udev/rules.d/62-google-cloudimg.rules\nread rules file: /lib/udev/rules.d/64-btrfs.rules\nread rules file: /lib/udev/rules.d/64-xorg-xkb.rules\nread rules file: /lib/udev/rules.d/66-xorg-synaptics-quirks.rules\nread rules file: /lib/udev/rules.d/69-cd-sensors.rules\nIMPORT found builtin \'usb_id --export %p\', replacing /lib/udev/rules.d/69-cd-sensors.rules:89\nread rules file: /lib/udev/rules.d/69-libmtp.rules\nread rules file: /lib/udev/rules.d/69-wacom.rules\nread rules file: /lib/udev/rules.d/69-xorg-vmmouse.rules\nread rules file: /etc/udev/rules.d/70-persistent-net.rules\nread rules file: /lib/udev/rules.d/70-power-switch.rules\nread rules file: /lib/udev/rules.d/70-printers.rules\nread rules file: /lib/udev/rules.d/70-resolvconf-initramfs-copy.rules\nread rules file: /lib/udev/rules.d/70-uaccess.rules\nread rules file: /lib/udev/rules.d/71-nvidia.rules\nread rules file: /lib/udev/rules.d/71-seat.rules\nread rules file: /lib/udev/rules.d/71-u-d-c-gpu-detection.rules\nread rules file: /lib/udev/rules.d/73-idrac.rules\nread rules file: /lib/udev/rules.d/73-seat-late.rules\nread rules file: /lib/udev/rules.d/75-net-description.rules\nread rules file: /lib/udev/rules.d/75-persistent-net-generator.rules\nread rules file: /lib/udev/rules.d/75-probe_mtd.rules\nread rules file: /lib/udev/rules.d/75-tty-description.rules\nread rules file: /lib/udev/rules.d/77-mm-ericsson-mbm.rules\nread rules file: /lib/udev/rules.d/77-mm-huawei-net-port-types.rules\nread rules file: /lib/udev/rules.d/77-mm-longcheer-port-types.rules\nread rules file: /lib/udev/rules.d/77-mm-nokia-port-types.rules\nread rules file: /lib/udev/rules.d/77-mm-pcmcia-device-blacklist.rules\nread rules file: /lib/udev/rules.d/77-mm-platform-serial-whitelist.rules\nread rules file: /lib/udev/rules.d/77-mm-qdl-device-blacklist.rules\nread rules file: /lib/udev/rules.d/77-mm-simtech-port-types.rules\nread rules file: /lib/udev/rules.d/77-mm-usb-device-blacklist.rules\nread rules file: /lib/udev/rules.d/77-mm-usb-serial-adapters-greylist.rules\nread rules file: /lib/udev/rules.d/77-mm-x22x-port-types.rules\nread rules file: /lib/udev/rules.d/77-mm-zte-port-types.rules\nread rules file: /lib/udev/rules.d/77-nm-olpc-mesh.rules\nread rules file: /lib/udev/rules.d/78-graphics-card.rules\nread rules file: /lib/udev/rules.d/78-sound-card.rules\nread rules file: /lib/udev/rules.d/80-drivers.rules\nread rules file: /lib/udev/rules.d/80-mm-candidate.rules\nread rules file: /lib/udev/rules.d/80-udisks2.rules\nread rules file: /lib/udev/rules.d/85-brltty.rules\nread rules file: /lib/udev/rules.d/85-hdparm.rules\nread rules file: /lib/udev/rules.d/85-hplj10xx.rules\nread rules file: /lib/udev/rules.d/85-keyboard-configuration.rules\nread rules file: /lib/udev/rules.d/85-regulatory.rules\nread rules file: /lib/udev/rules.d/85-usbmuxd.rules\nread rules file: /lib/udev/rules.d/90-alsa-restore.rules\nread rules file: /lib/udev/rules.d/90-alsa-ucm.rules\nread rules file: /lib/udev/rules.d/90-libgpod.rules\nread rules file: /lib/udev/rules.d/90-pulseaudio.rules\nread rules file: /lib/udev/rules.d/95-cd-devices.rules\nread rules file: /lib/udev/rules.d/95-udev-late.rules\nread rules file: /lib/udev/rules.d/95-upower-battery-recall-dell.rules\nread rules file: /lib/udev/rules.d/95-upower-battery-recall-fujitsu.rules\nread rules file: /lib/udev/rules.d/95-upower-battery-recall-gateway.rules\nread rules file: /lib/udev/rules.d/95-upower-battery-recall-ibm.rules\nread rules file: /lib/udev/rules.d/95-upower-battery-recall-lenovo.rules\nread rules file: /lib/udev/rules.d/95-upower-battery-recall-toshiba.rules\nread rules file: /lib/udev/rules.d/95-upower-csr.rules\nread rules file: /lib/udev/rules.d/95-upower-hid.rules\nread rules file: /lib/udev/rules.d/95-upower-wup.rules\nread rules file: /lib/udev/rules.d/97-bluetooth-hid2hci.rules\nread rules file: /etc/udev/rules.d/usb_dxl.rules\nrules contain 393216 bytes tokens (32768 * 12 bytes), 35051 bytes strings\n21673 strings (185736 bytes), 18321 de-duplicated (154038 bytes), 3353 trie nodes used\nIMPORT builtin \'usb_id\' /lib/udev/rules.d/40-libgphoto2-6.rules:3\n/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.2/3-1.2:1.0: if_class 255 protocol 0\nPROGRAM \'usb_modeswitch --symlink-name /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1 0403 6001 \' /lib/udev/rules.d/40-usb_modeswitch.rules:9\nstarting \'usb_modeswitch --symlink-name /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1 0403 6001 \'\n\'usb_modeswitch --symlink-name /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1 0403 6001 \' [4549] exit with return code 0\nGROUP 20 /lib/udev/rules.d/50-udev-default.rules:19\nIMPORT builtin \'path_id\' /lib/udev/rules.d/60-persistent-serial.rules:9\nLINK \'serial/by-path/pci-0000:00:14.0-usb-0:1.2:1.0-port0\' /lib/udev/rules.d/60-persistent-serial.rules:11\nIMPORT builtin skip \'usb_id\' /lib/udev/rules.d/60-persistent-serial.rules:13\nLINK \'serial/by-id/usb-FTDI_FT232R_USB_UART_AL01QGTY-if00-port0\' /lib/udev/rules.d/60-persistent-serial.rules:18\nIMPORT builtin skip \'usb_id\' /lib/udev/rules.d/75-tty-description.rules:6\nIMPORT builtin \'hwdb\' /lib/udev/rules.d/75-tty-description.rules:6\nhandling device node \'/dev/ttyUSB1\', devnum=c188:1, mode=0660, uid=0, gid=20\npreserve permissions /dev/ttyUSB1, 020660, uid=0, gid=20\npreserve already existing symlink \'/dev/char/188:1\' to \'../ttyUSB1\'\nfound \'c188:1\' claiming \'/run/udev/links/\\x2fserial\\x2fby-id\\x2fusb-FTDI_FT232R_USB_UART_AL01QGTY-if00-port0\'\ncreating link \'/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AL01QGTY-if00-port0\' to \'/dev/ttyUSB1\'\npreserve already existing symlink \'/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AL01QGTY-if00-port0\' to \'../../ttyUSB1\'\nfound \'c188:1\' claiming \'/run/udev/links/\\x2fserial\\x2fby-path\\x2fpci-0000:00:14.0-usb-0:1.2:1.0-port0\'\ncreating link \'/dev/serial/by-path/pci-0000:00:14.0-usb-0:1.2:1.0-port0\' to \'/dev/ttyUSB1\'\npreserve already existing symlink \'/dev/serial/by-path/pci-0000:00:14.0-usb-0:1.2:1.0-port0\' to \'../../ttyUSB1\'\nunable to create temporary db file \'/run/udev/data/c188:1.tmp\': Permission denied\n.ID_PORT=0\nACTION=add\nDEVLINKS=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AL01QGTY-if00-port0 /dev/serial/by-path/pci-0000:00:14.0-usb-0:1.2:1.0-port0\nDEVNAME=/dev/ttyUSB1\nDEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1\nID_BUS=usb\nID_MM_CANDIDATE=1\nID_MODEL=FT232R_USB_UART\nID_MODEL_ENC=FT232R\\x20USB\\x20UART\nID_MODEL_FROM_DATABASE=FT232 USB-Serial (UART) IC\nID_MODEL_ID=6001\nID_PATH=pci-0000:00:14.0-usb-0:1.2:1.0\nID_PATH_TAG=pci-0000_00_14_0-usb-0_1_2_1_0\nID_REVISION=0600\nID_SERIAL=FTDI_FT232R_USB_UART_AL01QGTY\nID_SERIAL_SHORT=AL01QGTY\nID_TYPE=generic\nID_USB_DRIVER=ftdi_sio\nID_USB_INTERFACES=:ffffff:\nID_USB_INTERFACE_NUM=00\nID_VENDOR=FTDI\nID_VENDOR_ENC=FTDI\nID_VENDOR_FROM_DATABASE=Future Technology Devices International, Ltd\nID_VENDOR_ID=0403\nMAJOR=188\nMINOR=1\nSUBSYSTEM=tty\nUSEC_INITIALIZED=53659802\nunload module index\nRun Code Online (Sandbox Code Playgroud)\n
原来的规则:
\n\n\n\n\n\n
SUBSYSTEM=="usb", KERNEL=="3-1.1", DRIVERS=="usb", ATTRS{serial}=="AL01QGTY", SYMLINK+=\xe2\x80\x9ddevice_AL01QGTY\xe2\x80\x9d
SUBSYSTEM=="usb"位于父节点中,因此使用SUBSYSTEMS=="usb"KERNEL=="3-1.1"应删除,您不需要特定 USB 端口的规则。注意你的udevadm info输出3-1.2!
顺便说一句,如果真的需要的话,那就不是KERNELS了KERNEL。因为它是来自父节点的匹配。
SYMLINK+=\xe2\x80\x9ddevice_AL01QGTY\xe2\x80\x9d复制粘贴问题。应该""不是\xe2\x80\x9d\xe2\x80\x9d\n\n\nNAME、SYMLINK、PROGRAM、OWNER、GROUP、MODE 和 RUN 字段支持简单的字符串替换。
\n
参考:man udev
解决方案:
\n\nSUBSYSTEM=="tty",SUBSYSTEMS=="usb",DRIVERS=="usb",SYMLINK+="device_%s{serial}"
| 归档时间: |
|
| 查看次数: |
68809 次 |
| 最近记录: |