Проброс видеокарты в Xen, из-под Ubuntu

в 19:48, , рубрики: amd, iommu, passthrough, Ubuntu, windows, xen, виртуализация, проброс видеокарты, метки: , , , , , , ,

Предыстория

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

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

Материнская плата ASRock 990FX Extreme3
Процессор AMD FX-8120 8х4.0 ГГц
RAM 2х4 ГБ 1600 МГц
Видеокарта Gigabyte Radeon HD 5450 Silent 1024Mb 64bit
Видеокарта HIS Radeon HD 6670 1GB GDDR5
SATA3 SSD для основной системы
USB 3.0 HDD для машины, в которую будем пробрасывать видеокарту

USB HDD потому, что там больше места, а скорости USB 3.0 вполне хватает.

Программная часть

Основная система Ubuntu 12.10 x64 (ядро 3,6-rc1)
Пробрасывать будем в Windows 7/8 x64 — не важно, проверялись обе.
Виртуализацию обеспечит последний Xen 4.1, который есть в репозитории (сегодня утром пришло обновление, которое позволяет запустить Xen на процессорах с архитектурой Bulldozer, до этого он безнадежно падал при старте).

Подготовка

Я сам любитель максимально простых примеров, поэтому буду весьма краток и прост.
И ещё замечание — инструкция подходит для платформы AMD, для Intel есть некоторые отличия с аппаратной виртуализацией, так как соответствующего железа нет — проверить не могу.

Для начала нужно посмотреть в BIOS, чипсеты AMD 89x и AMD 99x должны поддерживать IOMMU, если есть такая опция в BIOS и она отключена — обязательно включите, иначе ничего не получится.

Далее установим Xen и необходимые компоненты:

$ sudo apt-get install xen-hypervisor-4.1-amd64 xen-tools xenwatch qemu-utils

Этого будет достаточно.
Подправим конфигурационный файл /etc/xen/xend-config.sxp для того, чтобы работала сеть. Раскомментируем строку:

# (network-script network-bridge)

Далее нужно подправить команды загрузки ядер. Открываем /etc/default/grub, ищем GRUB_CMDLINE_LINUX, приводим к виду:

GRUB_CMDLINE_LINUX="max_loop=64 iommu=pt iommu=1 amd_iommu=fullflush pciback.hide=(04:00.0)(04:00.1)"

Таким образом мы увеличиваем количество LOOP устройств, включаем поддержку IOMMU для AMD, и отключаем вторую видеокарту, резервируя её для Windows.

Подробнее об видеокарте. Нужно посмотреть, куда какая карта вставлена, к примеру, как это выглядит у меня:

Скрытый текст

$ lspci
00:00.0 Host bridge: Advanced Micro Devices [AMD] nee ATI RD890 PCI to PCI bridge (external gfx0 port B) (rev 02)
00:00.2 IOMMU: Advanced Micro Devices [AMD] nee ATI RD990 I/O Memory Management Unit (IOMMU)
00:02.0 PCI bridge: Advanced Micro Devices [AMD] nee ATI RD890 PCI to PCI bridge (PCI express gpp port B)
00:05.0 PCI bridge: Advanced Micro Devices [AMD] nee ATI RD890 PCI to PCI bridge (PCI express gpp port E)
00:0a.0 PCI bridge: Advanced Micro Devices [AMD] nee ATI RD890 PCI to PCI bridge (external gfx1 port A)
00:0b.0 PCI bridge: Advanced Micro Devices [AMD] nee ATI RD890 PCI to PCI bridge (NB-SB link)
00:11.0 SATA controller: Advanced Micro Devices [AMD] nee ATI SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] (rev 40)
00:12.0 USB controller: Advanced Micro Devices [AMD] nee ATI SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
00:12.2 USB controller: Advanced Micro Devices [AMD] nee ATI SB7x0/SB8x0/SB9x0 USB EHCI Controller
00:13.0 USB controller: Advanced Micro Devices [AMD] nee ATI SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
00:13.2 USB controller: Advanced Micro Devices [AMD] nee ATI SB7x0/SB8x0/SB9x0 USB EHCI Controller
00:14.0 SMBus: Advanced Micro Devices [AMD] nee ATI SBx00 SMBus Controller (rev 42)
00:14.1 IDE interface: Advanced Micro Devices [AMD] nee ATI SB7x0/SB8x0/SB9x0 IDE Controller (rev 40)
00:14.2 Audio device: Advanced Micro Devices [AMD] nee ATI SBx00 Azalia (Intel HDA) (rev 40)
00:14.3 ISA bridge: Advanced Micro Devices [AMD] nee ATI SB7x0/SB8x0/SB9x0 LPC host controller (rev 40)
00:14.4 PCI bridge: Advanced Micro Devices [AMD] nee ATI SBx00 PCI to PCI Bridge (rev 40)
00:14.5 USB controller: Advanced Micro Devices [AMD] nee ATI SB7x0/SB8x0/SB9x0 USB OHCI2 Controller
00:16.0 USB controller: Advanced Micro Devices [AMD] nee ATI SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
00:16.2 USB controller: Advanced Micro Devices [AMD] nee ATI SB7x0/SB8x0/SB9x0 USB EHCI Controller
00:18.0 Host bridge: Advanced Micro Devices [AMD] Family 15h Processor Function 0
00:18.1 Host bridge: Advanced Micro Devices [AMD] Family 15h Processor Function 1
00:18.2 Host bridge: Advanced Micro Devices [AMD] Family 15h Processor Function 2
00:18.3 Host bridge: Advanced Micro Devices [AMD] Family 15h Processor Function 3
00:18.4 Host bridge: Advanced Micro Devices [AMD] Family 15h Processor Function 4
00:18.5 Host bridge: Advanced Micro Devices [AMD] Family 15h Processor Function 5
01:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Cedar PRO [Radeon HD 5450/Radeon HD 6350]
01:00.1 Audio device: Advanced Micro Devices [AMD] nee ATI Cedar HDMI Audio [Radeon HD 5400/6300 Series]
02:00.0 USB controller: Etron Technology, Inc. EJ168 USB 3.0 Host Controller (rev 01)
03:00.0 Ethernet controller: Broadcom Corporation NetLink BCM57781 Gigabit Ethernet PCIe (rev 10)
04:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Turks [Radeon HD 6670]
04:00.1 Audio device: Advanced Micro Devices [AMD] nee ATI Turks/Whistler HDMI Audio [Radeon HD 6000 Series]

Нас интересуют строчки:

01:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Cedar PRO [Radeon HD 5450/Radeon HD 6350]
01:00.1 Audio device: Advanced Micro Devices [AMD] nee ATI Cedar HDMI Audio [Radeon HD 5400/6300 Series]
...
04:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Turks [Radeon HD 6670]
04:00.1 Audio device: Advanced Micro Devices [AMD] nee ATI Turks/Whistler HDMI Audio [Radeon HD 6000 Series]

Первые две соответствуют видеокарте, которую мы оставим Ubuntu, а две последние отдадим Windows. Две — потому что видеокарта видна как видео и аудио устройство одновременно, поэтому и носить/переносить их нужно вместе. В начале строки цифры, которые нужно вписать в опции загрузки ядра. Они скроют от Ubuntu вторую видеокарту.

Собственно, подготовка завершена, если вы успешно загрузились, выбрав ядро из подраздела «Xen 4.1-amd64» во время загрузки. Если хотите, чтобы подраздел был первым в списке — переименуйте файл

/etc/grub.d/20_linux_xen

в

/etc/grub.d/09_linux_xen

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

Для установки нужен образ жесткого диска. Создаем:

$ dd if=/dev/zero of=/media/Windows/HDD bs=1G count=90

Файл диска объемом 90 ГБ будет создан в директории /media/Windows, где и будет лежать виртуальная машина.

Создаем в той же директории файл конфигурации config.cfg следующего содержания:

kernel = "/usr/lib/xen-4.1/boot/hvmloader"
builder = 'hvm'
vif = [ 'type=ioemu,bridge=eth0,ip=assigned-ip,mac=22:61:34:00:00:01' ]
address = 'assigned-ip'
netmask = '255.255.255.XXX'
memory = 1024
shadow_memory = 8
name = «windows»
cdrom = 'file:/media/Archive/Windows.iso'
disk = [ 'file:/media/Windows/HDD,hdc,w', 'file:/media/Archive/Windows.iso,hdb:cdrom,r' ]
device_model = '/usr/lib/xen-4.1/bin/qemu-dm'

# boot on floppy (a), hard disk © or CD-ROM (d)
# default: hard disk, cd-rom, floppy
#### boot must be dc to install windows after that you change it to c or cd
boot = «dc»
#boot = «c»

vnc = 1 # use VNC to insall and setup windows after that is done you can disable this
vncconsole = 0
vncpasswd = ''
vncviewer = 1
vncunused = 1
vnclisten = '127.0.0.1'
vcpus = 2
stdvga = 0
serial = 'pty'
usbdevice = 'tablet'
on_reboot = 'restart'
on_crash = 'restart'

#pci=['04:00.0', '04:00.1']

/media/Archive/Windows.iso — путь к образу установочного DVD c Windows
vnclisten = '127.0.0.1' — слушаем локальный компьютер, с которого и будем заходить на виртуальную машину
memory = 1024 — оперативная память для машины в МБ
vcpus = 2 — количество ядер процессора
name = «windows» — название так называемого домена виртуальной машины, по нему можно будет отличить её от остальных.
pci=['04:00.0', '04:00.1'] — подключаем нашу зарезервированную видеокарту, но пока оставляем строчку закомментированной

Пробуем запустить, получилось ли у нас что-то.

$ sudo xm create /media/Windows/config.cfg
Using config file "/media/Windows/config.cfg".
Started domain windows (id=12)

Вывод должен быть аналогичным. Посмотрим на все запущенные под гипервизором ОС:

$ sudo xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  7007     8     r-----   6881.3
windows                                     12  1024     2     -b----     32.1

Подключаемся к машине по VNC, например, через Remina, которая есть по умолчанию в последних версиях Ubuntu.

Проброс видеокарты в Xen, из под Ubuntu

Сохраним для экономии времени в будущем.
Сразу же после подключения мы видим программу установки Windows. После перезагрузок Remina может обрывать соединение — просто подключайтесь снова. После установки (там всё банально) установите свежие драйвера для вашей видеокарты, и выключайте Windows.
Правим конфигурационный файл, раскомментируем последнюю строчку с видеокартой, запускаем виртуальную машину снова. Если картинка застыла, и на втором мониторе (оптимально иметь два монитора под рукой — по одному для каждой ОС) долго ничего нет — делаем reset:

$ sudo xm reset windows

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

Проброс видеокарты в Xen, из под Ubuntu

Звука не было — аналогичным образом пробросил один из usb-хабов с USB звуковой картой — и заработало.
Windows 8 проверять индексы производительности не захотела, а Windows 7 показала 7.1 для 3D и 7.1 для 2D. Игры, само собой, работают)

Проброс видеокарты в Xen, из под Ubuntu

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

$ sudo xm create /media/Windows/config.cfg
$ sudo xm start windows
$ sudo xm shutdown -w windows
$ sudo xm start windows

Источники вдохновения и информации:
http://help.ubuntu.ru/wiki/xen
http://umvirt.ru/node/69
http://www.virtualmin.com/documentation/cloudmin/windows
http://wiki.prgmr.com/mediawiki/index.php/Appendix_B:_The_Structure_of_the_Xen_Config_File

Автор: nazarpc


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js