XEN HVM & USB

Материал из support.qbpro.ru

Xen: проброс USB устройств внутрь HVM виртуальной машины (Windows) или USB passthrough Актуально для: Xen 3.x; Xen 3.4+ и Xen 4 с VUSB Денис "Reagent" Ходус @ 01.09.2011 Проброс USB в виртуальную машину Xen возможен двумя основными путями, в корне отличающимися по своему решению (здесь я буду рассматривать проброс USB только "статический", т.е., например, некий аппаратный ключ защиты, который подцепляется при запуске системы).


Метод 1: устаревший

Данный метод доступен из Xen любых версий, включая подверсии 3.x и 4.x.

Для того, чтобы пробросить USB устройство внутрь HVM домена (например, внутрь Windows) из Xen в файле конфигурации виртуальной машины требуется добавить следующие строчки:

usb = 1 usbdevice = 'host:0a89:0003'

Первой строчкой мы включаем виртуальный USB хаб внутри нашей HVM виртуальной машины.

Вторая строчка показывает Xen - какое именно устройство нужно прокинуть внутрь. Здесь:

   host : так и пишем: host, не меняется
   0a89 : VendorID
   0003 : DeviceID


VendorID и DeviceID у необходимого устройства можно посмотреть с помощью команды: $ lsusb выполенной на Dom0 Xen.

В вывалевшемся спеске Вы увидите все устройства USB, подключенные к данному серверу. Среди них будут и USB-разветвители (USB Hub), и другие устройства, если они подключены.


Как подключить несколько устройств? К сожалению, информации по данному вопросу в Xen я не нашел, а то, что пытался сам пробывать - ничего не помогает. Без PV прокинуть в HVM машину несколько USB устройств не получается.


Метод 2: Xen 3.4+, Xen 4.0+ и паравиртуальные машины

Данный метод заработал только на относительно свежих Xen, и самым ярким применением является в Xen 4. Для его работы требуется, чтобы HVM-машина имела на борту паравиртуальные драйвера (например, GPLPV).

Для Windows установка паравиртуальных дров описана здесь: ссылка.

С помощью данного метода создается виртуальный USB-контроллер на стороне HVM домена и уже внутрь данного контроллера пробрасываются указанные устройства.


Для того, чтобы это заработало - надо в файл конфигурации виртуальной машины добавить следующую строчку:

vusb = [ 'usbver=2, numports=8, port_1=1-1, port_2=1-2' ]

здесь:

   usbver=2 : Версия USB. usbver=2 - это USB 2.0, usbver=1 - это USB 1.1
   numports=8 : Количество портов этого виртуального контроллера. От 1 до 16.
   port_1=1-1 : Это описание порта 1 виртуального контроллера. Т.е. здесь указывается - какое USB устройство прокинуть в порт 1 виртуальной машины.
   port_2=1-2 : То же самое, только для второго порта.


Как мы видим, здесь есть настройки под названием port_X, после знака "=" у которых указан какой-то индекс USB устройства, которое нужно прокинуть.

Этот индекс - это ID устройства, воткнутого в физическую машину (будь то флешка или аппаратный ключ защиты). Узнать - какой-же нам ID надо - можно следующей командой:

$ sudo xm usb-list-assignable-devices

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

При этом, как мы видим, в одну виртуальную машину можно уже прокидывать до 16 USB устройств, что не может не радовать.


Посмотреть текущие прокинутые в определенную машину устройства можно командой: $ sudo xm usb-list <domain_name>

Где вместо <domain_name> укажите имя домена, по которому Вы хотите вывести листинг.


PS. Личные наблюдения - аппаратный ключ защиты через этот метод (второй) - не пробросился. По первому методу - пробросился, а по второму - нет, при этом во втором методе Xen писал, что девайс есть и он привязан к нужной виртуальной машине, а внутри самой машины ключа видно не было.