Full-stack web developer, love Open Source
–0,1
рейтинг
10 августа 2012 в 23:48

Администрирование → Проброс видеокарты в Xen, из-под Ubuntu tutorial

Предыстория


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

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


Материнская плата 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 qemu-common

Этого будет достаточно.
Подправим конфигурационный файл /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 xen-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.



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

$ sudo xm reset windows

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



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



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

$ 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

UPD:
Пишу из-под Windows, поставил другую сборку, она согласилась выдать оценку системы:



Дал ядра и 2 ГБ RAM.
Система пустая, драйвера стоковые (дата на видео драйвере 19.06.2012 версия 8.97.10.6).
Назар Мокринский @nazarpc
карма
28,0
рейтинг –0,1
Full-stack web developer, love Open Source
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (18)

  • +1
    Для создания новых файлов можно использовать не dd, а либо truncate, либо fallocate — будет много быстрее.
    • 0
      Спасибо, учту в будущем
  • 0
    А есть возможность проделать такое на Citrix Xen? Насколько я помню, там GPU-passthru только в Enterprise версии, а проброс PCI стандартными методами невозможен.
    • +1
      Способ в итоге нашелся. Пример для ситуации, когда VGA висит на 01:00.0 по lspci:
      1. В /boot/extlinux.conf pciback.hide=(01:00.0) в параметры для xe. Выглядеть строчка append будет примерно так:
      append /boot/xen.gz mem=1024G dom0_max_vcpus=4 dom0_mem=752M lowmem_emergency_pool=1M crashkernel=64M@32M console= vga=mode-0x0311 --- /boot/vmlinuz-2.6-xen root=LABEL=root-hmjtkmgt ro xencons=hvc console=hvc0 console=tty0 quiet vga=785 splash pciback.hide=(01:00.0) --- /boot/initrd-2.6-xen.img

      2. Из консоли выполнить такую команду:
      xe vm-param-set other-config:pci=0/0000:01:00.0 uuid=[id вашей виртуалки, куда идет проброс]

      Только вот теперь у меня затык в другом. Не удалось заставить одновременно работать встроенную и внешнюю видеокарты. Видимо, проблема в том, что встроенная от AMD, а внешняя от Nvidia.
      • 0
        То есть вы обе пробрасываете?
        Я і оставил встроенную для основной системы, в вторую пробрасывал бы.
        • 0
          Если у вас установлена виртуальная карта QXL с XSPICE-сервером, то можно работать удалено c хостом через протоколы SPICE и SSH и пробрасывать основную видеокарту.

          habrahabr.ru/post/147185/
        • 0
          Нет, я хочу, чтобы было так, как вы и описали. Но при установленной в pci карте встроенная отключается.
          • 0
            Так это в BIOS должно настраиваться. Поставьте первой в приоритете интегрированную графику для хоста.
            • 0
              На подопытной материнке, к сожалению, не переключается. Там вообще минимум настроек по встроенной графике.
              • 0
                Тогда, может, там и аппаратная виртуализация не поддерживается?
                • 0
                  Не, виртуализация там отлично работает. Собственно, это мой домашний сервер, где уже давно крутятся несколько виртуалок.
                  • 0
                    Для проброса видеокарты нужна поддержка IOMMU.
                    Или, если есть куда, вставить самую дешевую вторую видеокарту для хоста. У меня так HD5450 стоит c пассивным охлаждением.
  • 0
    На днях успешно пробросил видеокарту AMD HD 6770 через KVM с помощью libvirt в Ubuntu 12.04 (стоковое ядро) на ASUS M5A97PRO.

    У меня три вопроса:

    1. У вас все стабильно все работает после перезапуска средствами гипервизора виртуальной машины с проброшенной ведеокартой?

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

    2. У кого-нибудь есть какие-нибудь мысли о том как к виртуальной машине получить качественный удаленный доступ со звуком и 3D?

    У видеокарты после проброса используется для вывода её выходы, а консоль виртуальной машины остается не востребованной (там висит логотип Windows).

    Пробовал осуществить удаленный доступ через TightVNC и стандартный RDP сервер Windows 7:
    • TightVNC — тормозит видео, нет звука (Звук и USB-переадресацию можно получить через параллельно запущенного SPICE-клиента)
    • RDP — не порддерживает 3D.

    3. Возможно ли в Windows 7 осуществлять клонирование экрана на несколько видеокарт? А то что-то только одна видеокарта видна.
    • 0
      1. Да, перезапускал много раз разными способами — всё работает стабильно. На сколько я знаю — Xen вообще положить нужно постараться. Тоже стоит открытый драйаер radeon.

      2. Пока нет, сегодня буду пробовать

      3. Должно работать, вы две видеокарты пробросили? Если так — то как появится у меня третья, тоже попробую.
      • 0
        > Да, перезапускал много раз разными способами — всё работает стабильно. На сколько я знаю — Xen вообще положить нужно постараться. Тоже стоит открытый драйаер radeon.

        Xen — хорош, но у меня некоторые машины на SPICE завязаны, привык работать со звуком, пробросом USB-устройств и другими фичами. Попробую копать в сторону обновления ядра. Со времен 3.2.0 в ядре Linux возможно многое изменилось с точки зрения поддержки проброса устройств.

        > Должно работать, вы две видеокарты пробросили?

        Я пробросил одну видеокарту, вторая эмулируется гипервизором для вывода информации через SPICE-клиента, обычно это cirrus или qxl.

        Xen тоже эмлирует видеокарту и выдает её вывод через VNC. У вас же тоже через консоль VNC вывод проброшенной видеокарты не осуществляется?

        Как-то странно получается одна из двух видеокарт постоянно отключена:
        • Без установленных драйверов проброшенной видеокарты:
        • С установленными драйверами проброшенной видеокарты:

        А так хотелось бы редирект вывода сделать чтобы через SPICE-клиента работать с другого компьютера. На ноутбуках же делается редирект с интегрированной карточки на дискретную, пользователю же не приходится кабель монитора перетыкать.
        • 0
          У вас же тоже через консоль VNC вывод проброшенной видеокарты не осуществляется?

          Нет, в VNC смотрит видеокарта, которую эмулирует Xen, а при пробрасывании там вообще картинка застывает.
          У меня в мониторе два видеовхода — переключаюсь между видеокартами. Только USB переставлять вручную приходится (мышь, наушники, клава) — хочу сделать рычажок для переключения между USB хабом в хосте и проброшенным. Если получится — будет полноценная работа двух ОС одновременно.
  • 0
    В линуксе звук нужно отдельно прокидывать, через pulse audio. OpenGL и кино через X'ы можно сделать, но будет тормозить и грузить процессор.
  • 0
    А вот я, помнится, так и не смог пробросить свою видеокарту. Правда это была NVIDIA 9800 GTX. Дело было в Gentoo, года 2 назад. В wiki и на сайте Xen прочитал, что passthrough работает (работал на тот момент) с весьма ограниченным числом видеокарт, часть из которых Intel.

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