Виртуализация / Проброс видеокарты в виртуальную машину

в 4:05, , рубрики: Новости, метки: , , , , , , , ,

Виртуализация / Проброс видеокарты в виртуальную машину
Говорят, что современные аппаратные технологии поддержки виртуализации (VT-d у Intel, IOMMU у AMD) позволяют отдавать физическое устройство на шине PCI в непосредственное управление виртуальной машине. В том числе видеокарту.
Воображение рисует такую конфигурацию: настольный сервер с гипервизором, на нем запускается гостевая пользовательская операционная система, имеющая доступ к необходимым устройствам ввода-вывода, один-два неприхотливых сервера по мере надобности, ну и сколько надо виртуалок для бесчеловечных экспериментов. Управляем гипервизором через консоль в гостевой ОС либо удаленно, с ноутбука, скажем.
Вдохновленный этой картиной, я решил попробовать, но оказалось, что проброс (passthrough) видеоадаптера — задача не совсем тривиальная. Только месяца через три боданий с железом и чтения форумов удалось получить положительный результат. В качестве гипервизора пробовал VMware и Xen. Получилось только с Xen.
Коротко.
Железо:
Материнская плата Gigabyte GA-Q67M-D2H-B3
Прошивка BIOS — F5
Setup: CPU->Intel Virtualization Technology=ON
Setup: Chipset->North Bridge->VT-d=ON

Процессор Intel Core i5 2500 3.3 GHz

Память 16 GB

ATI Radeon HD 3470 в первом слоте PCIe, используется гипервизором

ATI Radeon HD 3450 во втором слоте PCIe, отдается гостевой ОС

Сетевой адаптер Intel в слоте PCI

Софт:
XCP (Xen Cloud Platform) 1.0 (XenServer build 42052c)

Citrix XenCenter для управления

Windows 7 64 bit в качестве гостевой ОС, ATI Catalyst 12.1

Поначалу я долго экспериментировал с VMware vSphere 5.0. Собственно, аппаратная конфигурация подбиралась именно под нее. По дороге открылся ряд интересных подробностей: например, VT-d должен поддерживаться и процессором (пишут, что процессоры с индексом K не годятся), и чипсетом и материнской платой. С видеокартами вообще беда: известно, что с большинством этот фокус не проходит, с некоторыми (довольно короткий список) у одних получается, у других нет. Долгое и содержательное (хотя не слишком радостное) обсуждение было тут:VMware Communities: VMDirectPath and ATI Radeon. Radeon 3450 ходил, пожалуй, в фаворитах как одна из самых пробрасываемых карт.
Я перебрал приличное количество разнообразных комбинаций железа. В конкурсе участвовали две материнские платы, три видеокарты плюс интегрированное видео SandyBridge (IGD), три сетевых адаптера и один процессор. Несколько раз я бросал эти бесплодные попытки на неделю-другую, потом придумывались какие-то варианты. По дороге был один момент, когда почти получилось: виртуалка правильно определила монитор, но дальше дело не пошло. Уперся в то, что карта вроде бы нормально пробрасывалась в виртуалку, и в девайс менеджере показывалась ровно, но Каталист упорно отказывался иметь с ней дело. Карта как живая, но не работает.
Можно было попробовать много чего еще: Windows XP и Linux в качестве гостевых систем (ставил Windows 7 в 32 и 64-разрядном исполнении), добыть очередную видеокарту… В конце концов плюнул и решил зайти с другого конца, попробовав другой гипервизор. Не мудрствуя, взял то, что на виду: Xen в составе Xen Cloud Platform(XCP).
XCP поставился без сучка без задоринки.
На некоторое время поставил в тупик вопрос: как этой системой рулить? В смысле, должна же быть какая-нибудь консоль управления, желательно под винды? Поковырявшись полдня с условно-штатным OpenXenManager я пришел к мысли, что то ли лыжи не едут, то ли эта кроссплатформенная тулза на винде не живет. Один или два раза она сконнектилась с сервером, но померла где-то в процессе работы, остальные разы глухо висла при коннекте, сливая неудежимый поток исключений в консоль Питона.
К счастью, более широкий взгляд в окружающий интернет открыл мне, что Citrix XenCenter прекрасно может рулить opensource-ным Xen-ом, а сам вполне бесплатен. Правда, при коннекте кричит, что через N дней у вашего сервера истечет Evaluation period, но знающие люди пишут, что это он просто не в курсе насчет opensource редакции сервера, а на самом деле все будет работать.
XenCenter позволяет создавать-включать-гасить виртуалки, а проброс устройств надо настраивать из sysadmin-friendly интерфейса командной строки.
Против ожиданий, проблем тут не случилось. Сделал все по мануалу, и хватило его одного. Вот народ жалуется, что по Xen-у документации мало. Так другой раз и хорошо, что мало, если этого хватает. Сколько я по vSphere прочел, и все без толку… Впрочем, не хочу говорить дурных слов про vSphere. Под ней зато так железо настроилось, что Xen пролетел прямо со свистом.
Итак, с помощью XenCenter я организовал виртуалку о двух ядрах и 4 ГБ памяти, накатил туда седьмую 64-битную винду и пошел пробрасывать.
В соответстви с руководством правим /boot/extlinux.conf, вставляя строку "iommu=1 iommu_inclusive_mapping=1" после каждого вхождения "/boot/xen.gz"
Выполняем extlinux /boot.
Шаги, связанные с модулем pciback, пропускаем — пишут, что в шестерке он уже вкомпилирован в ядро.
Делаем xe vm-list и находим uuid нашей виртуалки, у меня uuid=d103a91d-5c38-844f-14d5-64b3c495eb08
Выполняем команду lspci и находим в выводе нашу карту, например 02:00.0 VGA compatible ..., 02:00.1 Audio… (двойка удивительным образом соответствует номеру слота, куда воткнута карта).
Записываем однострочный скрипт видаxe vm-param-set other-config:pci=0/0000:02:00.0,0/0000:02:00.1 uuid=d103a91d-5c38-844f-14d5-64b3c495eb08
У меня на карте, помимо видеоадаптера, еще звук — поэтому, помня грабли, на которые наступал в vSphere, добавляю оба устройства: 0/0000:02:00.0, 0/0000:02:00.1.
Выполняем скрипт. Для контроля xe vm-param-list uuid=d103a91d-5c38-844f-14d5-64b3c495eb08 | more — действительно
Останавливаем и снова запускаем виртуалку (пишут, что именно так, а не ребутом — не стану проверять лишний раз).
При первой попытке карта у меня в первом слоте PCIe (01:00.0, 01:00.1) и по умолчанию используется гипервизором. После перезапуска виртуалки монитор гаснет.
В XenCenter (с ноутбука) заходим в консоль виртуалки и после логина в винду видим, что она просит ребута. Признак того, что она нашла новое устройство. Не будем ей отказывать. Ребут. Действительно, в Device Manager появился новый видеоадаптер Radeon 3450 с драйвером Microsoft WDDM 1.1. Из предыдущего опыта известно, что драйвер нужен родной. Качаю и ставлю свежий ATI Catalist 12.1, тот после установки, как обычно просит ребута. Ребут… опаньки. Первая попытка накрывается медным тазом: падает гипервизор. Да… vSphere в такой ситуации одерживала убедительную победу над виртуалкой, устраивая ей BSOD.
Перепускаем хост и, по рекомендации лучших собаководов, смотрим, что пишет нам командаdmesg. Пишет она, помимо прочего, такое:pciback 0000:01:00.1: secondary bus reset failed for device — all functions need to be co-assigned — err: 6
pciback 0000:01:00.1: FLR functionality not supported; attempts to use secondary bus reset unsuccessful;
pciback 0000:01:00.1: FLR not performed for device
Похоже, что передача карты на горячую нам не светит. Ладно. Дадим гипервизору свой VGA адаптер, благо видеокарт мне теперь хватает. Переставляем Radeon 3450 во второй слот, в первый ставим валяющийся рядом 3470. К каждой карте прицепляем по монитору. Включаем хост, запускаем виртуалку. Винда просит перезагрузки после изменения конфигурации. Ребут. Логинимся…
В консоли XenCenter заставка зависает, и я не сразу соображаю, что правый монитор светится синим
Оно все-таки произошло.
Итого, на Xen срослось за 3 дня (после того, как 3 месяца упражнялся на VMware).
Я залогинился. Картинка на мониторе самая обыкновенная, без особенностей. Разрешение 1920х120 держит. Не тупит (хотя тестов не гонял). Видео с YouTube проигрывается нормально.
На этой радостной ноте завершу свой правдивый отчет, а сам займусь пробросом клавиатуры, мыши и прочей периферии.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js