воскресенье, 26 февраля 2017 г.

Доступ к USB-устройству по сети.



Расскажу про свои копания в теме раздачи 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.