Использование USB over IP в Vmware и Hyper-V. Настройка digi anywhereusb | Настройка серверов windows и linux

Использование USB over IP в Vmware и Hyper-V. Настройка digi anywhereusb | Настройка серверов windows и linux Электронная цифровая подпись

«поднимаем» usb/ip-клиента на vds/vps

USB-токен востребован в первую очередь на ПК под управлением ОС с графическим интерфейсом. Такая особенность среди гостевых ОС для виртуальных серверов, предлагаемых в аренду сервис-провайдерами, по умолчанию присуща, пожалуй, только популярной среди неискушенных пользователей продукции компании MS. Поэтому устанавливать и использовать USB/IP в клиентском режиме будем в первую очередь под ОС этого производителя.

А вот с этим у USB/IP не всё так гладко, как для Linux. На официальном репозитарии последняя информация по ветке для Windows датирована 2022 годом. И если под ОС до версии Windows 7/ Server 2008R2 включительно, ПО ещё работает, то для более свежих — уже нет.

Поэтому, после изысканий в том числе и с помощью Хабра, нашёлся созданный KyungWoon Cho вариант под названием usbip-win, который и лёг в основу решения. Но и он потребовал «танцев с бубнами» перед внедрением, так как у каждого гипервизора, с помощью которого создаётся виртуальный сервер, свои особенности взаимодействия с гостевой операционной системой.

Например, релиз usbip-win 0.2.0 встал на Windows Server 2022 под Hyper-V, но отказался работать под Windows Server 2022 и 2022 под KVM. Релиз же usbip-win 0.1.0 под KVM заработал нормально. Его я и буду использовать в дальнейшем повествовании.

«поднимаем» usb/ip-сервер на сетевом мосте

Учитывая тот факт, что USB/IP уже давно включён в основную «ветку» ядра Linux, установить его на Raspberry Pi OS (ответвление Debian для процессоров ARM), под которой функционирует сетевой мост моей сети, не составляет большого труда:

sudo apt install usbip

Также, как и запустить его в режиме сервера:

sudo modprobe usbip-host
sudo modprobe vhci-hcd
sudo usbipd -D


Первые две команды подгружают необходимые модули в ядро, третья — запускает ПО в режиме демона. Выполнение этих команд можно автоматизировать с помощью bash-скрипта, а также запускать его при загрузке системы или по команде от внешнего сервиса.

«шарим» usb-устройства

Уверен, многие из читателей задумывались над вопросом:

«Кто кроме меня имеет доступ к данным, которые я разместил на виртуальном сервере у сервис-провайдера?»

Скрывать не буду, этот вопрос тоже не давал покоя, покуда я не обратил внимание на криптоконтейнер — надежно зашифрованную папку с паролем, где можно хранить и редактировать файлы. Своего рода сейф внутри VDS/VPS. Но, каким надёжным не был бы сейф, если ключи и код от него окажутся в чужих руках, то и содержимое — определённо, тоже.

Это присказка, а сказка в том, что «такое же решение для себя» у меня занимается «доставкой» по-требованию ключа и кода к «сейфу» на виртуальном сервере через защищенную виртуальную сеть. А именно:


Теперь подробнее о механизме «доставки»:

  • На стороне севера:
  • На стороне клиента

Более весёлая часть: подготовка

Ещё тогда мне запало в голову, что я краем глаза видел, что в JTAG-адаптере CMSIS DAP по USB ходит не чистый JTAG-трафик, а команды. Сам JTAG-трафик формируется уже внутри адаптера. Давно хотел проверить это, да всё руки не доходили. Массовый перевод на удалёнку заставил это сделать (возникла задачка).

Что такое CMSIS DAP? Это JTAG-адаптер, рекомендованный самой компанией ARM для контроллеров Cortex-M. Исходные коды для разных контроллеров выложены на GitHub, можно спаять адаптер на базе любого из них. Я сейчас дам ссылку на клон проекта, адаптированный под макетную плату «Голубая пилюля»:

Вариант под актуальную версию windows

Но как бы ни была хороша Windows 7, а она уже мертва. В рамках работ над All-Hardware мы рассматривали разные варианты решения одной из проблем, и надо было просто проверить ряд альтернатив по принципу «подойдёт — не подойдёт». Тратить много человеко-часов на проверку было невозможно. А переделка драйвера под Windows 10 могла затянуть в себя. Поэтому был проведён поиск в сети, который вывел на

. На момент его обнаружения свежий вариант был датирован 23 февраля 2020 года, то есть проект живой. Он может быть собран и под WIN7, и под WIN10. К тому же, в отличие от оригинального проекта, может быть собран не только Windows-клиент, но и Windows-сервер.

Читайте также:  Как правильно сделать копию ЭЦП самостоятельно

Я проверил, проект прекрасно собирается и устанавливается, поэтому дальнейшая работа велась с ним. В файле readme есть ссылка на готовый двоичный код для тех, кто не хочет самостоятельно производить сборку.

Внутри

  1. Ядро:USB/IP — открытое ПО, предназначенное для организации совместного использования USB-устройств через компьютерную сеть. Если описывать технологию кратко, то, для «шаринга» USB-устройств, с сохранением их «родной» функциональности, USB/IP инкапсулирует (упаковывает) «сообщения ввода-вывода USB» в полезную нагрузку (содержание) TCP/IP пакетов и пересылает их между компьютерами.

    В результате, компьютер использует удаленные USB-устройства так, как будто они непосредственно подключены к его USB-портам, а оригинальные драйверы и программные приложения для них без какой-либо модификации.
    Подробнее тут

    USB/IP позволяет «шарить» практически любые устройства с USB интерфейсом, включая специализированные — чековые принтеры, сканеры штрих-кодов, датчики температуры, гигрометры, термостаты, конвертеры сигналов, сетевые адаптеры, ну и конечно же — USB-токены.

  2. Транспортная инфраструктура: ZeroTier — подобный корпоративному коммутатору SDN инструмент для организации виртуальных сетей поверх физических, c возможностью подключения практически любого приложения или устройства.
    Подробнее тут

    Кроме того, что ZeroTier объединяет виртуальные серверы и все узлы физической сети IP-адресами из единого диапазона, он также защищает доступ к USB-устройствам на USB/IP-сервере для каждого из компьютеров этой сети, где бы он не находился.

  3. Что же касается «упаковки», то я рассматривал множество вариантов. Но однажды, обратил внимание на 15-ти процентную утилизацию вычислительных ресурсов и два свободных USB-порта используемого в роли сетевого мостаRaspberry P и решил задействовать его ещё и роли USB/IP-сервера

Грустная часть проверки: клиентская часть

В Windows устанавливаем драйвер (делаем это только один раз, дальше он будет всегда установлен). Для этого запускаем от имени администратора файл

usbip.exe

с аргументом

install

usbip.exe install

Теперь смотрим, доступно ли нам устройство:

usbip.exe list --remote=192.168.10.123

Убеждаемся, что оно присутствует в списке. Ну, и подключаем его:

usbip.exe attach --remote=192.168.10.123 --busid=1-5.4.1.3

В менеджере устройств появляется новое USB-устройство, Keil его прекрасно видит…

Но на этом всё приятное кончается. Небольшая программа заливается во флэшку около минуты. Попытки шагать по строкам идут от 5 до 20 секунд на каждую строку. Это неприемлемо. Во время паузы в обе стороны идёт трафик примерно 50 килобит в секунду. Долго и вдумчиво идёт.

Честно говоря, ограничение по времени привело к тому, что я только предполагаю, почему всё было так плохо. Подозреваю, что там по сети бегает JTAG-трафик. А он бегает небольшими пакетами в обе стороны, отсюда и проблемы. Так было завершено исследование с результатом: «Для проекта не подходит».

Настройка клиента для usb over ip

Вся настройка заключается в установке специального программного обеспечения anywhereusb remote hub configuration utility. Она включает в себя драйвера и утилиту для мониторинга подключения USB Токенов.

Так как в моем примере у меня устройство AnywhereUSB-14, то драйвера я буду скачивать по данной ссылке:

Настройка anywhereusb remote hub configuration utility

В результате установки драйверов для вашего устройства USB over IP , на виртуальной машине Vmware или Hyper-V вы обнаружите две утилиты:

  1. AnywhereUSB Configuration Utility – утилита управленияподключением
  2. USB Device Viewer – утилита проверки подключения etoken по технологии USB over IP

Открываем AnywhereUSB Configuration Utility, чтобы обнаружить и подключить наш Etoken. Первым делом вы переходите в меню Edit-Discovery List. В поле Ip адрес указываете ip вашей железки DIGi и нажимаете кнопку Add. Теперь она будет присутствовать в списке обнаружения.

Далее в меню Edit-Connection list, теперь добавим тот же Ip для соединения сервера и клиента, тут же можно сразу задать группу к которой будет идти подключение (Group Number) и нажимаем Add.

Думаю вам понятна разница между Discovery List и Connection list. Первый просто показывает, что доступно на устройстве, а второй уже автоматически подключается к нему.

В результате вы увидите статус: Connection Successful to Remote Hub, а если не повезет, то Can not find Remote Hub. Если необходимо будет отключить USB Токен, то нажмите Disconnect.

Если необходимо будет переключить группу, то делается это на отключенном устройстве в Connection list, через правый клик по нему. Там будет пункт Configure. Обратите внимание, что тут есть пункты для шифрования трафика между клиентом и сервером USB over IP.

То, что у вас появился статус Connection Successful to Remote Hub, еще не говорит, что устройство работает и проброс на виртуальную машину Vmware или Hyper-V осуществлен. Чтобы удостовериться, что все хорошо, вам необходимо воспользоваться утилитой USB Device Viewer.

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

Общий принцип проброса usb over ip в vmware и hyper-v

Вы покупаете специальное устройство, например Digi AnywhereUSB/14.

Читайте также:  USB-токен: что это такое и как пользоваться — Wylsacom

Подключаем vds/vps к сети zerotier

Для начала на узел, который пользователь желает подключить к сети, необходимо установить сервис ZeroTier One. Ссылки на дистрибутивы, а также…

Порядок сборки и эксплуатация

Шаг 1-ый Создаём виртуальную сеть ZeroTier

Шаг 2-ой. Создаём сетевой мост и добавляем его к сети ZeroTier


Шаг 3-ий. «Поднимаем» USB/IP-сервер на сетевом мосте

Шаг 4-ый. Подключаем виртуальный сервер к сети ZeroTier

Шаг 5-ый. «Поднимаем» USB/IP-клиента на VDS/VPS

Шаг 6-ой. «Шарим» USB-устройства

Описываемый выше порядок действий указан с расчётом на то, что читатель уже, хотя бы немного, знаком с Raspberry PI и ZeroTier.

Также, в процессе повествования, дабы не повторяться и уменьшить объем статьи, я буду ссылаться на соответствующие разделы гайдов по ZeroTier. Прошу не судить строго и задавать вопросы в комментах, если что-то не понятно.

Проблемы с пробросом usb устройств

Я думаю, сейчас уже выражением виртуальная машина, никого не удивишь, наверное подавляющее системных администраторов свои физические сервера отдали под гипервизоры Hyper-V или Vmware и это понятно, так как это более рациональная утилизация ресурсов. Все замечательно, можно создавать кластерные системы не привязанные к конкретному серверу, что дает очень хорошую отказоустойчивость, но есть небольшое но и это проблема с USB устройствами.

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

Плюс есть проблемы, что Hyper-V и Vmware могут пробрасывать в себя не все устройства, а только поддерживаемые, которых не так уж и много, я вам показывал ситуацию, когда мне нужно было предоставить виртуальной машине USB-модем. Вот для таких ситуаций, чтобы все было надежно, и USB Токен всегда переезжал на любой хост за виртуальной машиной, была разработана технология USB over IP.

По сути вы передаете ваш токен по локальной сети в вашей организации. Это очень применяется на терминальных фермах Windows Server, где очень часто установлен 1С. Подробнее о принципах работы USB over IP, читайте по ссылке слева.

Процесс и результат доставки «ключа» и «кода» к «сейфу» на vds/vps

∑ На этом рассказ о субъективном «видении» решения для «проброса» USB-портов между физическими и «облачными» вычислительными ресурсами завершаю. Надеюсь что, несмотря на отсутствие хайповой информации о «прорывных» технологиях и новых продуктах, статья всё-таки будет полезна читателям Хабра.

Создаём виртуальную сеть zerotier

Для создания виртуальной сети пользователю необходимо перейти во вкладку Add network сетевого контроллера ZeroTier. Из пункта…

Создаём сетевой мост и добавляем его к сети zerotier

Для начала мне стоило определиться — какой узел в сети будет выступать в качестве бриджа. Изучив варианты, я понял…

Стоимость

Размер бюджета на новое оборудования в составе комплекта на фото дополнительной сетевой карты USB- RJ45 для реализации бриджа, на момент написания статьи не превышал пяти тысячи рублей

Стоимость же самого решения, за счёт услуг по настройке и внедрению, для заказчика — несколько выше обозначенной суммы. Но, всё равно, меньше стоимости продукции «импортозамещаемых конкурентов». Особенно учитывая то количество USB-устройств, которые можно «расшарить» в стандартной конфигурации решения, плюс — функционал сетевого моста ZeroTier.

Часть вторая, серверно-линуксовая

Сервер USB/IP, расшаривающий USB-девайсы по сети, может быть поднят только в Linux-based OS. Ну что ж, линукс так линукс, устанавливаем на виртуалку Debian 8 в минимальной конфигурации, стандартное движение руками:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip

Установились. Дальше интернет подсказывает, что нужно бы загрузить модуль usbip, но — здравствуйте, первые грабли. Нет такого модуля. А всё оттого, что большинство руководств в сети относятся к более старой ветке 0.1.x, а в крайней 0.2.0 модули usbip имеют другие названия.

Поэтому:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

Ну и добавим в /etc/modules такие строки, чтобы загружать их автоматически при старте системы:

usbip-core
usbip-host
vhci-hcd

Запустим сервер usbip:

sudo usbipd -D

Дальше всемирный разум нам подсказывает, что в комплекте с usbip идут скрипты, позволяющие нам управлять сервером — показать, какое устройство он будет расшаривать по сети, посмотреть статус, и так далее. Тут нас поджидает еще один садовый инструмент — эти скрипты в ветке 0.2.x, опять же, переименованы. Получить список команд можно с помощью

sudo usbip

Почитав описание команд, становится понятно, что для того, чтобы расшарить требуемый USB-девайс, usbip хочет узнать его Bus ID. Уважаемые зрители, на арене грабли номер три: тот Bus ID, который выдаст нам

Читайте также:  Согласовать и подписать документы — Тинькофф Помощь

lsusb

(казалось бы, самый очевидный путь) — ей не подходит! Дело в том, что железки вроде USB-хабов usbip игнорирует. Поэтому, воспользуемся встроенной командой:

Часть заключительная

После некоторых мытарств, это работает. Желаемое получено, теперь ключ можно примонтировать к любому ПК (и размонтировать, конечно же, тоже), в том числе — за пределами широковещательного сегмента сети. Если хочется — можно это сделать с помощью скрипта командной оболочки. Что приятно — удовольствие абсолютно бесплатное.


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

Часть первая, историческая

Если машина виртуальная — всё это несложно. Функционал проброса USB от хоста в виртуалку появился еще в VMWare 4.1. Но в моём случае ключик защиты, опознающийся как WIBU-KEY, нужно было в разное время подключать к разным машинам, и не только виртуальным.

Первый виток поиска в далеком 2009-м году привел меня к железке под названием

Плюсы:


Минусы:

Второй виток случился во времена уже не столь отдаленные, и привел меня к теме статьи —

. Привлекает открытостью, тем более, что ребята из

подписали им драйвер для Windows, так что теперь даже на x64 всё работает без всяких костылей вроде тестового режима. За что команде ReactOS огромное спасибо! Звучит всё красиво, попробуем пощупать, так ли оно на деле? К сожалению, сам проект тоже подзаброшен, и на поддержку рассчитывать не приходится — но где наша не пропадала, исходник есть, разберемся!

Часть третья, клиентская и запутанная


Подключить расшаренное устройство по сети к машине под управлением Debian я попробовал сразу же на том же сервере, и всё прекрасно подключилось:

sudo usbip attach --remote=localhost --busid=1-1

Переходим к Windows. В моем случае это был Windows Server 2008R2 Standard Edition. Официальное руководство просит сначала установить драйвер. Процедура прекрасно описана в прилагаемом к windows-клиенту readme, делаем всё как написано, всё получается.

Распаковав клиент, пробуем примонтировать наш ключик:

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Ой-ой. Что-то пошло не так. Используем навык гугла. Встречаются отрывочные упоминания, что что-то там не так с константами, в серверной части разработчики при переходе на версию 0.2.0 изменили версию протокола, а вот в клиенте под Win сделать это забыли. Предлагаемое решение — поменяйте константу в исходнике и пересоберите клиент.

Вот только очень мне не хочется качать Visual Studio ради этой процедуры. Зато у меня есть старый-добрый Hiew. В исходнике константа объявлена как двойное слово. Поищем в файле 0х00000106, заменяя на 0х00000111. Не забываем, порядок байт обратный. Итог — два совпадения, патчим:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

Ииии… да!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

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

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

И всё. На это мне не смог ответить даже всезнающий гугл. А при этом команда отобразить доступные на сервере устройства вполне корректно показывает — вот он, ключ, можете монтировать. Пробую примонтировать из-под Linux — работает! А если теперь попробовать из-под Windows? О ужас — это работает!

Грабли последние: что-то там в коде сервера не дописано. При расшаривании устройства он не считывает с него количество USB-дескрипторов. А при монтировании устройства из-под Linux, это поле заполняется. К сожалению, с разработкой под Linux я знаком на уровне «make && make install». Поэтому проблема решена с помощью довольно грязного хака — добавлением в /etc/rc.local

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

Заключение

Проект usbip-win является современной заменой для проекта USB/IP. Он живёт и развивается. При этом он предоставляет для ОС Windows не только функцию клиента, но и функцию сервера. Совместимость с Linux-версией сохранена.

Устойчивость работы удалённого USB-устройства неожиданно поразила. Я был уверен, что возникнут таймауты. Возможно, где-то они и возникнут, но для JTAG-адаптеров не было замечено ни одного сбоя. К сожалению, не все USB-устройства могут быть проброшены через сеть по причине низкого быстродействия получившейся системы. Но в случае с JTAG-адаптерами можно рассмотреть альтернативные вещи. В частности, CMSIS-DAP вместо ST-LINK.

Оба рассмотренных проекта (usbip-win и CMSIS-DAP) могут быть скачаны с GitHub в виде исходных кодов.

Если это поможет кому-то организовать удалённый доступ к оборудованию, я буду рад. Использование Raspberry Pi позволит бросить оборудование в произвольных местах.

Оцените статью
ЭЦП Эксперт
Добавить комментарий