Pull to refresh

Проброс видеокарты в гостевую ОС из гипервизора Xen

Reading time 7 min
Views 52K

Предыстория


После прочтения этой статьи, моя девушка предложила попробовать вставить в мой системник вторую видеокарту и получить две машины на одном железе. Мы проделали длинный совместный путь проб и ошибок, столкнулись с интересными проблемами, решение которых я хотел бы описать.

Аппаратная часть


  • Материнская плата Gigabyte GA-Q67M-D2H-B3
  • Прошивка BIOS — F5
  • Setup: CPU->Intel Virtualization Technology=ON
  • Setup: Chipset->North Bridge->VT-d=ON
  • Setup: Sata mode = ACHI
  • Процессор Intel Core i5 2500 3.3 GHz
  • Память 16 GB
  • SSD: OCZ Vertex 3 120gb
  • Intel GMA встроенная в мат. плату, используется гипервизором
  • ATI Radeon HD7770 в первом слоте PCIe, отдается гостевой ОС 1
  • ATI Radeon HD7770 во втором слоте PCIe, отдается гостевой ОС 2
  • Сетевой адаптер Intel, встроенный в мат плату
  • Второй ПК в той же локальной сети с ОС Windows для установки XenCenter и управления сервером

Начало


Изначально для эксперимента была выбрана платформа виртуализации XPC 1.5 beta (Xen Cloud Platform), в основе которой лежит гипервизор Xen. Эта платформа полностью бесплатна, кроме того, установка и запуск в работу занимает считанные минуты. В ходе работы выяснилось, что на виртуалке под XCP невозможно запустить Skype, он сразу же завершается с ошибкой. Проблема описана здесь и здесь. Для ее исправления требуется добавить одну строчку в исходники и пересобрать Xen, на котором основан XPC. Поэтому я перешел на бесплатную редакцию Citrix Xen Server 6.0.2 в котором данная проблема уже исправлена.

Еще одна опасность подстерегала при установке драйверов видеокарты. Дело в том, что Catalyst Control Center вызывает BSOD на гостевой системе (проверено как на XCP, так и на Xen Server). Поэтому придется ставить драйвер через диспетчер задач, родной инсталлятор тоже может вызвать BSOD при проверке видеокарты.

В итоге гостевая система получила в свое распоряжения полноценную HD7770 и прошла все тесты. После полной настройки гостевой ОС я создал связанную копию (это позволило изрядно сэкономить место на SSD) и пробросил туда вторую видеокарту.
К сожалению, отдельные USB порты XCP и Xen Server пробрасывать не умеют, поэтому я пробросил один контроллер USB в одну машину (все задние порты), второй в другую (все порты выведенные на корпус). Встроенные контроллеры USB висят на PCI и поэтому пробрасываются так же как и видеокарта.

Справедливости ради стоит отметить, что проброс отдельных USB есть в Xen, но управлять им на мой взгляд сложнее (нужен определенный опыт работы в линуксе)

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

Оценка производительности системы (виртуальная машина с проброшеной видеокартой)

image

Производительность диска CrystalDiskMark (виртуальная машина с проброшеной видеокартой)

image

Альтернативные варианты



Hyper-V 3.0 — гипервизор от MS

Есть бесплатный вариант с ограниченным функционалом. Он нам не подходит, так как пока не имеет поддержки проброса устройств (passthrough). У него однако есть очень заманчивая технология RemoteFX, которая позволяет получать 3d ускорение через RDP сеанс. Насколько я понял, некоторые современные игры работают с ним, некоторые нет. Кроме того, скорее всего, будут определенные затраты на эмуляцию, что снизит производительность. Эту интересную технологию я обязательно попробую и напишу отдельную статью.

ESXi — гипервизор от фирмы VMware

Пожалуй самый популярный и мощный. Во время тестирования он был фаворитом, т.к. почти во всем, на мой взгляд, превосходит XenServer. Во первых позволяет при создании виртуальных машин указывать тонкие настройки железа, что несомненно полезно при подготовке образов для заливки на реальное железо. XenServer же напротив, имеет лишь заранее подготовленные шаблоны и все делает на свое усмотрение. Во вторых имеет сразу три вида балансировки памяти, а так же позволяет “отдать” гостевой машине строго определенное количество процессорного времени. Есть бесплатная редакция с ограничением памяти в 32 ГиБ. Проброс (passthrough) PCI устройств здесь делается проще всего: отмечаем галочками нужные устройства и добавляем их в гостевую машину. Однако, успешно пробрасываются только некоторые видеокарты. Успех не зависит от производителя, пробрасываются как AMD, так и nVidia, но только некоторые. Мне не повезло, Radeon 7770 не удалось передать виртуальной машине. Во время установки драйверов получаем BSOD.
Во время проброса я столкнулся с очень интересным багом, который может поставить в тупик. Дело в том, что если гостевой машине выделено больше 2 гб памяти, то после проброса видеокарты машина не стартует! Решение проблемы я нашел здесь.
У этого гипервизора есть еще одна проблема: Нельзя просто взять и поставить его на обычное железо. Только на сертифицированное! На начальном этапе установке он не нашел подходящей сетевой карты и отказался продолжать. Довольно странно, т.к. встроенный в мою мат. плату сетевой адаптер — это Intel 82579, не самый плохой вариант, согласитесь. Далее я нашел в закромах D-link DGE 528T, но и эту плату он не поддерживает. Немножко погуглив, нашел следующее решение. Пропатчив образ, нам все же удалось установить ESXi 5.1.

Xen — гипервизор распространяющийся под лицензией GPL

На его основе сделано много коммерческих продуктов, например, очень популярный сейчас Citrix XenServer, или мало кому известный Oracle VM. Я вижу три варианта использования этого гипервизора:
  1. Использовать собственно Xen (самый долгий способ). В этом случае нам потребуется установить какой-нибудь дистрибутив линукса, затем установить на него Xen и настроить. При этом настройка и запуск виртуальных машин и самого гипервизора будет производиться с помощью создания и правки конфигурационных файлов. Все управление через командную строку.
  2. Использовать открытый XCP (Xen Cloud Platform). В этом случая мы получаем возможность управлять гипервизором, а так же гостевыми ОС при помощи сторонних приложений (удобно и быстро). Самое лучшее сочетание: XCP + Citrix XenCenter (бесплатная программа для управления Citrix XenServer). XCP 1.5 beta — это почти точная копия коммерческого Citrix XenServer 6.0, при этом функционал бесплатного XCP равен enterprise версии XenServer!
  3. Использовать коммерческий Citrix XenServer. Есть бесплатная редакция с ограниченным функционалом: отключена балансировка памяти, проброс видеокарты средствами XenCenter (через командную строку карта все равно пробрасывается). XenServer создан на основе XCP и мало чем от него отличается, однако Citrix выпускает частые патчи для XenServer, что является ключевым фактором влияющим на выбор.


KVM

малоизученный мною гипервизор, про него почти ничего сказать не могу. Вроде бы он умеет пробрасывать PCI устройства, в том числе видеокарты. Насколько я понял, он не является отдельной платформой, а ставится на линукс, после чего настраивается. Я не любитель ковыряния в командной строке и не имею достаточного опыта работы в линуксе, поэтому решил рассматривать его в последнюю очередь.

Установка и настройка XenServer (или XCP) и проброс видеокарты


Я объединил два разных продукта, т.к один фактически является клоном другого, расхождений в настройке мало (я буду их отмечать).

  1. Качаем с официального сайта XCP и XenServer (жмем try it Free сверху). Даже если вы планируете использовать XPC, я рекомендую скачать также XenServer, т.к. на установочном диске в папке client_install находится XenCenter, который будет не лишним.
  2. Устанавливаем гипервизор на железо. Установка снабжена мастером и не вызовет трудностей. Однако именно в момент установки стоит выбрать HDD для хранения виртуальных машин, если планируется использовать локальные диски, а не iSCSI. После установки это может вызвать трудности, т.к. делается только из командной строки.
  3. Устанавливаем на любой ПК в той же локальной сети Citrix XenCenter из образа Citrix XenServer (его мы скачали на первом шаге). Запускаем XenCenter и подключаемся к нашему серверу.
  4. (Только для XPC !!!) Для полноценной работы XenCenter c XCP 1.5 beta требуется в консоли гипервизора выполнить следующие команды:
    	cd /opt/xensource/bin
    	/etc/init.d/xapi stop
    	cp -vp xapi xapi.original
    	sed -i 's/1\.4\.90/6.0.99/g' xapi
    	/etc/init.d/xapi start
    	

    После этого в XenCenter появятся вкладки, позволяющие включать балансировку памяти, а так же выполнять проброс видеокарты в гостевые машины.
  5. Создаем новую виртуальную машину, выбрав нужный нам шаблон — Windows 7 (64-bit)
  6. Переходим во вкладку Console появившейся в XenCenter виртуальной машины и производим установку Windows 7 x64.
  7. Устанавливаем паравиртуальные драйвера, cмонтировав образ xs-tools.iso во вкладке Console.
  8. Задаем пароль для пользователя (нужен для подключения через терминал) и включаем терминальный доступ (Панель Управления -> Система -> Настройка удаленного доступа). Это нужно для доступа к гостевой ОС после проброса видеокарты, т.к. изображение перестанет выводиться в консоль.
  9. Переходим в консоль гипервизора. набираем
    	lspci
    	

    и видим список pci устройств с идентификаторами. Запоминаем коды нужных нам устройств. Например, видеокарта в первом pci-e слоте бедет иметь идентификатор 01:00.0, а встроенная в нее звуковая карта 01:00.1.
  10. Набираем
    	xe vm-list
    	

    и видим список виртуальных машин. Запоминаем uuid идентификаторы нужных нам машин. Например, d103a91d-5c38-844f-14d5-64b3c495eb08.
  11. Для проброса видеокарты набираем
    	xe vm-param-set other-config:pci=0/0000:01:00.0,0/0000:01:00.1 uuid=d103a91d-5c38-844f-14d5-64b3c495eb08
    	

    заменяя значения в примере на свои собственные. Через запятую пречисляем все pci устройства, который хотим пробросить.
  12. Внимание баг! Проброс устройств нормально не работает, если для гостевой машины включена балансировка памяти.
    Балансировка позволяет изменять количество памяти “на лету”. Например, есть две машины с максимально заданным пределом памяти 8 ГиБ. Допустим, в распоряжении гипервизора всего 8 ГиБ свободной памяти. Тогда, если включена одна машина, гипервизор выделяет ей все 8 ГиБ свободной памяти, но стоит запустить вторую, как гипервизор изменит количество памяти для первой машины (налету, не останавливая ее). Таким образом каждая получит по 4 ГиБ и израсходует всю свободную память.
    Суть бага заключается в том, что если количество свободной памяти гипервизора меньше максимального количества памяти для виртуальной машины, то при запуске этой машины от нее отвалится часть проброшеных PCI устройств.
  13. Запускаем гостевую ОС и видим что появились новые устройства. Качаем последний Catalyst, распаковываем в папку не устанавливая, затем переходим в диспетчер устройств и оттуда обновляем драйвер видеокарты, указав нужную папку.
    Дело в том, что Catalyst Control Center вызывает BSOD, даже если его получится установить, видеокарта будет работать не стабильно — переодически будут выскакивать артефакты изображения.
  14. После перезагрузки консоль виртуальной машины в XenCenter застынет на этапе загрузки Windows. Значит видеокарта проброшена, можно подключать монитор к ее разъему!


Ссылки (коротко)


Общие сведения: Wiki (Wiki)
Xen: Проброс видеокарты в Xen, из-под Ubuntu (Хабр)
Проброс видеокарты в виртуальную машину (Хабр)
Xen: XenVGAPassthrough (legacy) (Wiki.xen.org)
Xen: Xen VGA Passthrough (new)(Wiki.xen.org)
ХenServer и XCP: XenServer 5.6 Multi-GPU Passthrough for XenDesktop HDX 3D Pro Graphics (support.citrix.com)
ХenServer и XCP: PCI passthrough for paravirtualized guests on Citrix XenServer without an IOMMU (ogris.de/howtos)
XCP: Исправление бага с XenCenter для XCP(gossamer-threads.com)

Напоследок добавлю, что во время написания данной статьи из-под одной машины моя девушка сидела рядом, играя в Skyrim на другой без всяких лагов и тормозов на высоких (частично ультра) настройках графики. Под столом стоит один системник, который экономит место и деньги, на столе два монитора.
Tags:
Hubs:
+48
Comments 32
Comments Comments 32

Articles