Usb по сети в виртуализации, за минуту
Usb по сети в виртуализации, за минуту
Добрый день, амигос, рад, что ты заглянул ко мне на сайт, сегодня мы рассмотрим такой вопрос, как организовать usb по сети и, как это использовать в виртуализации. Тема довольно актуальная, и встречается такая задача все чаще. Особенно у тех компаний, где есть инфраструктура удаленных рабочих столов RDS с 1С приложениями, Directum или Tessa.
Usb через сеть
Как вы уже знаете в нашу жизнь, давно и на долго вошла виртуализация. Мощности серверов растут, и естественно появились технологии рационального их использования, подразумевающие изоляцию и нормальную утилизацию ресурсов, что породило виртуальные машины, которые уже используют и на хостингах и дата центрах. Я уже рассказывал про все это, если интересно посмотрите по ссылкам слева и выше.
Как вы знаете иногда некоторые лицензионные программы, требую для работы usb ключ. Раньше в классическом варианте, когда были только физические сервера, с работой такой схемы проблем не было, но с появление виртуализации она выплыла на ружу.
К сожалению, у некоторых гипервизоров, нет возможности пробрасывать на прямую с сервера USB устройства. Примером может служить Hyper-V от компании Microsoft, который с 2008 года до сих пор не несет в себе такую возможность в Windows Server 2008R2, хотя в 2012 R2, попытки уже предприняты, в отличии от компании vMvare, которая это позволяет и я уже рассказывал как пробросить USB модем в vmware esxi.
Не спешите расстраиваться, адепты редмондсого гиганта, на выручку вам приходит технология USB over IP или AnywhereUSB. USB over IP позволяет подключить usb через сеть.
Суть проброса USB по локальной сети. Есть устройство AnywhereUSB — это небольшой сетевой usb хаб. Ниже примерные модели, представленные на рынке.
- AnywhereUSB /2 – 2 порта USB, самая простая из модельного ряда
- AnywhereUSB/ 5 – 5 портов USB, тут уже может удовлетворить потребности средней компании.
- AnywhereUSB /14 – 14 портов USB, самая топовая мне она нравится больше всего, но и она не лишена своих косяков. Бывают случаи, что она может зависнуть, и представьте, что все 14 USB-токенов, становятся не доступными, народ на терминальных фермах негодует, бизнес теряет деньги, или вот еще распространенная ошибка, когда у вас в системе не происходит подключение к ключу, и вы видите в утилите сообщение с содержимым «Can not find Remote Hub». Но все же аппаратные решение предоставления USB по локальной сети, в разы стабильнее, программных.
- Подключение USB через сеть, можно так же осуществлять и через немецкое оборудование компании SEH, например, myUTN-800, но в отличии от DIGI, оно еще работает и с LINUX платформами, я таким образом пробрасывал токен в CentOS 7, очень удобно. Он стоит чуток подороже, своего конкурента, но оно того стоит. Его внешний вид представлен на фото ниже. Он так же имеет до 14 USB портов.
- DistKontrolUSB-64 — это китайское оборудование, которое не так давно появилось на рынке. Чем данная железка выгодно отличается от SEH и DIGI, то это своей ценой, в несколько раз ниже. DistKontrolUSB-64 занимает аж три стоичных юнита и имеет 64 USB порта, так же в линейке есть оборудование с 16, 32 и 48 портами. Со стороны клиента устанавливается приложение USBoverIP-Client, через которое идет подключение к серверу. Есть версия USBoverIP-Client для Windows так и MacOS, легко работает на физических устройствах, так и на виртуальных машинах Hyper-V или Vmware.
В отличии от других вендоров у DistKontrolUSB-64 есть встроенный WIFI модуль, который позволяет производить подключения устройств USB по сети не только по проводному Ethernet, а еще и через WIFI, что согласитесь очень классно.
Настройка AnywhereUSB
Давайте рассмотрим, как настраивается железка, для того, чтобы сделать доступ юсб по сети. Вот, как это будет выглядеть схематично. У вас есть разного рода USB устройства или ключи безопасности, которые вы подключаете в один из 14 портов, далее устройство проксирует трафик по локальной сети до них, с помощью специального программного обеспечения, на стороне клиента.
Для настройки и управления устройством предусмотрено несколько интерфейсов:
• Web интерфейс для настройки, мониторинга и администрирования;
• AnywhereUSB утилита конфигурирования;
• Telnet Command-Line Interface;
• Simple Network Management Protocol (SNMP).
Для настройки устройства рассмотрим Web интерфейс — как наиболее удобный и простой вариант.
Управление IP адресом
Существует несколько вариантов присвоения IP адреса AnywhereUSB:
• Статический IP;
• Динамическое присвоение IP — Using Dynamic Host Configuration Protocol (DHCP);
• Auto Private IP Addressing (APIPA), наиболее известен как Auto-IP;
Как понимаете самый правильный способ это статический ip адрес. Задается он в пункте Network Configuration. Заведите себе правило, везде на серверах использовать статику, чтобы все ваши клиенты подключив USB Токен по сети, не бегали в догонялки за ним, если вдруг на сервере стоит динамическая адресация.
В этом же мню очень удобно задавать сетевые службы, доступные на нем. Обратите внимание на стандартные порты подключения. При желании вы их можете переназначить. По опыту могу сказать, что Telnet работает стабильнее, чем тот же ssh. Вообще старайтесь, минимизировать количество служб управления, либо же изолируйте ее с помощью VLAN.
Далее указываем DNS сервера, через «Advanced Network Settings» можно у них даже задать приоритет.
Самым важным шагом в настройке USB-ключей предоставляемых по сети различным серверам, это задание порт-групп (RealPort USB). По сути RealPort USB это группы объединяющие физические порты с USB ключами в логические группы, для проброса нескольких токенов на один сервер или виртуальную машину. Без создания RealPort групп, вы не сможете подключить ни одного клиента к вашему USB хабу.
Создаются они в меню «Applications — RealPort USB». Сам алгоритм, очень простой, слева у вас будут реальные USB порты, идущие по порядку, чуть правее, вы указываете в какой группе по счету должен быть, тот или иной порт. Не забываем вписывать описание, оно очень пригодится, можно задавать, только латинские буквы. После этого, вы можете считать, что проброс USB по локальной сети, осуществлен процентов на 80.
Не забывайте включать галку «Dynamic Group Assignment (DGA)», чтобы порты применялись сразу, без перезагрузки DIGI.
На вкладке «Conection Management» можно посмотреть текущие подключения. По сути это все клиенты, кто подключил ваш USB девайс по локальной сети.
Для увеличения безопасности, вы можете включить защиту паролем (Секретный ключ), можно это сравнить с двухфакторной аутентификацией. Делается это в пункте «RealPort», включите функцию «Enable RealPort Authentication» и введите секретное слово в Shared Secret.
Далее можете посмотреть сводную информацию по системе. Тут версия прошивок и загрузчика. Советую сразу проверить последняя она или нет.
Теперь, что дальше нужно сделать на виртуальной машине для сетевого взаимодействия USB токена и клиента, тут все до безобразия логично, нужно поставить там драйвера от AnywhereUSB и задать ip адрес устройства. Как видите я уже подключил ее и у нее есть внутренний Ip адрес.
С помощью специальной утилиты, Anywhere View можно проверить доступность и занятость всех устройств. Пожалуй это самый простой и надежный метод проброса токенов, флешек и различных модемов в ваши виртуальные машины по локальной сети, сами устройства стоят по разному, но если вы уж потратились на софт и гипервизоры, думаю при необходимости купите и это :).
Вообще реализовать подобную схему с пробросом USB устройств по локальной сети много, есть и программные, но лучше всегда использовать железо.
Проброс USB в виртуалку по сети средствами UsbRedir и QEMU
На сегодняшний день существет довольно много способов пробросить USB-устройство на другой компьютер или виртуалку по сети.
Из наиболее популярных — железячные такие как AnywhereUSB и чисто програмные продукты, из тех что я попробовал сам: USB Redirector и USB/IP.
Я бы хотел рассказать вам еще об одном интересном способе, который работает непосредственно с эмулятором QEMU.
Он так же является частью проекта spice, официально поддерживаемым RedHat.
UsbRedir, это открытый протокол для проброса usb-устройств по tcp на удаленный виртуальный сервер, разработанный при поддержке RedHat в рамках проекта spice. Но как оказалось им можно вполне успешно пользоваться и без spice. В роли сервера выступает usbredirserver, который шарит usb-устройство на определенный порт, а в качестве клиента сам QEMU, который эмулирует подключение экспортированного usb-устройства в определенный usb-контроллер вашей виртуальной машины. Благодаря такому подходу в качестве гостевой системы может использоваться абсолютно любая ОС, так как она даже не знает, что устройство является проброшенным удаленно, а вся логика ложится на QEMU.
Для начала несколько слов о вышеперчисленных решениях
- AnywhereUSB — довольно неплохое решение, но дорогое, и имеет неприятние глюки, например бывает если расшаренная флешка отваливается, то переподключить ее обратно можно только физически вынув и вставив ее.
- USB/IP — OpenSource проект. Вроде как был заброшен. По факту глючит довольно сильно. При разрыве соединения, машина частенько уходит в полнейший freezee, а windows показывает BSOD
- USB Redirector — Замечательная софтина. Для расшаривания устройств с linux на linux бесплатна, во всех остальных случаях уже стоит денег, не так много как AnywhereUSB, но и не бесплатно как хотелось бы 🙂
Как видно есть из чего выбрать, но давайте же наконец попробуем еще один способ — UsbRedir?
Настройка виртуальной машины
Для того что бы было куда подключать экспортированные устройства, на виртуальной машине нужно создать необходимые usb-контроллеры:
- uhci — для USB1.0
- ehci — для USB2.0
- xhci — для USB3.0
Для qemu (без libvirt)
Добавьте опции в команду запуска виртуальной машины:
Для libvirt
В исходном файле конфигурации виртуальной машины в узле <devices> удаляем все USB контроллеры и добавляем следущий блок:
Кстати, если вы используете spice, то добавив к контроллерам еще 3 специальных девайса, станет возможен проброс usb-устройств с клиента spice на сервер.
Для qemu
Добавляем следующие опции в команду запуска виртуальной машины, помимо контроллеров определеных нами раньше:
Для libvirt
В исходном файле конфигурации виртуальной машины в узле <devices> добавляем следующие опции, помимо контроллеров определеных нами раньше:
Теперь все готово для осуществления проброса.
Запуск сервера
Пакет usbredirserver можно найти в стандартных репозиториях практически во всех популярных дистрибутивах linux.
Вставляем флешку в компьютер, смотрим вывод usb-устройств:
Видим что пара vendorid:prodid равна 125f:c82a, а ядро определило флешке 003-001 usbbus-usbaddr соотвественно.
Теперь давайте расшарим ее на 4000 порт:
Подключение устройства к виртуальной машине
Через опции при запуске ВМ
Устройство которое нужно подключить к ВМ можно указать при запуске, добавив следующие опции в команду запуска
Для qemu
Для libvirt
Этот блок рамещается перед тегом </devices>, рядом с контроллерами определенными нами раньше:
Его так же можно исполнить командой virsh attach-device
Или через qemu-monitor
Заходим на гипервизор и в qemu-monitor нашей машины выполняем следующие команды:
Что бы отключить флешку достаточно такой команды:
На этом все, после данных шагов ваша ВМ увидит вашу флешку и сможет с ней нативно работать.
Если устройств много и все они одинаковые
Вот тут появилась интересная задачка, как пробросить несколько одинаковых девайсов на разные ВМ?
При этом, стоит отметить, все устройства имеют одинаковую пару vendorid:prodid, а пара usbbus-usbaddr совсем не постоянна, стоит только вынуть и вставить устройство, так оно сразу поменяет свой usbaddr.
Я решил ее при помощи udev.
Кстати если вы не совсем понимаете как работает udev, на Debian Wiki есть классная статья о udev
И так приступим
Для начала нам надо узнать серийник нашего устройства, по которому и будем идентифицировать его в udev:
И вставим наше устройство, после этого мы сразу увидим список переменных этого устройства которые udev любезно инициализировал для нас:
Информацию о серийнике и других аттрибутах можно получить и другим способом, но стоит учитывать что для написания правил мы будем использовать именно переменные из команды выше, а не аттрибуты из команды ниже. В противном случае не будет отрабатывать триггер remove при отключении устройства.
Теперь создадаим файл /etc/udev/rules.d/99-usb-serial.rules и запишем в него следующие правила:
Готово, теперь при подключении нашего устройства, оно будет автоматически шарится на нужный нам порт, а при отключении usbredirserver будет прекращать свою работу.
По аналогии добавляем и остальные устройства.
На этом все. Спасибо за проявленный интерес 🙂