面临:
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
我想完成两件事:
- 将 lsusb 输出行与 /dev 条目相匹配的方法。
- 一种在 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将其移动到其他设备。
感谢您提供的指点。他们确实帮助我找到了解决方案,尽管他们并没有让我一路到达那里。希望其他一些保护者用户发现这很有用。