Доступ к удалённому USB-устройству по сети

Время · ~10 мин Уровень · Продвинутый Протокол · USB/IP (TCP 3240)

USB-устройство, вставленное в машину где-то ещё — флешку, лицензионный донгл, аппаратный ключ безопасности, программатор микроконтроллеров — можно подключить к вашему компьютеру по сети, и оно появится так, будто вставлено в ваш собственный порт. За это отвечает функция ядра USB/IP; она работает по обычному TCP на порту 3240, поэтому LRO переносит её так же, как переносит SSH или веб-панель.

Роли для этой задачи: машина, в которую вставлено устройство, является клиентом (она экспортирует устройство, и эндпоинт живёт на ней); ваш компьютер, где устройство должно появиться, является саппортом (он открывает локальный порт, к которому подключается USB/IP). Впервые здесь? Начните с гайда ваш первый туннель; не уверены, какая сторона есть какая, — смотрите выбор роли агента.
Требования к оборудованию и ядру. USB/IP требует поддержки в ядре и пользовательских утилит usbip на обеих машинах — это вне LRO и не подделать. На Linux: установите утилиты (usbip / linux-tools) и загрузите usbip-core + usbip-host на удалённой машине, vhci-hcd на вашей. На Windows для экспортирующей стороны используйте usbipd-win. Шаги LRO ниже одинаковы в любом случае; только команды usbip зависят от ОС.
  1. Экспортируйте USB-устройство на удалённой машине

    На машине, в которую вставлено устройство (на клиенте), запустите демон USB/IP, найдите bus id устройства и привяжите его, чтобы его можно было экспортировать. usbipd слушает на 127.0.0.1:3240.

    $ sudo usbipd -D # start the USB/IP daemon (port 3240) $ usbip list -l # find the busid of your device $ sudo usbip bind -b 1-1.2 # export it (use your busid)

    Держите привязку только к 127.0.0.1 — выставлять порт 3240 в сеть не нужно. LRO дотягивается до него локально с той же машины.

  2. Добавьте эндпоинт USB/IP на агенте-клиенте

    В панели Endpoints → Create endpoint (эндпоинты → создать эндпоинт). Выберите агента-клиента (машину с устройством), назовите его, например, Lab USB, и задайте target 127.0.0.1 и port 3240.

    Endpoints list with a Lab USB (USB/IP) endpoint pointing at 127.0.0.1:3240
    Рис. 1. Эндпоинт USB/IP живёт на агенте-клиенте — target 127.0.0.1:3240, локальный usbipd.
  3. Откройте туннель со своей машины

    Tunnels → Add tunnel (туннели → добавить туннель). Выберите свой компьютер как агента-саппорта, укажите эндпоинт Lab USB и задайте локальный порт 3240 — совпадение со стандартным портом USB/IP упрощает команду подключения. Создайте туннель; через мгновение он станет Active (активным).

    Tunnels table with an active Reach lab USB tunnel listening on 0.0.0.0:3240
    Рис. 2. Активный туннель — ваша машина слушает на 3240 и пробрасывает на удалённый 127.0.0.1:3240.
  4. Подключите устройство через туннель

    На вашем компьютере (на стороне саппорта) направьте usbip на локальный порт. Поскольку туннель слушает на стандартном для USB/IP порту 3240, достаточно -r 127.0.0.1. Выведите список экспортированных устройств, затем подключите нужное:

    $ sudo usbip list -r 127.0.0.1 # see what the remote exports, through the tunnel $ sudo usbip attach -r 127.0.0.1 -b 1-1.2 $ lsusb | grep SanDisk # the remote device now shows up locally
    Two terminals: the remote machine binding a USB device, your laptop attaching it over the LRO tunnel and seeing it in lsusb
    Рис. 3. Экспорт на удалённой машине (сверху), подключение через туннель на вашей машине (снизу) — устройство появляется в lsusb так, будто вставлено локально.

    Теперь устройство — обычное локальное USB-устройство: монтируйте флешку, читайте донгл, прошивайте плату. Когда закончите, отключите его, и порт освободится:

    $ usbip port # list attached remote devices $ sudo usbip detach -p 00 # detach by port number

Заметки

Вставьте устройство где угодно — используйте его так, будто оно у вас на столе.

Создать аккаунт →