Предистория
Года два назад я решил перейти полностью на линукс, но необходимость в венде не упала, поэтому всегда держал у себя 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
звуковая карта:
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
Установка
Для начала вам нужно установить несколько пакетов:
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, появится окно:
Нажимаем правой кнопкой по localhost и выбираем New либо жмем на мониторчик слева в панели. Далее по инструкции создаем виртуальную машину. После установки системы можно пробрасывать нужные нам устройства. Войдите в меню View->Details. Должно появиться такое окно:
Жмем на кнопку Add hardware, выбираем PCI Host Device, и ищем нашу видеокарту. Тоже самое стоит проделать и со звуковым чипом от видеокарты. Таким же образом можно пробросить USB хосты, чтобы они заработали, стоит указать в Controller USB в поле Model: USB2.
При запуске в устройствах компьютера должен появиться наш адаптер:
Следущее что нам нужно сделать — это скачать драйвер. Скачиваем с сайта производителя и устанавливаем его в систему. У меня при попытке установить драйвер система отчаяно уходила в BSOD, решил я эту проблему установкой более новой винды. Также можно попробовать установить драйвер через диспетчер устройств, но у меня он просто напросто зависал.
Для завершения выключаем виртуальную машину и производим перезагрузку компьюетра, если этого не сделать, при запуске будет вывалваться BSOD.
На данный момент, kvm при повторном запуске гостя с проброшенной видеокартой вешает всю систему, поэтому, если вы выключили виртуалку, то придется так же перезагружать весь компьютер.
Итог
Теперь, после старта консоль виртуальной машины отключится после загрузки драйвера видеокарты, в случае Windows 7 там остается картинка «Starting Windows», но само изображение должно уже выводится на проброшенную видеокарту. Хотя на коносль и не будет выводится изображение, тем не менее она будет передавать данные от устройств ввода и можно будет управлять гостем с клавиатуры и мыши как обычную виртуалку.
Цепляем второй монитор к проброшенной видеокарте, и любуемся проделанной работой.
На последок скриншот оценки производительности системы:
Источники
help.ubuntu.com/community/KVM
www.linux.org.ru/wiki/en/Проброс_видеокарты_в_виртуальную_машину
Автор: sys_int64