23 июл. 2013 г.

Проброс USB из XenServer 6.2 в виртуальную машину

В XenServer 6.2 пробросить USB порт в виртуальную машину нельзя. Можно пробросить целиком контроллер USB, а вместе с ним в "виртуалку" попадут и все порты связанные с этим контроллером. По такому же принципу можно пробросить практически любое устройство из хостовой системы. Как правило, на сервере от 2 USB контроллеров. Узнать это можно командой хостовой системе:


[root@xen ~]# lspci | grep USB
00:1a.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 05)
00:1d.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 05)

Нас интересуют идентификаторы контроллеров 00:1a.0 и 00:1d.0 именно их мы и будем использовать в дальнейшем. Наверняка, угадать к какому контроллеру подключено устройство будет сложно. Для этого есть команда lsusb из пакета usbutils, но в XenServer этот пакет не установлен. Установить можно на лету командой:
yum install --enablerepo=base usbutils
Также можно попытаться использовать dmesg. Или данные из файла /proc/bus/usb/devices

Просмотреть можно при помощи команды cat

Например информация о аппаратном USB ключе защиты Лига:Закон в этом файле выглядит таким образом:

T:  Bus=02 Lev=02 Prnt=02 Port=04 Cnt=02 Dev#=  4 Spd=1.5  MxCh= 0
D:  Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=0a89 ProdID=0003 Rev= 2.00
S:  Manufacturer=Aktiv Co.
S:  Product=Guardant Stealth/Net II
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr= 56mA
I:* If#= 0 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)

Видно, что используется Bus=02, значит контроллер будет 00:1d.0

Далее необходимо узнать UUID ВМ, в которую будет проводиться проброс.

Например так:

[root@xen ~]# xe vm-list name-label=test
uuid ( RO)           : cd9c4655-dc8a-c086-103c-c1716293449d
     name-label ( RW): test
    power-state ( RO): running

Зная идентификатор контроллера  в консоли XenServer нужно выполнить команду:

[root@xen ~]# xe vm-param-set other-config:pci=0/000:00:1d.0 uuid=cd9c4655-dc8a-c086-103c-c1716293449d

Где 0/000: - обязательная часть, далее идет сам идентификатор контроллера.
Проверить правильность настроек можно командой:

xe vm-param-list uuid=cd9c4655-dc8a-c086-103c-c1716293449d | grep other-config

Должно присутствовать: pci: 0/000:00:1d.0

 После перезапуска ВМ, в диспетчере задач, в случае если установлен Windows, появится хостовый USB контроллер с подключенным к нему устройством.

Для того чтобы отключить проброс контроллера, в консоли XenServer необходимо выполнить команду:

xe vm-param-remove param-name=other-config param-key=pci uuid=cd9c4655-dc8a-c086-103c-c1716293449d

17 комментариев:

Евгений комментирует...

Огромное тебе спасибо за хороший мануал, все три статьи очень помогли. Добавлю от себя. Что бы с таким пробросом заработал HASP для 1С нужно ключ подключать не напрямую, а через внешний USB HUB. Проверенно на Citrix Xen 6.2

Алексей Блинков комментирует...

А почему не получается напрямую?

Эдуард Гильмутдинов комментирует...

Спасибо! очень четкие, краткие но точно в цель статьи, без лишнего.

Анонимный комментирует...

http://www.incentivespro.com/usb-server.html

Алексей Блинков комментирует...

Как вариант, удобно если используется Xen Pool, при миграции ВМ между хостами, USB устройство будет доступно.

Алексей Блинков комментирует...

Но для этого желательно выделить отдельную физическую машину. Если есть примеры реализации данного ПО на Xen хосте, интересно посмотреть как настроить.

Анонимный комментирует...

А у меня, при добавлении контроллера вышеописанным методом, ВМ не стартует.
Error: Starting VM 'Test1' - Internal error: xenopsd internal error: Xenctrl.Error("38: Function not implemented")

Алексей Блинков комментирует...

А в BIOS AMD-V/Intel-VT включено?

Анонимный комментирует...

Да, Intel Virtualization Technology - включено.
Без добавления USB-PCI контроллера ВМ работает. Добавляю при выключенной или при работающей ВМ, загрузка ВМ останавливается на 5-й секунде.

Алексей Блинков комментирует...

А что за ВМ? Какая ОС?

Анонимный комментирует...

Три тестовые ВМ - Win2003, Win2008, Win2012. Все ведут себя одинаково.

Переставил XenServer, версию 5.6 FP1. Делаю аналогичный проброс USB-контроллера, ВМ запускается, но нового контроллера не появляется, USB-ключи не видны.

Алексей Блинков комментирует...

А система ВМ выдает информацию нахождени нового оборудования? XenTools установлены?

static комментирует...

Помимо Intel-VT должно быть включено VT-D (без включенного IOMMU не работает проброс устройств).

other-config:pci=0/000
как я понимаю, опечатка, должно быть
0/0000

Алексей Блинков комментирует...

Нет, Именно с такими параметрами и работает:

other-config (MRW): vgpu_pci: ; pci: 0/000:00:1d.0;

Анонимный комментирует...

хороший мануал, одного не понял. как сопоставить вывод lsusb, где видно, на какие шины какое устройство подключено, с выводом lspci, где видны идентификаторы контроллеров? это когда 2 строчки все просто, а у меня тут 6 вариантов, никак не могу разобраться

willmore комментирует...

с несколькими контроллерами разобрался. в /proc/bus/usb/devices смотрим, на каких шинах висит 2 устройства. одно из них будет сам контроллер (например, bus=02, dev#=1), второе - подключенный девайс (bus=02, dev#=3). где dev#=1 смотрим SerialNumber. именно его и пишем в конфиг ВМ после нуля со слешем: 0/0000:00:1d.7. и если у кого-то работает с 0/000, значит тут индивидуально.

Alex Whitest комментирует...

Странно, конечно, но у меня не заработало.
XenServer 6.2, VM WinServer 2008 R2.
При загрузке в логах выдаёт ошибку:
Nov 14, 2013 6:57:46 PM Error: Starting VM 'TS' - Internal error: xenopsd internal error: Xenctrl.Error("12: Cannot allocate memory")
Выключаешь проброс - всё стартует. Пробовал и с 0/000, и с 0/0000.
Опыта понять, что не так, не хватает, к сожалению.