Расскажу про свои копания в теме раздачи USB-устройств по сети с сервера на Debian 8.
Началось всё с того, что я увидел в настройках SteamLink пункт VirtualHere и начал копать в этом направлении. Копал всего ничего, но кое-что накопал.
В мире Linux для раздачи USB-устройств по сети уже довольно давно есть механизм USBIP. Состоит он из ядерных модулей "usbip-core", "usbip-host", "vhci-hcd", демона "usbipd" и программы для управления "usbip". Ставится обычно командой:
sudo apt install usbip
Подгрузка необходимых модулей выполняется так:
sudo modprobe usbip-core sudo modprobe usbip-host sudo modprobe vhci-hcd
Запуск демона:
sudo usbipd -D
Теперь можно пробовать раздавать устройства, но сначала надо посмотреть список того, что есть в системе:
$ sudo usbip list -l - busid 1-5.1 (0cf3:3005) Atheros Communications, Inc. : AR3011 Bluetooth (0cf3:3005) - busid 1-5.4 (046d:081b) Logitech, Inc. : Webcam C310 (046d:081b)
В данном выводе интересуют значения после "busid". Теперь попробуем раздать web-камеру:
$ sudo usbip -l bind --busid=1-5.4 usbip: info: bind device on busid 1-5.4: complete
А дальше начинаются грабли.
Если запустить демон с параметром "-d" или "--debug" и попробовать с другой машины посмотреть список, то можно наткнуться на сообщение типа:
version mismatch: 262 273
А на машине-клиенте получить:
usbip err: usbip_network.c: 119 (usbip_recv_op_common) recv op_common, -1 usbip err: vhci_attach.c: 202 (query_exported_devices) recv op_common usbip err: vhci_attach.c: 417 (show_exported_devices) query
То есть кроме желания раздать устройство надо ещё и версии протоколов синхронизировать. В Linux ещё можно попробовать поставить другую версию ядра на одной из машин, а в Windows всё совсем печально. Самая свежая подписанная версия клиента датируется 2011 годом и с современными системами не работает. Можно попробовать собрать из исходников, отключить проверку подписи драйверов и попытаться запустить, но это не дело.
Убрать устройство из списка доступных для подключения по сети можно примерно такой командой:
sudo usbip -l unbind --busid=1-5.4
Теперь рассмотрим коммерческое проприетарное решение VirtualHere.
Этот механизм состоит из клиента и сервера. По заявлениям на сайте при работе на Linux использует механизм USBIP.
Со страницы с ссылками для Linux загружаем клиент под нужную архитектуру в удобный для запуска каталог. Теперь надо написать простенький конфиг, чтобы как минимум понять, что подключаемся к нужному серверу-хабу:
$ cat config.ini ServerName=usb-server
И запустить сервер примерно такой командой:
sudo ./vhusbdx86_64 -c config.ini
Можно еще добавить параметр "-b", чтобы сервер заработал в фоне.
Теперь со страницы клиентов загружаем клиент для Windows и запускаем его. Он предложит установить службу Bonjour для автоматического поиска серверов-хабов в локальной сети и после удовлетворения требования найдет и отобразит список найденного:
Теперь можно щелкнуть правой кнопкой мыши по нужному устройству и выбрать пункт "Use this device". При первом подключении программа сначала предупредить, а потом установит драйверы для виртуального USB-концентратора.
После установки выбранное устройство появится в системе и будет работать так, словно оно подключено к USB-порту напрямую.
Кроме того при передаче данных по сети используется сжатие.
При открытии предпросмотра в Skype поток данных по сети был примерно 7,5 МБ/сек. Если фактически отключить сжатия таким значением в конфиге, то поток был уже 21 МБ/сек:
CompressionLimit=5000000
А теперь о грустном.
Без покупки лицензии одновременно можно использовать только одно устройство, лицензия стоит 40 долларов для трёх устройство и 50 для неограниченного количества устройств. Лицензия привязывается к железу сервера. Сервер для Windows у меня не захотел работать с устройствами на USB3.