Технология USB over IP очень удобна в случае когда надо раздать одно USB устройство большому количеству людей, или пробросить USB порт на виртуальную машину.
Сервер который будет давать доступ к USB носителю развернем на Ubuntu
Для работы сервера нам потребуются:
- usbip-core — основа USBIP-сервера,
- usbip-host — управление USB-устройствами,
- vhci-hcd — модуль экспорта виртуальных USB-устройств.
Выполним запуск необходимых нам модулей:
sudo modprobe usbip_core
sudo modprobe usbip_host
sudo modprobe vhci_hcd
Чтобы не запускать данные модули вручную каждый раз, добавим их в конфигурационный файл modules.conf:
usbip-core
usbip-host
vhci-hcd
Запускаем USB-сервер в качестве демона:
Проверяем список подключенных устройств:
- 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
Расшарим наш ключ
Cоздаем юнит в systemd, который будет обращаться к скрипту usbipd и расшаривать наш USB-девайс автоматически после старта сетевых служб ОС:
[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:
#!/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
Выдаем разрешение на запуск скрипта:
Последние три строки скрипта вынесены отдельно неслучайно. ПО на стороне сервера может работать неидеально. Иногда при попытке подключения устройства к клиенту под управлением ОС Windows может возникнуть проблема, когда клиент попросту не видит на сервере устройства с BusID 1-4:
Проблема решается путем проброса USB-девайса сервера самому себе с его последующим отключением, что и содержится в последних трех строках скрипта.
Просмотр активных подключений
Ставим на клиентские машины USBIP2
https://github.com/vadimgrn/usbip-win2
Для клиентов на Linux
Загрузите необходимые модули ядра. Выполните в терминале:
Проверяем доступные для подключения USB-устройства:
Подключите удалённое устройство.
- Автоматизация подключения
[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
Создаем скрипт подключения:
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
sleep 1
usbip detach -p 00
sleep 1
echo "Отключение устройства:"
usbip port
Даем разрешение на запуск скрипта:
Обновляем конфигурацию systemd и добавляем юнит в автозапуск:
systemctl enable usbip_client
Проверяем подключенные устройтсва
lsusb
ls -l /dev/ttyUSB*
dmesg | grep tty
Спасибо Хабру и его жителям за предоставленную инфу, использована статья: https://habr.com/ru/companies/selectel/articles/668590/

