Pull to refresh

Проброс видеокарты в KVM из под ubuntu

Reading time 4 min
Views 76K

Предистория


Года два назад я решил перейти полностью на линукс, но необходимость в венде не упала, поэтому всегда держал у себя 2 операционные системы. Около месяца назад попробовал поставить VirtualBox и на нее установить Windows, в общем то работать с 2мя операционными системами мне понравилось, но была одна проблема, я программирую исключительно компьютерную графику и мне нужна была поддержка OpenGL 3.3 и выше, к сожалению VirtualBox не предоставлял мне такой возможности. Погуглив наткнулся на такую штуку как Xen, долго пытался что-то сделать на ней, в итоге ничего не вышло, скорее всего из-за основной видеокарты — nVidia GeForce 580 GTX, гипервизор попросту не хотел запускать даже убунту, не говоря уже об виндовсе. Начал искать другие гипервизоры, и наткнулся на KVM, с ним пришлось повозиться, но в конце концов все заработало.

Конфигурация


Итак, нам понадобится:
  • Процессор с поддержкой виртуализации (в Intel — это VT-d, в AMD — AMD-Vi). Важно: чипсет тоже дожен поддерживать эту технологию
  • Материнская плата с блоком управления памятью ввода/вывода(IOMMU)
  • Две видеокарты, для гостевой ОС желательно использовать AMD видеокарту, т.к. с ней проблем не должно быть. Видеокарты NVidia не работают.

Моя конфигурация:
  • Процессор AMD Phenom II x4
  • Материнская плата ASUS M5A99X EVO R2.0
  • Видеокарта для Ubuntu: NVidia GeForce 580 GTX
  • Видеокарта для гостевой ОС: AMD Radeon HD 5800


Подготовка


Для начала следует перезагрузиться в биос и включить IOMMU. Чтобы проверить работает ли IOMMU для AMD:

dmesg | grep -iE "(IOMMU|AMD-Vi)"

или для Intel:

dmesg | grep -iE "(IOMMU|VT-d)"

Теперь нужно включить iommu в grub. Открываем /etc/default/grub, ищем GRUB_CMDLINE_LINUX, приводим к виду:

GRUB_CMDLINE_LINUX="max_loop=64 iommu=pt iommu=1 amd_iommu=fullflush"

Таким образом мы увеличиваем количество LOOP устройств, включаем поддержку IOMMU для AMD. Если у вас при загрузке операционной системы все стало сплющенным (обычно это из-за 2х видеокарт), то к предыдущей строке добавьте nomodeset, получим:

GRUB_CMDLINE_LINUX="nomodeset max_loop=64 iommu=pt iommu=1 amd_iommu=fullflush"

Так же, для уменьшения глюков, можно запретить скачивание драйверов от AMD (если у вас обе видеокарты от AMD, то не стоит этого делать) добавив их в blacklist. Открываем /etc/modprobe.d/blacklist.conf и добавляем следующее:

blacklist fglrx
blacklist radeon

Теперь нужно подготовить видеокарту для проброса, отключив ее от драйвера на хосте и подключив к pci-stub. Для выбора нашей карты вводим lspci и ищем нашу карту:

02:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Cypress PRO [Radeon HD 5850]
02:00.1 Audio device: Advanced Micro Devices [AMD] nee ATI Cypress HDMI Audio [Radeon HD 5800 Series]

в моем случае это 02:00.0 и 02:00.1. 02:00.1 — это звуковой чип. Видеокарта видна как видео и аудио, поэтому их стоит переносить вместе.
Затем, нам нужны vendor id и device id. посмотреть можно запустив lspci с ключем -n

02:00.0 0300: 1002:6899
02:00.1 0403: 1002:aa50

теперь подключим наши устройства к pci-stub. Видеокарта:

echo "1002 6899" > /sys/bus/pci/drivers/pci-stub/new_id
echo "0000:02:00.0" > /sys/bus/pci/devices/0000\:02\:00.0/driver/unbind
echo "0000:02:00.0" > /sys/bus/pci/drivers/pci-stub/bind

обратите внимание, в между VendorID и DeviceID не ставится двоеточие.
Звуковая карта:

echo "1002 aa50" > /sys/bus/pci/drivers/pci-stub/new_id
echo "0000:02:00.1" > /sys/bus/pci/devices/0000\:02\:00.1/driver/unbind
echo "0000:02:00.1" > /sys/bus/pci/drivers/pci-stub/bind

для удобства, можно написать скрипт и добавить его в автозапуск.

Показать скрипт
#!/bin/bash

hostgr="0000:02:00.0"
hostau="0000:02:00.1"
grid="1002 6899"
auid="1002 aa50"

#
echo $grid > "/sys/bus/pci/drivers/pci-stub/new_id"
echo $hostgr > "/sys/bus/pci/devices/$hostgr/driver/unbind"
echo $hostgr > "/sys/bus/pci/drivers/pci-stub/bind"

echo $auid > "/sys/bus/pci/drivers/pci-stub/new_id"
echo $hostau > "/sys/bus/pci/devices/$hostau/driver/unbind"
echo $hostau > "/sys/bus/pci/drivers/pci-stub/bind"

Установка


Для начала вам нужно установить несколько пакетов:

sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils

это установка на сервер без гуи, для удобной работы с kvm установим также virt-manager:

sudo apt-get install virt-manager

После этого в меню должен появится пункт «Менеджер виртуальных машин» (Virtual Machine Manager)
Далее передадим модулю kvm опцию allow_unsafe_assigned_interrupts=1. Создаем файл в /etc/modprobe.d/kvm.conf с содержанием и перезагружаем моудль.

options kvm allow_unsafe_assigned_interrupts=1

Далее запускаем virt-manager, появится окно:

image

Нажимаем правой кнопкой по localhost и выбираем New либо жмем на мониторчик слева в панели. Далее по инструкции создаем виртуальную машину. После установки системы можно пробрасывать нужные нам устройства. Войдите в меню View->Details. Должно появиться такое окно:

image

Жмем на кнопку Add hardware, выбираем PCI Host Device, и ищем нашу видеокарту. Тоже самое стоит проделать и со звуковым чипом от видеокарты. Таким же образом можно пробросить USB хосты, чтобы они заработали, стоит указать в Controller USB в поле Model: USB2.
При запуске в устройствах компьютера должен появиться наш адаптер:

image

Следущее что нам нужно сделать — это скачать драйвер. Скачиваем с сайта производителя и устанавливаем его в систему. У меня при попытке установить драйвер система отчаяно уходила в BSOD, решил я эту проблему установкой более новой винды. Также можно попробовать установить драйвер через диспетчер устройств, но у меня он просто напросто зависал.
Для завершения выключаем виртуальную машину и производим перезагрузку компьютера, если этого не сделать, при повторном запуске система может уйти в BSOD.
На данный момент, kvm при повторном запуске гостя с проброшенной видеокартой вешает всю систему, поэтому, если вы выключили виртуалку, то придется так же перезагружать весь компьютер.

Итог


Теперь, после старта консоль виртуальной машины отключится после загрузки драйвера видеокарты, в случае Windows 7 там остается картинка «Starting Windows», но само изображение должно уже выводится на проброшенную видеокарту. Хотя на коносль и не будет выводится изображение, тем не менее она будет передавать данные от устройств ввода и можно будет управлять гостем с клавиатуры и мыши как обычную виртуалку.
Цепляем второй монитор к проброшенной видеокарте, и любуемся проделанной работой.
На последок скриншот оценки производительности системы:

image

Источники


help.ubuntu.com/community/KVM
www.linux.org.ru/wiki/en/Проброс_видеокарты_в_виртуальную_машину
Tags:
Hubs:
+33
Comments 20
Comments Comments 20

Articles