Года два назад я решил перейти полностью на линукс, но необходимость в венде не упала, поэтому всегда держал у себя 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:
1
|
dmesg
|
grep
-
iE
"(IOMMU|AMD-Vi)"
|
Или для Intel:
1
|
dmesg
|
grep
-
iE
"(IOMMU|VT-d)"
|
Теперь нужно включить iommu в grub. Открываем /etc/default/grub, ищем GRUB_CMDLINE_LINUX, приводим к виду:
1
|
GRUB_CMDLINE_LINUX
=
"max_loop=64 iommu=pt iommu=1 amd_iommu=fullflush"
|
Таким образом мы увеличиваем количество LOOP устройств, включаем поддержку IOMMU для AMD. Если у вас при загрузке операционной системы все стало сплющенным (обычно это из-за 2х видеокарт), то к предыдущей строке добавьте nomodeset, получим:
1
|
GRUB_CMDLINE_LINUX
=
"nomodeset max_loop=64 iommu=pt iommu=1 amd_iommu=fullflush"
|
Так же, для уменьшения глюков, можно запретить скачивание драйверов от AMD (если у вас обе видеокарты от AMD, то не стоит этого делать) добавив их в blacklist. Открываем /etc/modprobe.d/blacklist.conf и добавляем следующее:
1
2
|
blacklist
fglrx
blacklist
radeon
|
Теперь нужно подготовить видеокарту для проброса, отключив ее от драйвера на хосте и подключив к pci-stub. Для выбора нашей карты вводим lspci и ищем нашу карту:
1
2
|
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
1
2
|
02
:
00.0
0300
:
1002
:
6899
02
:
00.1
0403
:
1002
:
aa50
|
Теперь подключим наши устройства к pci-stub. Видеокарта:
1
2
3
|
echo
"1002 6899"
&
gt
;
/
sys
/
bus
/
pci
/
drivers
/
pci
-
stub
/
new_id
echo
"0000:02:00.0"
&
gt
;
/
sys
/
bus
/
pci
/
devices
/
0000
:
02
:
00.0
/
driver
/
unbind
echo
"0000:02:00.0"
&
gt
;
/
sys
/
bus
/
pci
/
drivers
/
pci
-
stub
/
bind
|
Обратите внимание, в между VendorID и DeviceID не ставится двоеточие.
Звуковая карта:
1
2
3
|
echo
"1002 aa50"
&
gt
;
/
sys
/
bus
/
pci
/
drivers
/
pci
-
stub
/
new_id
echo
"0000:02:00.1"
&
gt
;
/
sys
/
bus
/
pci
/
devices
/
0000
:
02
:
00.1
/
driver
/
unbind
echo
"0000:02:00.1"
&
gt
;
/
sys
/
bus
/
pci
/
drivers
/
pci
-
stub
/
bind
|
Для удобства, можно написать скрипт и добавить его в автозапуск:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#!/bin/bash
hostgr
=
"0000:02:00.0"
hostau
=
"0000:02:00.1"
grid
=
"1002 6899"
auid
=
"1002 aa50"
#
echo
$
grid
&
gt
;
"/sys/bus/pci/drivers/pci-stub/new_id"
echo
$
hostgr
&
gt
;
"/sys/bus/pci/devices/$hostgr/driver/unbind"
echo
$
hostgr
&
gt
;
"/sys/bus/pci/drivers/pci-stub/bind"
echo
$
auid
&
gt
;
"/sys/bus/pci/drivers/pci-stub/new_id"
echo
$
hostau
&
gt
;
"/sys/bus/pci/devices/$hostau/driver/unbind"
echo
$
hostau
&
gt
;
"/sys/bus/pci/drivers/pci-stub/bind"
|
Установка
Для начала вам нужно установить несколько пакетов:
1
|
sudo
apt
-
get
install
qemu
-
kvm
libvirt
-
bin
ubuntu
-
vm
-
builder
bridge
-
utils
|
Это установка на сервер без гуи, для удобной работы с kvm установим также virt-manager:
1
|
sudo
apt
-
get
install
virt
-
manager
|
После этого в меню должен появится пункт "Менеджер виртуальных машин" (Virtual Machine Manager).
Далее передадим модулю kvm опцию allow_unsafe_assigned_interrupts=1. Создаем файл в /etc/modprobe.d/kvm.conf с содержанием и перезагружаем моудль.
1
|
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", но само изображение должно уже выводится на проброшенную видеокарту. Хотя на коносль и не будет выводится изображение, тем не менее она будет передавать данные от устройств ввода и можно будет управлять гостем с клавиатуры и мыши как обычную виртуалку.
Цепляем второй монитор к проброшенной видеокарте, и любуемся проделанной работой.
На последок скриншот оценки производительности системы:
Вам нравятся crm системы? Тогда рекомендую почитать о них на сайте terrasoft.ru.