Проброс USB порта по сети

Технология USB over IP очень удобна в случае когда надо раздать одно USB устройство большому количеству людей, или пробросить USB порт на виртуальную машину.

Сервер который будет давать доступ к USB носителю развернем на Ubuntu

apt install linux-tools-$(uname -r)

Для работы сервера нам потребуются:

  • usbip-core — основа USBIP-сервера,
  • usbip-host — управление USB-устройствами,
  • vhci-hcd — модуль экспорта виртуальных USB-устройств.

Выполним запуск необходимых нам модулей:

sudo modprobe usbip_core

sudo modprobe usbip_host

sudo modprobe vhci_hcd

Чтобы не запускать данные модули вручную каждый раз, добавим их в конфигурационный файл modules.conf:

nano /etc/modules-load.d/modules.conf

usbip-core

usbip-host

vhci-hcd

Запускаем USB-сервер в качестве демона:

usbipd -D

Проверяем список подключенных устройств:

 usbip list -l

- busid 1-4 (0a89:0030)

Aktiv : Rutoken ECP (0a89:0030)

- busid 1-5 (0bda:c821)

Realtek Semiconductor Corp. : unknown product (0bda:c821)

- busid 1-6 (0573:1573)

Zoran Co. Personal Media Division (Nogatech) : unknown product (0573:1573)

Нужный нам рутокен на 1-4

Расшарим наш ключ

usbip bind -b 1-4

Cоздаем юнит в systemd, который будет обращаться к скрипту usbipd и расшаривать наш USB-девайс автоматически после старта сетевых служб ОС:

nano /etc/systemd/system/usbipd.service

[Unit]

Description=USBIPd

After=network.target

 

[Service]

ExecStart=/bin/sh /root/scripts/usbipd

Type=oneshot

RemainAfterExit=yes

 

[Install]

WantedBy=multi-user.target

Обновляем конфигурацию systemd и добавляем юнит в автозапуск:

systemctl daemon-reload

systemctl enable usbipd

После чего создаем сам скрипт автообновления инструментов и расшаривания устройства usbipd:

mkdir /root/scripts/
nano /root/scripts/usbipd

#!/bin/sh

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

bindID='1-4' # BusID нашего USB-устройства на сервере

kernel_version=$(uname -r) - # создание переменной, содержащей текущую версию ядра системы

apt install linux-tools-$kernel_version # установка инструментов проброса для актуальной версии ядра

usbipd -D

sleep 1

usbip bind -b $bindID # делаем USB-устройство на сервере доступным для проброса

usbip attach --remote=localhost --busid=$bindID

sleep 3

usbip detach --port=00

Выдаем разрешение на запуск скрипта:

chmod ugo+x /root/scripts/usbipd

Последние три строки скрипта вынесены отдельно неслучайно. ПО на стороне сервера может работать неидеально. Иногда при попытке подключения устройства к клиенту под управлением ОС Windows может возникнуть проблема, когда клиент попросту не видит на сервере устройства с BusID 1-4:

usbip -a 188.124.55.21 1-1 usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Проблема решается путем проброса USB-девайса сервера самому себе с его последующим отключением, что и содержится в последних трех строках скрипта.

Просмотр активных подключений

ss -tnp | grep ':3240'

Ставим на клиентские машины USBIP2

https://github.com/vadimgrn/usbip-win2

Для клиентов на Linux

Загрузите необходимые модули ядра. Выполните в терминале:

modprobe vhci-hcd

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

usbip -l 192.168.1.1

Подключите удалённое устройство.

usbip attach --remote=192.168.1.1 --busid=1-2
  • Автоматизация подключения
nano /etc/systemd/system/usbip_client.service

[Unit]
Description=usbip_client
After=network.target[Service]
ExecStart=/bin/sh /root/script/usbip_client

ExecStop=/bin/sh /root/script/usbip_client_unmount
Type=oneshot
RemainAfterExit=yes[Install]
WantedBy=multi-user.target

Создаем скрипт подключения:

mkdir /root/script
nano  /root/script/usbip_client
#!/bin/sh
apt-get install linux-tools-`uname -r` -y
sleep 1
usbip attach --remote=192.168.1.1 --busid=1-2
sleep 1
echo "Подключенные устройства:"
usbip port
nano /root/script/usbip_client_unmount
#!/bin/sh
sleep 1
usbip detach -p 00
sleep 1
echo "Отключение устройства:"
usbip port

Даем разрешение на запуск скрипта:

chmod ugo+x /root/script/usbip_client
chmod ugo+x /root/script/usbip_client_unmount

Обновляем конфигурацию systemd и добавляем юнит в автозапуск:

systemctl daemon-reload
systemctl enable usbip_client

Проверяем подключенные устройтсва

 lsusb

ls -l /dev/ttyUSB*

dmesg | grep tty

Спасибо Хабру и его жителям за предоставленную инфу, использована статья: https://habr.com/ru/companies/selectel/articles/668590/