Задача следующая: в USB подключены два одинаковых USB to COM контроллера, каждый из которых соединён с определённым инвертером для управления и сбора статистики, необходимо их однозначно идентифицировать, чтобы после перезагрузки или переподключения они получали те же самые уникальные имена, а не ttyUSB0, ttyUSB1, ttyUSB2 и т.д.
Так как за idVendor и idProduct нам не зацепиться — они одинаковые, то будем использовать номер шины и порта USB, куда подключены контроллеры, главное при переподключении их возвращать в тот же USB порт.
Идентифицируем устройства, USB порты:
Inverter 1
---
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB1)
...
KERNELS=="ttyUSB1"
KERNELS=="4-1:1.0"
...
Inverter 2
---
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
...
KERNEL=="ttyUSB0"
KERNELS=="3-1:1.0"
...
Используем udev, пишем правила:
/etc/udev/rules.d/99-usb-serial.rules
...
SUBSYSTEM=="tty", KERNELS=="4-1:1.0", SYMLINK+="ttyUSBInverter1"
SUBSYSTEM=="tty", KERNELS=="3-1:1.0", SYMLINK+="ttyUSBInverter2"
...
Просим udev перечитать правила и применить их:
udevadm control --reload-rules && udevadm trigger
В итоге получаем такое удобное именование:
root@clu-mon:~# ls -al /dev/ttyU*
...
crw-rw---- 1 root dialout 188, 2 Sep 12 17:37 /dev/ttyUSB2
crw-rw---- 1 root dialout 188, 3 Sep 12 17:37 /dev/ttyUSB3
lrwxrwxrwx 1 root root 7 Sep 12 17:37 /dev/ttyUSBInverter1 -> ttyUSB3
lrwxrwxrwx 1 root root 7 Sep 12 17:37 /dev/ttyUSBInverter2 -> ttyUSB2
...