Иногда бывают случаи, когда какое-нибудь usb устройство находится в недоступном для вас месте: в другой стране, на производственных цехах, в промышленных зонах и т.п. Не важно какое это устройство: программатор, преобразователь USB- UART или какой-нибудь CNC станок, в любом случае предполагается, что оно просто подключено к удаленному компьютеру, а вы хотите получить к нему доступ на своем компьютере со своим окружением. Для этой цели есть пакет usbip,  позволяющий "пробрасывать" USB устройства .

Установка SSH Server-a

Первое, что нужно сделать, это получить доступ к удаленному компьютеру, к которому физически подключено устройство. Для этого придется попросить обслуживающий персонал выполнить пару несложных действий по настройке Secure Shell (предполагается что на всех машинах установлен arch):

su
pacman -S openssh
systemctl enable sshd
systemctl start sshd

Также необходимо что бы они пробросили TCP порт на фаерволе роутера (лучше стандартный порт 22, или любой другой но потом придется его указывать при подключении). Если устройство находится в широковещательном домене локальной сети, то пробрасывать порт не нужно.

Настройка серверной части USBIP

Подключаемся по SSH к удаленной машине

ssh 
[email protected]

Вместо user, нужно указать имя пользователя удаленной машины, а вместо 192.168.1.2, ip- адрес удаленный машины или  доменное имя, которое преобразуется в этот ip на DNS-сервере.

После авторизации на машине, устанавливаем пакет usbip:

sudo pacman -S 
usbip

Для прослушивания порта USBIP (3240) нужно запустить демон:

sudo usbipd -D

Опять же, если подсеть удаленной машины доступна через роутер, то на роутере нужно пробросить порт TCP с номером 3240. Именно на этом порте демон USBIP ожидает подключения.

Что бы посмотреть список usb устройств локальной машины (в SSH консоле она является локальной, но для нас удаленной), нужно воспользоваться командой:

[email protected] ~ $ usbip list 
-l
Local USB devices
=================
 - busid 1-4 (09da:c10a)
   A4 Tech Co., Ltd : unknown product (09da:c10a)
         1-4:1.0 -> usbhid
 - busid 1-6 (0483:3744)
   STMicroelectronics : STLINK Pseudo disk 
(0483:3744)
         1-6:1.0 -> unknown

В моем примере подключена мышка и отладочная плата STM32VLDiscovery (Виден программатор ST- LINK, который на ней имеется). В каждом из пунктов указывается так называемый идентификатор шины  busid (для ST-LINK это 1-6),  ID устройства (для ST-LINK 0483), и ID производителя (3744). Операции проброса выполняются по busid.

Что бы пробросить устройство, его нужно "привязать" к модулю ядра usbip-host.ko этой командой:

[email protected] ~ $ sudo 
usbip bind 
-b 1-6
[sudo] password for user: 
bind device on busid 1-6: complete

После этого устройство становится недоступным для системы сервера. Что бы вернуть его в локальное использование, после использования удаленно, его нужно отвязать командой:

sudo usbip unbind -b 1-
6

Клиентская часть

Наконец мы можем выйти из удаленной SSH консоли, и подключить проброшеное устройство у себя. Сначала посмотрим какие устройства у нас проброшены на удаленной машине, что бы убедится в их доступности:

[email protected] $ usbip 
list -r 
192.168.1.2
Exportable USB devices
======================
 - 192.168.1.2
        1-6: STMicroelectronics : STLINK Pseudo disk 
(0483:3744)
           : /sys/devices/pci0000:00/0000:00:02.0/usb1/1-6
           : (Defined at Interface level) (00/00/00)
           :  0 - Mass Storage / SCSI / Bulk-Only (08/06/50)

Судя по выводу, наш программатор успешно проброшен.

Перед подключением нужно загрузить модуль виртуального устройства (который создаст на нашей машине виртуальное устройство, и при этом ни кто и понять не поймет, что оно физически подключено к другому хосту):

sudo modprobe vhci-hcd 

И наконец подключим само устройство:

[email protected] $ 
usbip 
attach -b 1-6 -r 192.168.1.2

Выполним lsusb:

[email protected] $ 
lsusb
Bus 001 Device 002: ID 04f2:b1d8 Chicony Electronics 
Co., 
Ltd 
Bus 006 Device 002: ID 0483:3744 STMicroelectronics 
STLINK Pseudo disk
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 
2.0 root 
hub
Bus 002 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 004 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 006 Device 001: ID 1d6b:0002 Linux Foundation 
2.0 root 
hub

Как видно, устройство появилось и с ним можно работать.

Что бы отключить устройство на клиентской части нужно ввести команду:

sudo usbip detach -p 
0

Программа USBIP является кросплатформенной, но проброс между разными ОС может отличатся. Кроме Arch, мне доводилось пробрасывать устройства с Ubuntu на Windows, о других комбинациях не скажу. Кроме USBIP, не стоит также забывать о других способах удаленных подключений, в том числе о удаленной работе Debug-серверов, если вы работаете с программаторами/отладчиками, либо же о обычных удаленных рабочих столах но основе протоколов VNC/RDP.