5

Я хочу выделить определенные порты USB для определенных устройств. Как я могу это сделать?

Например: я хочу, чтобы ttyUSB0 была моей мышью, а ttyUSB1 - моей клавиатурой (всегда). Я хочу быть уверен, что запуск Linux никогда не меняет их.

На самом деле дело в том, что у меня есть XBee, который обычно идет на USB0, и второй FTDI, который идет на USB1, из соображений безопасности я всегда хочу, чтобы они имели одинаковый адрес в моем коде, который я запускаю.

С уважением

2 ответа2

7

Назначенные ядром имена всегда назначаются в порядке обнаружения устройств, и вы не можете их изменить. (Во всяком случае, больше - эта функция была удалена из-за различных условий гонки, вызванных правилами "постоянного имени".)

Но вы можете сказать udev создавать символические ссылки с любыми именами, которые вы выберете. Фактически, в современных системах у вас уже должны быть символические ссылки в /dev/serial названные как по пути к устройству, так и по его уникальному идентификатору; например:

  • /dev/serial/by-path/pci-0000:00:1a.0-usb-0:1.2:1.0ttyUSB0

  • /dev/serial/by-id/usb-Motorola_Inc._Motorola_Phone__C350_-if00ttyACM0

  • /dev/disk/by-id/ata-ST9640320AS_5WX1ZH91-part1sda1

  • /dev/disk/by-partlabel/Archsda3

  • /dev/input/by-id/usb-PIXART_USB_OPTICAL_MOUSE-mousemouse1

И так далее. Просто запустите tree /dev или ls -lR /dev чтобы найти ваше устройство.

Вы также можете запустить udevadm info /dev/ttyUSB0 и все символические ссылки на это устройство будут перечислены в виде строк S: ...


Если этого недостаточно, вы можете написать свои собственные правила udev. Сначала запустите udevadm info /dev/ttyUSB0 и выберите любое идентифицирующее свойство (например, ID_PATH для порта USB). Хорошая идея всегда включать подсистему.

Затем откройте (или создайте) файл в /etc/udev/rules.d/ (названный, например, serial-symlinks.rules) и поместите туда правило udev.

Например, если вывод для ttyUSB0 :

$ udevadm info /dev/ttyUSB0
. . .
E: ID_PATH=pci-0000:00:1d.0-usb-0:1.2:1.0
. . .
E: SUBSYSTEM=tty
. . .

... вы можете написать это правило:

SUBSYSTEM=="tty", ENV{ID_PATH}=="pci-0000:00:1d.0-usb-0:1.2:1.0", SYMLINK+="tty-xbee"

... и udev всегда будет использовать символическую ссылку /dev/tty-xbee для любого устройства tty, подключенного к USB-порту №2.


(Примечание: не используйте те же имена для символических ссылок, которые ядро использует для узлов устройств. Использование SYMLINK+="ttyUSB0" приведет к плохим вещам.)

0

Вот что я делаю с последовательными USB-устройствами:

  1. cd /dev/serial/by-id
  2. ls -l

    Например:

    root@toaster:/dev/serial/by-id# ls -l

    total 0
    lrwxrwxrwx 1 root root 13 Jan 1 1970 usb-FTDI_FT232R_USB_UART_A7035K2R-if00-port0 -> ../../ttyUSB0

  3. Сделайте символическую ссылку из этого длинного имени на имя по вашему выбору в каталоге по вашему выбору. В моем случае это системное устройство, и только root контролирует его, поэтому я делаю ссылку в /root , например:

    ln -s /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A7035K2R-if00-port0 /root/easydigi
    
  4. В ваших программах или в любом другом, нужном для имени устройства последовательного устройства, вы просто используете свою ссылку, в моем случае выше "/root /easydigi", в качестве замены для "/dev /ttyUSB0".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .