我想找到一种方法将 lsusb 的输出与 /dev/ttyUSB* 名称相匹配

我想找到一种方法将 lsusb 的输出与 /dev/ttyUSB* 名称相匹配

面临:

root@conserver01:/home/owen# lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 5000M
        |__ Port 1: Dev 3, If 0, Class=Hub, Driver=hub/4p, 5000M
        |__ Port 2: Dev 4, If 0, Class=Hub, Driver=hub/4p, 5000M
        |__ Port 3: Dev 5, If 0, Class=Hub, Driver=hub/4p, 5000M
        |__ Port 4: Dev 6, If 0, Class=Hub, Driver=hub/4p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 1: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M
                |__ Port 3: Dev 13, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
                |__ Port 1: Dev 6, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
                |__ Port 4: Dev 15, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
                |__ Port 2: Dev 9, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
            |__ Port 2: Dev 5, If 0, Class=Hub, Driver=hub/4p, 480M
                |__ Port 4: Dev 16, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
                |__ Port 2: Dev 12, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
                |__ Port 3: Dev 14, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
                |__ Port 1: Dev 8, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
            |__ Port 3: Dev 7, If 0, Class=Hub, Driver=hub/4p, 480M
                |__ Port 1: Dev 11, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
            |__ Port 4: Dev 10, If 0, Class=Hub, Driver=hub/4p, 480M

和:

root@conserver01:/home/owen# ls -al /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 Jun 17 03:49 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 Jun 17 03:50 /dev/ttyUSB1
crw-rw---- 1 root dialout 188, 2 Jun 17 03:51 /dev/ttyUSB2
crw-rw---- 1 root dialout 188, 3 Jun 17 03:54 /dev/ttyUSB3
crw-rw---- 1 root dialout 188, 4 Jun 17 03:54 /dev/ttyUSB4
crw-rw---- 1 root dialout 188, 5 Jun 17 03:55 /dev/ttyUSB5
crw-rw---- 1 root dialout 188, 6 Jun 14 20:20 /dev/ttyUSB6
crw-rw---- 1 root dialout 188, 7 Jun 14 20:20 /dev/ttyUSB7
crw-rw---- 1 root dialout 188, 8 Jun 14 20:20 /dev/ttyUSB8

我想完成两件事:

  1. 将 lsusb 输出行与 /dev 条目相匹配的方法。
  2. 一种在 USB 集线器上的端口(或特定 FTDI 适配器,两者都可接受/有用)和 /dev/ 条目之间创建一致关系的方法。

非常感谢任何帮助。我知道这至少与之前发布的另一个问题类似,但问题很模糊,答案看起来很接近,但并没有完全实现我想要的。我希望我的问题更清楚。

另请注意,我并不反对使用 lsusb 之外的 Linux 资源来实现此目的的答案,这只是我最熟悉的工具。包含非 FTDI 设备是为了完整性,但它们被插入 16 端口 Genesys Logic 集线器,该集线器似乎是作为内部堆叠在一起的 5 个 4 端口 Genesys Logic 集线器实现的。

答案1

readlink -f /sys/class/tty/ttyUSB0/device应该给你类似的东西:

/sys/devices/pci0000:00/0000:00:12.2/usb1/1-4/1-4.3/1-4.3.1/1-4.3.1:1.0/ttyUSB0

具有完整的硬件路径。

在大多数系统上,我希望udev还会创建一些/dev/serial/by-path/<device-hardware-path>/dev/serial/by-id/<device-id>

$ readlink -f /dev/serial/by-path/pci-0000:00:12.2-usb-0:4.3.1:1.0-port0
/dev/ttyUSB0

udevadm info --name=ttyUSB0还应该为您提供大量信息,包括该路径。

答案2

事实证明,解决方案是使用自定义 uDEV 规则来创建更多符号链接,然后使用这些符号链接。

就我而言,我选择使用制造商提供的设备序列号,该序列号(至少从 FTDI 设备)可用于 udev 规则,如“ID_SERIAL_SHORT”。我创建的uDEV规则如下:/etc/udev/rules.d/60-usb-serial.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001",SYMLINK+="tty.FTDI.%E{ID_SERIAL_SHORT}"
EOT

产品 6001 Vendor 0403 是我正在使用的 FTDI 串行适配器。

这使得 /dev/tty.FTDI 上的所有终端都可用:

root@conserver01:/home/owen# ls -la /dev/tty.FTDI*
lrwxrwxrwx 1 root root 7 Sep 19 23:06 /dev/tty.FTDI.A95VS8DR -> ttyUSB6
lrwxrwxrwx 1 root root 7 Sep 19 23:06 /dev/tty.FTDI.A9G9Q4LI -> ttyUSB3
lrwxrwxrwx 1 root root 7 Sep 19 23:06 /dev/tty.FTDI.A9SS5W0V -> ttyUSB4
lrwxrwxrwx 1 root root 7 Sep 19 23:06 /dev/tty.FTDI.A9TYJTXQ -> ttyUSB1
lrwxrwxrwx 1 root root 7 Sep 19 23:06 /dev/tty.FTDI.A9VSKAKD -> ttyUSB7
lrwxrwxrwx 1 root root 7 Sep 19 23:06 /dev/tty.FTDI.A9X5K7PH -> ttyUSB0
lrwxrwxrwx 1 root root 7 Sep 19 23:06 /dev/tty.FTDI.AQ017QQB -> ttyUSB2
lrwxrwxrwx 1 root root 7 Sep 19 23:06 /dev/tty.FTDI.AQ017USH -> ttyUSB5

每当我重新启动时,符号链接末尾的关联往往会发生变化,但我不在乎,因为我的 /etc/conserver/conserver.cf 文件引用 FTDI 名称,并且这些名称通过其序列号始终连接到正确的设备。

这还有一个额外的优点,我不再需要担心设备连接到哪个集线器上的哪个端口,我只需要将电缆的 RJ-45 端插入我期望的设备或在我需要时修改 conserver.cf将其移动到其他设备。

感谢您提供的指点。他们确实帮助我找到了解决方案,尽管他们并没有让我一路到达那里。希望其他一些保护者用户发现这很有用。

相关内容