Проброс видеокарты в виртуальную машину KVM на примере AMD HD6770

В прошлой статье "Проброс видеокарты" было рассказано о устройствах поддерживающих проброс и о их работе в виртуальном окружении. В данной статье рассмотрим процесс проброса видеокарты Sapphire AMD HD6770 в Ubuntu 12.04 (LinuxMint Maya).  В качестве тестового стенда используется узел UmVirt.

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

Прежде чем приступать к пробросу видеокарты необходимо проверить, что функция проброса вообще работает на оборудовании. Для этого можно осуществить проброс менее сложного устройства в виртуальную машину, например контроллера USB или встроенной звуковой карты. Только если проброс менее сложного устройства осуществлен успешно, можно переходить на проброс видеокарты, в противном случае обнаружить ошибку в настройках будет достаточно сложно. Процесс проброса PCI-устройства описан в статье "Первый тестовый проброс устройств на ASUS M5A97PRO".

Видеокарта Sapphire AMD HD6770 (вендор принципиального значения не имеет, главное чип) была выбрана по той причине что она обладает сравнительно невысокой ценой и по той причине что уже мимеются примеры её проброса в KVM в Fedora  (http://tavi-tech.blogspot.com/). 

Особенности

1. Аварийность

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

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

К тому же в виртуальной машине драйвера работает не везде и не сразу так как виртуальное окружение всетаки немного отличается от реального.

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

2. Экран 

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

Существуют альтернативные клиенты удаленного доступа позволяющие просматривать видео и 3D-графику например Citrix GoToMyPC и TeamViewer. Данные клиенты закрыты и передают трафик через свои сервера что негативно сказывается на скорости и конфиденциальности.

Как вариант можно рассматривать и аппаратные решения. Компания Terradici предагает PCI-карты удаленного доступа (host card), которые могут обеспечивать аппаратное кодирование видео и передавать его по сети по закрытому протоколу PCoIP. 

Настройка хоста

В тестовом стенде видеокарта установлена в качестве основной. Работа с узлом виртуализации осуществляется по сети через протоколы SSH и SPICE. Удаленный доступ по протоколу SPICE обеспечивает виртуальный видеоадаптер QXL.

В /etc/default/grub устанавливаем параметры загрузки AMD IOMMU (если у вас Intel VT-d то синтаксис будет другой):
GRUB_CMDLINE_LINUX="iommu=pt iommu=1"

Настраиваем Libvirt. Устанавим следующие параметры в файл /etc/libvirt/qemu.conf для обеспечения ппривелигированной работы с железом:
user = "root"
group = "root"
clear_emulator_capabilities = 0

Для того чтобы разрешиь не безопасные прерывания в папке /etc/modprobe.d/ создаем файл kvm_iommu_map_guest.conf и добавляем в него строчку:
options kvm allow_unsafe_assigned_interrupts=1

Хост готов к работе. Теперь можно создать виртуальную машину например на базе PartedMagic и осуществить просмотр устройств виртуальной машины. После проверки проброса в тестовой виртуальной машине, можно приступать к пробросу в виртуальную машину под управлением Microsoft Windows.

Настройка виртуальной машины Windows

Рассмотрим виртуальную машину под управлением Microsoft Windows 7. После проброса в списке устройств должен появиться видеоадаптер.

Прежде чем приступить к установке драйверов видеокарты необходимо установить VNC-сервер например TightVNC и проверить его работу. 

Затем устанавливаем драйверы с диска поставляемого с видеокартой. Во время установки выбираем пользовательский режим и устанавливаем только драйвера без CCC (Catalyst Control Center). После установки драйверов потребуется перезагрузка.

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

Осуществим удаленный доступ к экрану через VNC, осуществим проверку производительности и просмотрим видео. Как можно заметить VNC значительно уступает SPICE и не подходит для воспрозведения видео, но тем не менее позволяет осуществлять запуск приложений требующих наличие аппаратного ускорения.

Как можно увидеть Windows автоматически включает оформление Aero в случае если оценка производительности  проходит успешно.

Заключение

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

Таким образом использовать виртуализацию с помощью KVM для создания рабочих мест с базовым функционалом можно уже сегодня и бесплатно, но если потребуется работа с 3D графикой то придется пробовать использовать проброс другой видеокарты, имеющей официальную поддержку, или же переходить на платное решение.