Как задать определенный dev каждой из двух одинаковых вебкамер в линукс?

Есть две дешевых камеры. Настолько дешевые что вывод
udevadm info -a -n /dev/video0
и
udevadm info -a -n /dev/video1
Идентичен. Нет разницы в vid, pid, SN и т.д.
Но надо быть уверенным что после перезагрузки video1 и video0 не поменяются местами.
Планировалась реализация через правила в /etc/udev/rules.d
С заменой стандартного dev на video0 на скажем cam0.
Вот разные строчки но я думаю что за них нельзя зацепиться.

looking at device '/devices/pci0000:00/0000:00:1d.7/usb2/2-6/2-6.3/2-6.3:1.0/video4linux/video0'                                              :
   KERNEL=="video0"
  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-6/2-6.3/2-6.3:1.0':
   KERNELS=="2-6.3:1.0"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-6/2-6.3':
   KERNELS=="2-6.3"
 ATTRS{devpath}=="6.3"
ATTRS{devnum}=="9"

отличие идет в единицу. скажем KERNEL=="video0" меняется на KERNEL=="video1"
ATTRS{devpath}=="6.3" на ATTRS{devpath}=="6.4"

И если это важно подключение ведется через 1 порт usb потом хаб на 4 порта. Из хаба вынимать камеры не планируется. Может к этому можно зацепиться?
  • Вопрос задан
  • 878 просмотров
Решения вопроса 1
Energoblock
@Energoblock
Geek
У меня стояла похожая задача: кучка етокенов, иногда с одинаковыми vid и pid, расставлены по usb-портам и через usb-хаб в том числе. ОС Linux Debian 8.
Однозначно идентифицировать етокен нельзя, так как отсутствует уникальный серийный номер. Зато серийный номер присутствует у каждого usb root hub, встроенного в мат.плату. Значит можно жёстко определить для каждого root hub его busnum, и если не вытаскивать токены, то devnum у них будет постоянным.

Вытащил все токены и, используя lsusb, узнал, что у меня 8 usb root hub, каждый занимает устройство номер 1:
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub


После этого узнал серийный номер каждого root hub, меняя 005 в диапазоне от 001 до 008:
root@srv:~# udevadm info -a /dev/bus/usb/005/001 | grep serial
    ATTR{serial}=="0000:00:1a.2"


На основе серийников сделал правило для udev (создал файл в /etc/udev/rules.d/ файл 10-usb.rules):
SUBSYSTEM=="usb", ATTR{devnum}=="1", ATTR{serial}=="0000:00:1a.7", ATTR{busnum}="1"
SUBSYSTEM=="usb", ATTR{devnum}=="1", ATTR{serial}=="0000:00:1d.7", ATTR{busnum}="2"
SUBSYSTEM=="usb", ATTR{devnum}=="1", ATTR{serial}=="0000:00:1a.0", ATTR{busnum}="3"
SUBSYSTEM=="usb", ATTR{devnum}=="1", ATTR{serial}=="0000:00:1a.1", ATTR{busnum}="4"
SUBSYSTEM=="usb", ATTR{devnum}=="1", ATTR{serial}=="0000:00:1a.2", ATTR{busnum}="5"
SUBSYSTEM=="usb", ATTR{devnum}=="1", ATTR{serial}=="0000:00:1d.0", ATTR{busnum}="6"
SUBSYSTEM=="usb", ATTR{devnum}=="1", ATTR{serial}=="0000:00:1d.1", ATTR{busnum}="7"
SUBSYSTEM=="usb", ATTR{devnum}=="1", ATTR{serial}=="0000:00:1d.2", ATTR{busnum}="8"


Произвёл перезагрузку, токены остались на своих местах.
Вам ещё можно дописать правила на создание именных симлинков на основании busnum и devnum каждой камеры.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы