Проброс USB устройств по сети с помощью USB Network Gate. Usb по сети в виртуализации.

На сегодняшний день существет довольно много способов пробросить 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)

Добавьте опции в команду запуска виртуальной машины:
-device ich9-usb-ehci1,id=ehci,addr=1d.7,multifunction=on -device ich9-usb-uhci1,id=uhci-1,addr=1d.0,multifunction=on,masterbus=ehci.0,firstport=0 -device ich9-usb-uhci2,id=uhci-2,addr=1d.1,multifunction=on,masterbus=ehci.0,firstport=2 -device ich9-usb-uhci3,id=uhci-3,addr=1d.2,multifunction=on,masterbus=ehci.0,firstport=4

Для libvirt
В исходном файле конфигурации виртуальной машины в узле <devices> удаляем все USB контроллеры и добавляем следущий блок:

Кстати, если вы используете spice, то добавив к контроллерам еще 3 специальных девайса, станет возможен проброс usb-устройств с клиента spice на сервер.

Пример под спойлером

Для qemu
Добавляем следующие опции в команду запуска виртуальной машины, помимо контроллеров определеных нами раньше:
-chardev spicevmc,name=usbredir,id=usbredirchardev1 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,debug=3 -chardev spicevmc,name=usbredir,id=usbredirchardev2 -device usb-redir,chardev=usbredirchardev2,id=usbredirdev2,debug=3 -chardev spicevmc,name=usbredir,id=usbredirchardev3 -device usb-redir,chardev=usbredirchardev3,id=usbredirdev3,debug=3
Для libvirt
В исходном файле конфигурации виртуальной машины в узле <devices> добавляем следующие опции, помимо контроллеров определеных нами раньше:

Теперь все готово для осуществления проброса.

Запуск сервера

Пакет usbredirserver можно найти в стандартных репозиториях практически во всех популярных дистрибутивах linux.

Вставляем флешку в компьютер, смотрим вывод usb-устройств:
$ lsusb ... Bus 003 Device 011: ID 125f:c82a A-DATA Technology Co., Ltd. ...

Видим что пара vendorid:prodid равна 125f:c82a, а ядро определило флешке 003-001 usbbus-usbaddr соотвественно.

Теперь давайте расшарим ее на 4000 порт:

# Используя пару vendorid:prodid $ usbredirserver -p 4000 125f:c82a # Используя пару usbbus-usbaddr $ usbredirserver -p 4000 003-011

Подключение устройства к виртуальной машине

Через опции при запуске ВМ

Устройство которое нужно подключить к ВМ можно указать при запуске, добавив следующие опции в команду запуска

Для qemu
-chardev socket,id=usbredirchardev1,port=4000,host=192.168.1.123 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,bus=ehci.0,debug=4
Для libvirt
Этот блок рамещается перед тегом </devices> , рядом с контроллерами определенными нами раньше:
Его так же можно исполнить командой virsh attach-device

Или через qemu-monitor

Заходим на гипервизор и в qemu-monitor нашей машины выполняем следующие команды:
# Добавляем наше устройство chardev-add socket,id=usbredirchardev1,port=4000,host=192.168.1.123 # Подключем его в ehci контроллер (USB-2.0) device_add usb-redir,chardev=usbredirchardev1,id=usbredirdev1,bus=ehci.0,debug=4
Что бы отключить флешку достаточно такой команды:
device_del usbredirdev1

На этом все, после данных шагов ваша ВМ увидит вашу флешку и сможет с ней нативно работать.

Если устройств много и все они одинаковые

Вот тут появилась интересная задачка, как пробросить несколько одинаковых девайсов на разные ВМ?
При этом, стоит отметить, все устройства имеют одинаковую пару vendorid:prodid, а пара usbbus-usbaddr совсем не постоянна, стоит только вынуть и вставить устройство, так оно сразу поменяет свой usbaddr.

Я решил ее при помощи udev.
Кстати если вы не совсем понимаете как работает udev, на Debian Wiki есть классная

И так приступим

Для начала нам надо узнать серийник нашего устройства, по которому и будем идентифицировать его в udev:

Запустим udev-монитор:
$ udevadm monitor --environment --udev
И вставим наше устройство, после этого мы сразу увидим список переменных этого устройства которые udev любезно инициализировал для нас:
... UDEV add /devices/virtual/bdi/8:16 (bdi) ACTION=add DEVPATH=/devices/virtual/bdi/8:16 ID_SERIAL_SHORT=11C130317234004B SEQNUM=4352 SUBSYSTEM=bdi USEC_INITIALIZED=189056149826 ...
Информацию о серийнике и других аттрибутах можно получить и другим способом, но стоит учитывать что для написания правил мы будем использовать именно переменные из команды выше, а не аттрибуты из команды ниже. В противном случае не будет отрабатывать триггер remove при отключении устройства.
$ udevadm info -a -n /dev/bus/usb/003/011 | grep "{serial}"

Теперь создадаим файл /etc/udev/rules.d/99-usb-serial.rules и запишем в него следующие правила:
ACTION=="add", ENV{ID_SERIAL_SHORT}="11C130317234004B", RUN+="/usr/bin/usbredirserver -p 4000 $attr{busnum}-$attr{devnum}" ACTION=="remove", ENV{ID_SERIAL_SHORT}="11C130317234004B", RUN+="/usr/bin/fuser -k 4000/tcp"

Перезагрузим udev-правила:
$ udevadm control --reload-rules
Готово, теперь при подключении нашего устройства, оно будет автоматически шарится на нужный нам порт, а при отключении usbredirserver будет прекращать свою работу.
По аналогии добавляем и остальные устройства.

На этом все. Спасибо за проявленный интерес:)

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

ВАЖНО. Сменные, то есть removable-устройства мы прокинуть в ВМ не сможем, хотя и есть некоторые ухищрения на этот счёт, но сейчас не об этом. Наш алгоритм работоспособен только для USB, которые показываются как fixed. Мы не сможем сделать снапшот для таких дисков.

Приступаем к манипуляциям




ВАЖНО. Вовсе не обязательно отключать ВМ перед добавлением жёсткого диска . Для этого существует специальная технология горячего добавления и горячего удаления.

  1. Подключаемся к ВМ через rdp или просто открываем консоль. Заходим в управление дисками. Если новый на месте, значит мы всё делаем правильно. Проверяем в сети ли он. Если нет, то исправляем это, как и раньше, вызовом контекстного меню. Точек монтирования и букв наши разделы не имеют, надо это дело исправлять. Кликаем на любой из разделов правой кнопкой и выбираем пункт «Изменить букву диска или путь к нему…». Выбираем любую свободную.

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

USB Network Gate — программа, позволяющая пользователям подключать USB устройства, подключенные к другим компьютерам используя каналы IP.

На рынке существуют разные реализации удаленного подключения USB устройств, как аппаратные, так и программные. Некоторые из них требуют от пользователей определенных знаний и навыков, в некоторых случаях настройка может занять много времени. USB Network Gate удивил меня своей простотой. Скачал программу, установил, нажал на кнопку Share и устройство сразу доступно для подключения на удаленной машине с установленным клиентом.

USB Network Gate может оказаться незаменимым например при использовании USB токенов на сервере RDP, программа позволяет настроить монопольный доступ к устройствам для отдельного пользователя удаленного рабочего стола, изолируя его от остальных пользователей. Программу можно так же использовать в виртуальной среде, если по каким то причинам устройство невозможно подключить напрямую. Существуют версии для Windows, Linux (RPM и Deb пакеты), Apple OS X и что особенно интересно, для Android. Теперь о том, как это работает.

Сервер

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

Есть возможность настройки соединения отдельно для каждого устройства или порта, разрешить соединение только для определенного адреса. Для защиты соединения предусмотрена авторизация и шифрование.


Клиент

При использовании USB Network Gate в качестве клиента, приложение сканирует локальную сеть на наличие серверов отображает все доступные для подключения устройства. Если сервер находится в другой подсети, например при соединении через VPN, можно добавить его с помощью кнопки “Add server”. После того, как я открыл доступ к принтеру, он появился в списке доступных для подключения на моем MacBook. Помимо принтера я подключал USB жесткий диск с разделами HFS+, он так же подключился, но разделы монтировались около трех минут, видимо из-за их большого объема.

Резюме

Trial версия позволяет открыть доступ только к одному устройству, зарегистрированная — в зависимости от уровня лицензий, от одного за $89, 95 до неограниченного за $699,95 . Если у вас есть необходимость быстро подключить устройство по сети, USB Network Gate то, что вам нужно, особенно если у вас нет сильных познаний в области компьютерного оборудования.

Данные инструкции верны начиная с 2,х версий.

Вроде бы, зачем еще что-то писать, когда есть официальная инструкция? Однако, здесь есть кое-что, чего там нет.

Есть два вариант передачи USB-устройства в гостевую систему:

  • передать «гостю» определенное устройство;
  • передать USB-порт, к которому это устройство подключено.

Проброс USB-устройств

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

# lsusb Bus 002 Device 002: ID 8087:8000 Intel Corp. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 8087:8008 Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 004: ID 051d:0002 American Power Conversion Uninterruptible Power Supply Bus 003 Device 003: ID 051d:0002 American Power Conversion Uninterruptible Power Supply Bus 003 Device 002: ID 046d:c00c Logitech, Inc. Optical Wheel Mouse Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

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

У меня стояла задача пробросить UPS-ы.
(Ситуация, на самом деле не типовая, скорее из серии как быть не должно: На сервер и сетевое оборудование поставлены 2 самый простых бесперебойника для рабочих станций. UPS-ы оказались нежными и начинали голосить по поводу и без. Чтоб быстро подрезать им голос и пока не разбираться с управлением ИБП из Debian и было решено подцепить два бесперебойника к Windows-гостям.)

На этом этапе я обнаружил, что оба нужных мне устройства имеют одинаковые ID… Но пробуем.

Пробрасываемые устройства прописываются в конфигурационном файле соответствующей виртуальной машины.

# nano /etc/pve/qemu-server/101.conf usb0: host=051d:0002

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

Вот тут то мы и вспоминаем, что есть другой способ проброса.

Проброс USB-портов

Необходимо определить к какому именно порту подключено нужное нам устройство.

Первый способ:

# lsusb -t /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/15p, 480M |__ Port 4: Dev 2, If 0, Class=HID, Driver=usbhid, 1.5M |__ Port 7: Dev 3, If 0, Class=HID, Driver=usbfs, 12M |__ Port 8: Dev 4, If 0, Class=HID, Driver=usbfs, 12M /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/3p, 480M |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/8p, 480M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/3p, 480M |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M

Как позже выяснилось, нужные мне устройства сидят на шине 3, порты 7 и 8. Но пока нам это не очевидно и вот вариант второй:

Qm monitor qm> info usbhost Bus 3, Addr 4, Port 8, Speed 12 Mb/s Class 00: USB device 051d:0002, Back-UPS XS 650CI FW:892.R2.I USB FW:R2 Bus 3, Addr 3, Port 7, Speed 12 Mb/s Class 00: USB device 051d:0002, Back-UPS XS 650CI FW:892.R2.I USB FW:R2 Bus 3, Addr 2, Port 4, Speed 1.5 Mb/s Class 00: USB device 046d:c00c, USB Optical Mouse

Тут мы наглядно видим кто есть кто. И теперь смело:

# nano /etc/pve/qemu-server/101.conf usb0: host=3-7

Для полноты картины, дополню инструкцию примером из официальной документации.

Возможен такой вариант:

Qm monitor qm> info usbhost Bus 3 , Addr 2, Port 1.2 , Speed 1.5 Mb/s Vendor Specific: USB device 0529:0001, HASP 2.17