Использование бесплатного пакета USBIP для проброса USB внутрь виртуальных машин

В статье про USB и виртуальные машины один из читателей блога – Vovets666 опробовал  бесплатное ПО USBIP и предложил написать про него статью.

Дисклаймер:
все описанное ниже – мое личное видение проблемы и способов ее решения, не являющееся истиной в последней инстанции. Вполне возможно, существуют и другие варианты, я с удовольствием про них послушаю. В качестве инструкции по работе с ПО использованы материалы, найденные в интернете, уже и не помню где… Кроме того, являясь админом – виндузятником, с Linux я знаком довольно поверхностно, работал в условиях дедлайна и времени на изучение матчасти/танцы с бубнами особо много не имел, поэтому описываю, как сделал, чтобы работало, и уверен, что есть и другие способы.

Итак, имеем виртуальные машины – серверы 1С, поднятые на MSWindowsServer 2008R2. Для работы ПО необходимы подключенные к ним серверные HASP-ключи. Непосредственно подключить их на ВМ на Hyper-V, как известно, нельзя. Задача: каким-то образом пробросить HASP-ключи на виртуальные машины, желательно с использованием минимума дополнительного железа и стоимости лицензий.

(Оффтоп: у 1С в последнее время появилась возможность программного лицензирования ПО, без использования HASP-ключей (что-то вроде активации с использование пин-кодов). Но есть нюансы: обмен на лицензию с программной активацией не бесплатный, при изменении конфигурации машины необходима повторная активация, по истечении определенного лимита разрешение на активацию остается на усмотрение техподдержки, что совсем не айс. Посему было решено использовать старый способ с HASP-ключами).

Рассматривались варианты:

– способ, предоставляемый компанией Микрософт (правда, для других целей):
RemoteFX+RDP7.1. Не устроил по причинам: необходимо оборудование с поддержкой RemoteFX, на сервере 1С должны быть подняты дополнительные сервисы (служба доступа к удаленному рабочему столу), с хоста на виртуалку должна постоянно висеть сессия RDP, через которую пробрасывается ключ, необходима клиентская лицензия на доступ к RDS. Возможно, в каком-либо из пунктов этого списка я и ошибаюсь, но общее их количество зарубило способ на корню.

– аппаратные устройства сторонних производителей. Недостатки: стоят денег, к тому же у некоторых устройств наблюдались проблемы с совместимостью с используемыми ОС (к примеру,Ubox 4100, который у нас есть) и которые производитель решать не собирался. Сейчас проблемы вроде как решены (в других моделях), но осадок остался.

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

Сама по себе установка и настройка ПО больших проблем не вызвала, в комплекте к пакету имелся краткий мануал, плюс – интернет.

Пакет USBIP (http://usbip.sourceforge.net/) для работы требует наличия 2х настроенных машин: сервера (к нему непосредственно подключается ключ) и клиента (на него этот ключ пробрасывается). Серверная
часть USBIP существует только под Linux, клиентская – под Linux и Windows (включая 7 и 2008R2).

1) Установка сервера (машины, в которую подключено USB устройство).

В качестве сервера используем машину с установленным Linux. Я использовал Linux Ubuntu v.11.04 (сборка Lubuntu, которая декларируется как наименее требовательная к ресурсам) как наиболее простую (для меня) систему: ставится без каких-либо проблем, автоматически подцепляет новые подключаемые USB устройства, после установки по умолчанию инсталлированы необходимые компоненты, кроме того, USBIP присутствует в репозитарии. С целью экономии на оборудовании эта машина создана как виртуальная, поднятая на существующем хосте ESXi 4.1 и в нее в свою очередь проброшен ключ HASP с хоста стандартным для ESXi способом.

Установка проблем не вызвала: ставим систему, подключаем к сети, выдаем IP, через менеджер пакетов устанавливаем USBIP и необходимые для работы компоненты. Кроме того были установлены VMware tools (так как данная машина – ВМ на ESXi).

На всякий случай напомню, как это делается:

Из оснастки VMware подключаем диск с ПО (Inventory -> Virtual Machine -> Guest -> Install/Upgrade VMware Tools). С этого диска распаковываем архив с ПО на рабочий стол. Запускаем терминал и в нем набираем:

<имя пользователя>@<имя машины>:~$ sudo <путь до файла>\vmware-install.pl –default

Скрипт запустится и далее в ответ на все вопросы нажимаем «Enter» – ПО будет установлено с параметрами по умолчанию.

2) Настройка сервера USB ключей.

Запускаем терминал. Дальнейшие действия – из командной строки.

· Загружаем следующие модули.

<имя пользователя>@<имя машины>:~$ sudo modprobe usbip

<имя пользователя>@<имя машины>:~$ sudo modprobe usbip_common_mod

· Запускаем usbip в качестве системного демона:

<имя пользователя>@<имя машины>:~$ sudo usbipdD

получаем:

Bind usbip.ko to a usb device to be exportable!

<имя пользователя>@<имя машины>:~$

USBIP готов к использованию.

· Далее подключаем USB устройство к компьютеру.

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

· Для просмотра подключенных USB устройств выполняем команду

<имя пользователя>@<имя машины>:~$ lsusb

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

Bus XXX Device YYY: ID VendorID:DeviceID <название устройства>

что-то вроде:

Bus 002 Device 004: ID 0529:0001 Aladdin Knowledge Systems HASP v0.06

Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Запоминаем сочетание VendorID:DeviceID

· Выполняем команду:

<имя пользователя>@<имя машины>:~$ sudo usbip_bind_driver –list

USBIP проверяет список подключенного оборудования и выводит его с указанием их bus-ID вида:

– busid 2-1 (0529:0001)

2-1:1.0 -> none

– busid 2-2 (0e0f:0002)

2-2:1.0 -> hub

……..

В данном случае bus-ID, указывающий на нужное нам USB устройство: “2-1”.

· Теперь подключаем устройство к серверу. Набираем:

<имя пользователя>@<имя машины>::~$ sudo usbip_bind_driver –usbip 2-1

получаем:

** (process:1483): DEBUG: 2-1:1.0 -> none

** (process:1483): DEBUG: write “add 2-1” to /sys/bus/usb/drivers/usbip/match_busid

** Message: bind 2-1 to usbip, complete!

Устройство подключено к USBIP, доступ с локальной машины-сервера к нему теряется.

· Также можно посмотреть, какие устройства подключены к USBIP в данный момент. Для этого набираем:

<имя пользователя>@<имя машины>:~$ sudo usbip_bind_driver –list

Получаем:

– busid 2-1 (0529:0001)

2-1:1.0 – > usbip

– busid 2-2 (0e0f:0002)

2-2:1.0 -> hub

…….

Устройство с bus-ID 2-1 подключено к USBIP. Система может передавать данные об этом USB устройстве с вашей системы удаленным клиентам.

Настройка сервера закончена. В случае необходимости можно добавлять и убирать
экспортируемые устройства.

Параметры USBIP – linux сервераUsage: usbip_bind_driver [OPTION]

-?, –help вызов
справки
–usbip busid make a device exportable
-other busid use a device by a local
driver
–list print usb devices and their
drivers
–list2 print usb devices and their
drivers in parseable mode
–allusbip make all devices exportable

3) Настройки клиента MS Windows

· Скачиваем дистрибутив. Нам понадобятся обе версии – 0.1 и 0.2.

· Устанавливаем USB/IPEnumenator. Он устанавливается как произвольное системное устройство с драйверами на диске. Драйвера берем из дистрибутива версии 0.2:

Для Windows XP:

1. Распаковываем файлы в локальную папку.

2. В Панели Управления жмем «Установка Оборудования», в открывшемся Окне Приветствия Мастера жмем «Далее».

3. Выбрать «Да, устройство уже подсоединено» -> «Далее».

4. Выбрать «Добавление нового устройства»-> «Далее».

5. Выбрать «Установка оборудования, выбранного из списка вручную» -> «Далее».

6. Выбрать «Системное устройство» -> «Далее».

7. Выбрать «Установить с диска», -> «Просмотр», выбрать папку с разархивированным драйвером -> «ОК».

8. Выбрать ‘USB/IP Enumerator’, -> «Далее».

9. «Мастер готов к установке нового оборудования» -> Выбрать «Далее» -> Готово».

Для Window 7 (и 2008r2):

1. Для разрешения установки неподписанных драйверов: запускаем cmd от
администратора и выполняем «bcdedit /settestsigningon».

2. Распаковываем файлы в локальную папку..

3. Открываем «Диспетчер Устройств».

4. Правой кнопкой на «имя компьютера» -.«Установить старое устройство» (или выбрать в меню «Действие»).

5. В открывшемся Окне Приветствия Мастера жмем «Далее».

6. Выбрать «Установка оборудования, выбранного из списка вручную» -> «Далее».

7. Выбрать «Системное устройство» -> «Далее».

8. Выбрать «Установить с диска», -> «Просмотр», выбрать папку с разархивированным драйвером -> «ОК».

9. Выбрать ‘USB/IP Enumerator’, -> «Далее».

10. «Мастер готов к установке нового оборудования» -> Выбрать «Далее» -> «Готово».

Все указанные действия также описаны в идущем с пакетом USBIP файле «usage» на английском языке.

· Подключаем USB устройства, обозначенные как экспортируемые на нужном нам сервере. Для подключения используем USBIP из дистрибутива версии 0.1

Запускаем cmd. Смотрим, какие устройства готовы к подключению:

path-to-usbip:> usbip.exe -l <server-ip>

(server-ip – IP адрес сервера USB устройств из пункта 2)

Пример:

C:\usbip>usbipl 192.168.1.13

usbip dbg: usbip_network.c: 229 (tcp_connect ) trying 192.168.1.13 port 3240

usbip dbg: usbip_network.c: 249 (tcp_connect ) connected to 192.168.1.13:3240

– 192.168.1.13

usbip dbg: usbip.c: 423 (query_exported_devices) exportable 2 devices

2-1: unknown vendor : unknown product (0529:0001)

: /sys/devices/pci0000:00/0000:00:11.0/0000:02:02.0/usb2/2-1

: unknown class / unknown subclass / unknown protocol (ff/00/00)

: 0 – unknown class / unknown subclass / unknown protocol (ff/00/00)

……….

В результате видим, что на сервере 192.168.1.13 готово к подключению устройство с bus-ID 2-1 – то, которые мы настроили в пункте 2. Устройств может быть и больше.

Далее – подключаем нужное устройство:

pathtousbip:> usbip.exea <serverip> USBID

USB-ID в нашем случае 2-1.

Получаем многабукв (листинг параметров) и в завершение:

new usb device attached to usbvbus port 2

USB устройство должно появиться в системе клиента. Окно терминала желательно не закрывать.

Параметры USBIP – windows клиентаUsage: usbip [options]

a, –attach [host] [bus_id] Attach a remote USB device
-x, –attachall [host] Attach all remote USB
devices on the specific host
-d, –detach [ports] Detach an imported USB
device
-l, –list [hosts] List exported USB devices
p, –port List virtual USB port status
-D, –debug Print debugging information
-v, –version Show version
-?, -h, –help Print this help

Примечания: Возникавшие проблемы и их решение:

1. Я использовал версию системы 11.04 на ядре 2.6. После обновления системы до версии 11.10 (ядро 3.0.4) usbip работать перестал – выдал ошибку, что компонент не найден. Пришлось восстанавливать машину и отказываться от обновлений. С другой стороны, так как это служебная узкоспециализированная машина и доступ к ней ограничен, это было признано не критичным.

2. Поначалу hasp-ключи отказывались подключаться к клиенту, выдавая ошибку. В ходе экспериментов было установлено, что сначала необходимо запустить usbip -демон, а уже затем подсоединять к машине ключи. В дальнейшем ошибки исчезли, подключаться ключи стали в любом порядке, повторить ошибки не удалось. Это как раз одна из тех странностей, про которые я упоминал.

3. После перезагрузки ВМ клиента – сервера 1С иногда не получается подключить к нему некоторые из ключей – выдает ошибки. Возможно, это связано с зависшими на сервере HASP сессиями обмена с usb-устройствами. Лечится перезагрузкой сервера HASP и повторным пробросом ключей на клиент.

28 thoughts on “Использование бесплатного пакета USBIP для проброса USB внутрь виртуальных машин”

  1. Мы используем Digi AnyWhere USB 14 для тех же целей.
    Почти 2 года уже – полет нормальный.
    Да, решение дорогое, но в работе Digi AnyWhere USB 2 (около 8000 руб.) 2 порта – тоже себя показали хорошо. У нас просто ключей много.

    Фокус внешнего аппаратного проброса USB в том, что можно не быть привязанным к пробросу портов хостами, т.к. без отключения 1С – хост нельзя тронуть в рабочее время.

    Софтовые лицензии от 1С – полный отстой, они к тому же привязываются к пользователю, а не компьютеру и запуск 2-х копий одним пользователем (разработчиком) ужирает в 2-раза больше лицензий. А если несколько баз, то вообще – полные кранты. И работает эта система отвратительно по надежности.

  2. Почему используете usbip.exe версии 0.1? У меня абсолютно нормально работает 0.2.

    Самого интересного у вас и нет – автоматизации подключения (переподключения) ключей. Как раз сам сегодня этим занялся и тут ваша статья. Думал что-нибудь почерпну, ан нет. Ну да ладно, так даже интереснее.

  3. to phylzy
    >Фокус внешнего аппаратного проброса USB в том, что можно не быть привязанным к пробросу портов хостами
    Факт. При наличии кластера – можно гонять виртуалку с хоста на хост при сохранении доступности сервиса. К сожалению – к нам это не очень применимо и хосты в рабочее время трогать все равно нельзя.

    to Kyoshiro
    >Почему используете usbip.exe версии 0.1? У меня абсолютно нормально работает 0.2.
    Сначала работать не хотело вообще (ставил тоже только последнюю версию – 0.2), где-то на форумах вычитал про использование совместно разных версий, после установки (отмечу, что не утверждаю – «вследствии», только – «после») заработало. Потому и записал себе в качестве рекомендации.
    Про автоматизацию думал, но счел, что при ней необходимо контролировать результаты выполнения всех шагов. По идее, неплохо бы, чтобы где-то логировался ход выполнения подключения, чтобы в случае неудачи можно было определить причину. Кроме того, не было уверенности, что после перезагрузок, переподключений и пр. не поменяются параметры ключа (пресловутый «2-1»). Так как ключей у меня всего 4 на двух машинах – то ограничился батниками, запускаемыми вручную, про них не стал писать, чтобы не загромождать текст. Хотя согласен – сама мысль интересная.

  4. По поводу новых ядер – изменились модули ядра отвечающие за usbip. Теперь это usbip_host и usbip_core. Соответственно, необходимо пересобрать и сам usbip, подходящий доступен из svn (ссылка есть на сайте usbip).

  5. Господа. Вопросец такой: поднял сервер на Ubuntu 11.04, не жалуюсь на виндах клиент работает. Теперь нужно подключить клиентом Centos 6.2, драйверы поставил, а вот найти сам пакет usbip не могу. Подскажите как собрать этого гада под CentOS?

  6. Добрый день! А не могли бы описание и листинг батников выложить?
    Заранее спасибо!

  7. Не удаётся запустить Windows-клиент. Пробовал 0.1 и 0.2 в разных сочетаниях – результат один и тот же:

    C:\temp\usbip>usbip.exe -l 192.168.7.253
    usbip dbg: usbip_network.c: 229 (tcp_connect ) trying 192.168.7.253 port 3240
    usbip dbg: usbip_network.c: 249 (tcp_connect ) connected to 192.168.7.253:3240
    – 192.168.7.253
    usbip err: usbip_network.c: 124 (usbip_recv_op_common) recv op_common, -1
    usbip err: usbip.c: 412 (query_exported_devices) recv op_common
    usbip err: usbip.c: 481 (show_exported_devices) query

    При этом Linux-клиент работает нормально.

  8. Добрый день.
    Монтируется всё отлично но после перезагрузки виндовой машины заново устройство не подключается
    request failed at peer, 1
    usbip err: usbip.c: 263 (query_import_device) recv op_common
    usbip err: usbip.c: 309 (attach_device) query
    это с клиентом 0.1
    С клиентом 0.2 тожесамое только другие коды ошибок.

  9. >Монтируется всё отлично но после перезагрузки виндовой машины заново устройство не подключается
    Уважаемые, а вам трудно перед перезагрузкой отцепить подключенные ключи?
    Приведены же в статье – Параметры USBIP – windows клиентаUsage: usbip [options]
    a, –attach [host] [bus_id] Attach a remote USB device
    -x, –attachall [host] Attach all remote USB
    devices on the specific host
    -d, –detach [ports] Detach an imported USB
    device

    Хотя, думается, еще не хватает команды: Detach all linked remote USB

  10. “Аналогичное” решение чему? Ваш вариант стоит денег!
    Ценник – от 90$ за порт, два порта – 160$, десять портов – 400$.
    Это дешевле Digi AnywhereUSB, но не бесплатно.

    Ссылку оставлю, вдруг кому-то платный USB-вариант захочется протестировать.
    Хотя в тестировании разрешено использование только одного устройства – неизвестно, как поведет себя софт при попытке расшаривать ключи разным получателям.

  11. Если смущает отсутствие обновлений, то есть форк http://sourceforge.net/projects/ipusb/

    Работает нормально. Но как обычно под винду для продактив нужно доработать напильником =)
    Комплектный гуйный клиент только для демонстрации – берем исходники и оборачиваем в нормальный сервис…

  12. to Mr.Aloof вопрос

    “Комплектный гуйный клиент только для демонстрации — берем исходники и оборачиваем в нормальный сервис…”

    А это что и как, можете раскрыть подробнее для нубов?

  13. “из коробки” идет приложение с аскетичной формой и минимальным функционалом – добавляете сервер, кликаете в него – получаете список доступных устройств. Кликаете в устройство – он подключается.
    Предоставляется скорее для демонстрации. Смотрите в исходники как это работает и пишите свое приложение (службу). Вам же наверное хочется чтоб подключалось автоматически и реагировало на проблемы более цивилизовано чем сообщение ОС о креше? 😉

  14. Ну я не знаю как еще понятнее… Если не понятно, то стоит купить законченный продукт с саппортом 😉

  15. После падения в разы курса рубля отказались от покупки Anywhere USB. Решили сначала потестить железный “аналог” типа Titan ( http://www.titan.tw/product/NETUSB_400i.html ) – работает, НО !!! только в пределах бродкаст-домена. Т.е. выдать ключ за пределы подсети нельзя от слова совсем.
    Сейчас купили Unlimited лицензию на Eltima . Довольны. 1С, NormaCS , РАРУС (СЛК) клиент-банки и прочие гадкие КАТРАНы – всё раздаётся и работает. Своих денег (оно сильно дешевле, чем 14-ти портовый Anywhere USB) стоит однозначно. Рекомендую. Не реклама. Просто делюсь опытом.

  16. А не подскажете, могут ли все эти программные-аппаратные средства раздавать ключ нескольким клиентам одновременно?
    например “Digi AnywhereUSB” – с установленным 1 USB ключем раздать его 2м виртуальным машинам одновременно?

  17. Забыл добавить для Александра:
    Подключить USB устройство к 2-м хостам одновременно принципиально невозможно в силу протокола USB. (хотя для некоторых типов устройств, которые не сильно требовательны к протоколу, можно это реализовать но никто не будет это кодить, ибо сильно частный случай)

    А вот подключение “по требованию” сделать реально. Когда устройство “перетыкается” между клиентами по мере необходимости.

Leave a Reply

Your email address will not be published. Required fields are marked *