Содержание

USB over IP (Ubuntu)

Что делать если к удаленной или виртуальной машине необходимо подключить какое-то USB устройство, например, USB-ключ или веб-камеру? Тут на помощь приходит технология “USB over IP”, которя в системах Linux доступна почти из коробки. Алгоритм настройки достаточно примитивен и содержит в себе всего несколько шагов, которые будут перечислены ниже.

Базовая настройка (на всех хостах)

  • Установить пакеты:
    1
    
    apt install linux-modules-extra-`uname -r` linux-tools-`uname -r` hwdata
    
  • Добавить в файл /etc/modules-load.d/modules.conf строки:
    1
    2
    3
    
    vhci_hcd
    usbip_core
    usbip_host
    

    Модуль usbip_host нужен только с отдающей стороны (хоста куда подключено устройство)

  • Перезагрузить систему
Примечание

В системе может отсутствовать определение сервиса usbipd для systemd, который должен находиться по пути /usr/lib/systemd/system/usbipd.service, либо /etc/systemd/system/usbipd.service. Чтобы это исправить, нужно:

  • создать файл запуска сервиса /etc/systemd/system/usbipd.service, со следующим содержимым:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    [Unit]
    Description=USB/IP server
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/usbipd
    
    [Install]
    WantedBy=multi-user.target
    
  • Включить и запустить сервис:

    1
    2
    
    systemctl enable usbipd.service
    systemctl start usbipd.service
    

С отдающей стороны

  • Просмотр доступных для раздачи локальных устройств:
    1
    
    usbip list -l
    
    Вывод должен быть примерно таким:
    1
    2
    3
    4
    5
    6
    7
    8
    
    - busid 1-1 (046d:0843)
       Logitech, Inc. : Webcam C930e (046d:0843)
    
     - busid 1-5 (0458:0186)
       KYE Systems Corp. (Mouse Systems) : Genius DX-120 Mouse (0458:0186)
    
     - busid 1-6 (03ee:8801)
       Mitsumi : unknown product (03ee:8801)
    
  • Подключение устройства к раздаче:
    1
    
    usbip bind -b [busid]
    
  • Отключение от раздачи:
    1
    
    usbip unbind -b [busid]
    

С принимающей стороны

  • Просмотр доступных для подключения удаленных устройств:
    1
    
    usbip list -r [remote_IP]
    
  • Подключение устройства:
    1
    
    usbip attach -r [remote_IP] -b [busid]
    
  • Просмотр подключенных устройств:
    1
    
    usbip port
    
    Если есть подключенные устройства, то вывод должен быть примерно таким:
    1
    2
    3
    4
    5
    6
    
    Imported USB devices
    ====================
    Port 00: <Port in Use> at High Speed(480Mbps)
           Logitech, Inc. : Webcam C930e (046d:0843)
           2-1 -> usbip://192.168.122.1:3240/1-1
               -> remote bus/dev 001/002
    
    Так же, при успешном подключении устройства, оно должно появиться в списке lsusb. Например, так:
    1
    2
    3
    4
    
    Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 002 Device 002: ID 046d:0843 Logitech, Inc. Webcam C930e
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    
  • Отключение устройства:
    1
    
    usbip detach -p [port_number]