Как в Linux пробросить видеокарту с хоста в гостевую виртуальную машину VirtualBox
Механизм проброса видеокарты на английском называется passthrough. Технология лет 7 существует, но до сих пор проще поставить системы параллельно. Поддержка метода развивается очень медленно и существует очень много ограничений. Я собрал и выложил теоретическую информацию которую смог найти. Пробросить свою видеокарту мне не удалось из-за отсутствия аппаратной поддержки.
Для проброса видеокарты с хоста в виртуальную машину VirtualBox нужно:
- Поддержка процессором или чипсетом материнской платы виртуализации VT-d (Intel Virtualization Technology for Directed I/O) или IOMMU у AMD.
- Поддержка видеокартой passtrough. Для старых видеокарт Nvidia заявлялось, что поддерживается линейками Quadro и Tesla. Попадается информация, что можно пробросить GTX 1050. Некоторые видеокарты можно патчить чтобы они видились как поддерживаемые. Для видеокарт AMD обозначают более широкую поддержку оборудования, но нужно проверять. В сети встречаются списки устройств которые удается пробросить, но единого перечня нет. На сайтах производителей GPU точной информации тоже нет.
- Вторая видеокарта. Одна будет работать на хосте, а вторая в ВМ (на хосте ее нельзя будет использовать).
- Виртуальная машина VirtualBox с включенной виртуализацией и установленной операционной системой 🙂
Перед пробросом нужно в BIOS хоста включить виртуализацию в настройках CPU и чипсета (если есть).
Для самого проброса потребуется произвести следующие действия:
- Узнать где на шине физически стоит требуемая видеокарта. В терминале вводим команду «lspci» и смотрим перечень устройств находящихся на PCI шинах. У меня две видеокарты расположены на 00:02.0 и 01:00.0.
00:02.0 Display controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
01:00.0 VGA compatible controller: NVIDIA Corporation GK208B [GeForce GT 710] (rev a1)
2. Пробросить видеокарту в виртуальную машину. Где NameVM — имя виртуальной машины, а 01:00.0 — расположение пробрасываемой видеокарты:
VBoxManage modifyvm «NameVM» —pciattach 01:00.0@01:05.0
Для отсоединения видеокарты нужно использовать команду:
VBoxManage modifyvm «NameVM» —pcidetach 01:00.0
Если вы хотите пробросить одну видеокарту, то вторую вам нужно в BIOS выбрать как основную. Иначе система не сможет пробросить в ВМ основную видеокарту и выведет ошибку доступа.
У меня пробросить не получилось в виду отсутствия у процессора поддержки инструкций VT-d. Встроенная видеокарта от Intel пробрасывалась, но должным образом не работала в виртуальной машине (ошибка 034). А проброс внешней Nvidia приводил к тому, что виртуальная машина отказывалась стартовать. Даже если бы она пробросилась — скорее всего не работала бы в виду ограничений от Nvidia.
Смотрел также в сторону VMWare Workstation — не поддерживает проброс. Поддерживают ESXi и vSphere, но не вижу смысла заморачиваться если можно пробросить в VirtualBox. В нем это делается гораздо проще, но нужно иметь подходящее железо.
Возможно, что вам понадобится еще включить IOMMU в ядре.
В /etc/default/grub заменить
После чего выполнить в терминале
Возможно, что также будет нужно отключить использование системой пробрасываемой видеокарты, но у некоторых работает и без этого.
Источник
Проброс видеокарты в виртуальную машину
Говорят, что современные аппаратные технологии поддержки виртуализации (VT-d у Intel, IOMMU у AMD) позволяют отдавать физическое устройство на шине PCI в непосредственное управление виртуальной машине. В том числе видеокарту.
Воображение рисует такую конфигурацию: настольный сервер с гипервизором, на нем запускается гостевая пользовательская операционная система, имеющая доступ к необходимым устройствам ввода-вывода, один-два неприхотливых сервера по мере надобности, ну и сколько надо виртуалок для бесчеловечных экспериментов. Управляем гипервизором через консоль в гостевой ОС либо удаленно, с ноутбука, скажем.
Вдохновленный этой картиной, я решил попробовать, но оказалось, что проброс (passthrough) видеоадаптера — задача не совсем тривиальная. Только месяца через три боданий с железом и чтения форумов удалось получить положительный результат. В качестве гипервизора пробовал VMware и Xen. Получилось только с Xen.
Коротко.
Железо:
- Материнская плата Gigabyte GA-Q67M-D2H-B3
Прошивка BIOS — F5
Setup: CPU->Intel Virtualization Technology=ON
Setup: Chipset->North Bridge->VT-d=ON - Процессор Intel Core i5 2500 3.3 GHz
- Память 16 GB
- ATI Radeon HD 3470 в первом слоте PCIe, используется гипервизором
- ATI Radeon HD 3450 во втором слоте PCIe, отдается гостевой ОС
- Сетевой адаптер Intel в слоте PCI
Софт:
- XCP (Xen Cloud Platform) 1.0 (XenServer build 42052c)
- Citrix XenCenter для управления
- Windows 7 64 bit в качестве гостевой ОС, ATI Catalyst 12.1
Поначалу я долго экспериментировал с VMware vSphere 5.0. Собственно, аппаратная конфигурация подбиралась именно под нее. По дороге открылся ряд интересных подробностей: например, VT-d должен поддерживаться и процессором (пишут, что процессоры с индексом K не годятся), и чипсетом и материнской платой. С видеокартами вообще беда: известно, что с большинством этот фокус не проходит, с некоторыми (довольно короткий список) у одних получается, у других нет. Долгое и содержательное (хотя не слишком радостное) обсуждение было тут:
VMware Communities: VMDirectPath and ATI Radeon. Radeon 3450 ходил, пожалуй, в фаворитах как одна из самых пробрасываемых карт.
Я перебрал приличное количество разнообразных комбинаций железа. В конкурсе участвовали две материнские платы, три видеокарты плюс интегрированное видео SandyBridge (IGD), три сетевых адаптера и один процессор. Несколько раз я бросал эти бесплодные попытки на неделю-другую, потом придумывались какие-то варианты. По дороге был один момент, когда почти получилось: виртуалка правильно определила монитор, но дальше дело не пошло. Уперся в то, что карта вроде бы нормально пробрасывалась в виртуалку, и в девайс менеджере показывалась ровно, но Каталист упорно отказывался иметь с ней дело. Карта как живая, но не работает.
Можно было попробовать много чего еще: Windows XP и Linux в качестве гостевых систем (ставил Windows 7 в 32 и 64-разрядном исполнении), добыть очередную видеокарту… В конце концов плюнул и решил зайти с другого конца, попробовав другой гипервизор. Не мудрствуя, взял то, что на виду: Xen в составе Xen Cloud Platform(XCP).
XCP поставился без сучка без задоринки.
На некоторое время поставил в тупик вопрос: как этой системой рулить? В смысле, должна же быть какая-нибудь консоль управления, желательно под винды? Поковырявшись полдня с условно-штатным OpenXenManager я пришел к мысли, что то ли лыжи не едут, то ли эта кроссплатформенная тулза на винде не живет. Один или два раза она сконнектилась с сервером, но померла где-то в процессе работы, остальные разы глухо висла при коннекте, сливая неудежимый поток исключений в консоль Питона.
К счастью, более широкий взгляд в окружающий интернет открыл мне, что Citrix XenCenter прекрасно может рулить opensource-ным Xen-ом, а сам вполне бесплатен. Правда, при коннекте кричит, что через N дней у вашего сервера истечет Evaluation period, но знающие люди пишут, что это он просто не в курсе насчет opensource редакции сервера, а на самом деле все будет работать.
XenCenter позволяет создавать-включать-гасить виртуалки, а проброс устройств надо настраивать из sysadmin-friendly интерфейса командной строки.
Против ожиданий, проблем тут не случилось. Сделал все по мануалу, и хватило его одного. Вот народ жалуется, что по Xen-у документации мало. Так другой раз и хорошо, что мало, если этого хватает. Сколько я по vSphere прочел, и все без толку… Впрочем, не хочу говорить дурных слов про vSphere. Под ней зато так железо настроилось, что Xen пролетел прямо со свистом.
Итак, с помощью XenCenter я организовал виртуалку о двух ядрах и 4 ГБ памяти, накатил туда седьмую 64-битную винду и пошел пробрасывать.
В соответстви с руководством правим /boot/extlinux.conf , вставляя строку «iommu=1 iommu_inclusive_mapping=1» после каждого вхождения «/boot/xen.gz»
Выполняем extlinux /boot .
Шаги, связанные с модулем pciback , пропускаем — пишут, что в шестерке он уже вкомпилирован в ядро.
Делаем xe vm-list и находим uuid нашей виртуалки, у меня uuid=d103a91d-5c38-844f-14d5-64b3c495eb08
Выполняем команду lspci и находим в выводе нашу карту, например 02:00.0 VGA compatible . 02:00.1 Audio… (двойка удивительным образом соответствует номеру слота, куда воткнута карта).
Записываем однострочный скрипт вида
xe vm-param-set other-config:pci=0/0000:02:00.0,0/0000:02:00.1 uuid=d103a91d-5c38-844f-14d5-64b3c495eb08
У меня на карте, помимо видеоадаптера, еще звук — поэтому, помня грабли, на которые наступал в vSphere, добавляю оба устройства: 0/0000:02:00.0, 0/0000:02:00.1.
Выполняем скрипт. Для контроля xe vm-param-list uuid=d103a91d-5c38-844f-14d5-64b3c495eb08 | more — действительно
Останавливаем и снова запускаем виртуалку (пишут, что именно так, а не ребутом — не стану проверять лишний раз).
При первой попытке карта у меня в первом слоте PCIe (01:00.0, 01:00.1) и по умолчанию используется гипервизором. После перезапуска виртуалки монитор гаснет.
В XenCenter (с ноутбука) заходим в консоль виртуалки и после логина в винду видим, что она просит ребута. Признак того, что она нашла новое устройство. Не будем ей отказывать. Ребут. Действительно, в Device Manager появился новый видеоадаптер Radeon 3450 с драйвером Microsoft WDDM 1.1. Из предыдущего опыта известно, что драйвер нужен родной. Качаю и ставлю свежий ATI Catalist 12.1, тот после установки, как обычно просит ребута. Ребут… опаньки. Первая попытка накрывается медным тазом: падает гипервизор. Да… vSphere в такой ситуации одерживала убедительную победу над виртуалкой, устраивая ей BSOD.
Перепускаем хост и, по рекомендации лучших собаководов, смотрим, что пишет нам команда
dmesg . Пишет она, помимо прочего, такое:
pciback 0000:01:00.1: secondary bus reset failed for device — all functions need to be co-assigned — err: 6
pciback 0000:01:00.1: FLR functionality not supported; attempts to use secondary bus reset unsuccessful;
pciback 0000:01:00.1: FLR not performed for device
Похоже, что передача карты на горячую нам не светит. Ладно. Дадим гипервизору свой VGA адаптер, благо видеокарт мне теперь хватает. Переставляем Radeon 3450 во второй слот, в первый ставим валяющийся рядом 3470. К каждой карте прицепляем по монитору. Включаем хост, запускаем виртуалку. Винда просит перезагрузки после изменения конфигурации. Ребут. Логинимся…
В консоли XenCenter заставка зависает, и я не сразу соображаю, что правый монитор светится синим
Оно все-таки произошло.
Итого, на Xen срослось за 3 дня (после того, как 3 месяца упражнялся на VMware).
Я залогинился. Картинка на мониторе самая обыкновенная, без особенностей. Разрешение 1920х1200 держит. Не тупит (хотя тестов не гонял). Видео с YouTube проигрывается нормально.
На этой радостной ноте завершу свой правдивый отчет, а сам займусь пробросом клавиатуры, мыши и прочей периферии.
Update:
Пробросил клавиатуру и мышь, пишу из виртуалки под Win7. Здесь ничего, жить можно.
Индекс производительности 3.5
Я даже еще не отключил Aero и прочие визуальные эффекты, вредные нашему делу, но работает шустро.
Проброс USB сделал грубо и цинично:
xe vm-param-set other-config:pci=0/0000:02:00.0,0/0000:02:00.1,0/0000:00:1a.0,0/0000:00:1d.0 uuid=d103a91d-5c38-844f-14d5-64b3c495eb08
То есть пожертвовал виртуалке USB контроллеры. С другой стороны, Xen пока без них обойдется.
Что еще? Поставил XenCenter, Xen нормально администрится (кто бы сомневался). Внешний USB-диск, естественно, тоже нормально прицепляется. Теперь надо понять, как пробрасывать CD-ROM.
К сожалению, ничего не вышло у меня с USB Passthrough, равно как и со справедливо упомянутым в комментариях Xen VGA Passthrough (Scraelos), потому как нет под XCP файла «/etc/xen/ cfgfile». Как прописать необходимые настройки с помощью xe — я не разобрался. Если знатоки Xen помогут, буду очень признателен.
Update: ToDo:
- Пробросить CD-ROM (-)
- Сконфигурировать статический IP (+)
- Протестировать производительность (частично сделано)
- Попробовать пересадить dom0 на IGD, освободится один слот PCIe (-)
- Попробовать пересадить dom0 на onboard NIC, освободится слот PCI (+)
- Попробовать впарить dom0 клавиатуру на PS/2
- Организовать файловую систему для обмена даными между гостевыми ОС
- Организовать переключение между гостевыми ОС (скриптами, наверное)
Update 06.02.2012:
dom0 на IGD пересаживаться отказался в категорической форме. Кроме того, повторил попытку пробросить primary VGA adapter — без толку. Вернулся к прежней конфигурации адаптеров.
Уперся в проблему с пробросом CD(DVD)-Writer. CD-ROM пробрасывается штатно, но только RO, а мне надо RW. По этому поводу нашел 2 рекомендации: воткнуть и пробросить отдельный SATA контроллер и использовать USB CD/DVD-Writer (благо USB пробрасывается). К сожалению, даже эти (имхо, костыльные) решения у меня на данный момент не заработали. Контроллер пробрасываться отказался. Попытка подключить штатный SATA CD/DVD привод через переходник USB-SATA ни к чему хорошему не привела. Продолжаю опыты.
Источник
Пробрасываем видеокарту в виртуальную машину, делаем игровую систему.
Бывает такой момент, что без Windows никак не обойтись, и даже wine не помогает, и тут к нам на помощь приходят виртуальный машины. Под Linux их хватает, VirtualBox, VMWare, XEN(гипервизор, но все же), qemu с kvm. Иногда нам необходима полноценная 3D графика, на виртуалке, и тут нам поможет проброс(passthrough) видеокарты в виртуалку.
В интернете полно статей, что да как делать, но интернет у нас большой и от еще одной статейки он не лопнет.
Для начала нам необходимо, что бы в компьютере было 2 видеокарты, например встроенная и дискретная. У меня основная видеокарта Geforce GXT 550ti, а прокидывал я GTX 650ti и Ati HD4850 и все успешно работало.
Существует 2 вида проброса, использовать OVMF, данный проект позволяет использовать UEFI в виртуалке, но и видеокарта должна быть не простая, а аж с двумя биосами, это можно выяснить следующим образом [ http://vfio.blogspot.ru/2014/08/does-my-graphics-card-rom-support-efi.html ].
Скачиваем, компилируем
Получаем BIOS видекарты
0000:01:00.0 — надо изменить на код вашего девайса.
Проверяем BIOS ./rom-parser image.rom
Если вы видите подобное PCIR: type 3(EFI ROM), то ваша видеокарта поддерживает OVMF.
Ваш конфиг виртуалки будет немножко отличаться.
Я поэкспериментировал с ядрами, ни к чему интересному и хорошему это не привело, писали [https://bbs.archlinux.org/viewtopic.php?id=203240] что в ядре 4.2.2-1 поломали проброс, но как оказалось все прекрасно работает.
Но если же у вас все же есть желание, то устанавливайте из AUR’a:
1. [ https://aur.archlinux.org/packages/linux-vfio/ ] — на данный момент типа багнутое ядро, где сломан проброс, но используются полезные патчи для видюх интел и еще что-то там
2. [ https://aur.archlinux.org/packages/linux-vfio-lts/ ] — рабочее ядро, с теми же патчами, что и выше.
Как пользоваться makepkg, разберетесь сами.
1. Устанавливаем необходимый софт pacman -S qemu libvirt synergy
2. Нужно подкорректировать загрузку ядра, что бы не подцеплялась, наша видеокарта которую мы будем прокидывать. Нужно узнать id вендора и кода нашей видеокарты. Для этого выводим lspci Находим там код видеокарты, запоминаем его, и вводим уже lspci -n Теперь правим параметры загрузки grub, для этого открываем /etc/default/grub
и добавляем параметр в GRUB_CMDLINE_LINUX_DEFAULT vfio-pci.ids=10de:11c6,10de:0e0b
У меня следующего вида
Применяем параметры grub-mkconfig -o /boot/grub/grub.cfg , после перезагрузки, должно быть нечто подобное dmesg | grep vfio_pci :
Подкорректируем /etc/mkinitcpio.conf:
Применим mkinitcpio -p linux (linux изменить на имя вашего ядра)
3. Настраиваем и создаем виртуалку.
Подправим конфиг qemu
/etc/libvirt/qemu.conf:
В принципе действия для того что бы использовать ovmf те же, так вот если вам повезло и у вас видеокарта поддерживает EFI, то следующий конфиг для вас:
pacman -S ovmf Если же нет, используем Seabios
windows.img — образ жесткого диска, создается командой dd if=/dev/zero of=windows.img bs=1M seek=60000 count=0 seek=60000 размер диска в мегабайтах.
virtio-win.iso — образ с драйверами, берется последующей ссылки [ https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso ]
windows.iso — образ диска с Windows, сами разберетесь где его брать, если используете ovmf убедитесь, что образ поддерживает загрузку UEFI. и при загрузке системы скорее всего надо будет ввести команду следующего вида: PS0:/EFI/BOOT/bootx64.efi
Данные конфиги для начальной установки Windows и все должно пройти на отлично.
3. После окончания установки, настало время прокинуть видеокарту.
Раскоментируем строку в конфиге
и запустим виртуалку.
Если все прошло хорошо, должно определиться новое устройство, скачиваем и устанавливаем драйвера для видеокарты, я не ставил никакого лишнего софта, только драйвера, пишут что Catalyst control center да и nvidia experience загоняет в синий экран, не проверял.
Нужно не забыть установить synergy, без этой программы управление(мышкой и клавиатурой) виртуалкой будет невозможно.
Найдете ее на торрентах или прочих сайтах, там в настройках надо указать client: 10.0.2.2(дефолтный ip хоста) и имя экрана, допустим Windows. Теперь настроим synergy на хосте(компьютер с Linux), создадим конфиг следующего содержания:
synergy.conf
Windows и Linux это имена экранов, измените на ваши
Запустим synergy synergys —config synergy.conf —debug INFO , и при передвижение мышки за левую часть экрана, она должна переходить на виртуалку.
Если все получилось, выключаем виртуальную машину, в конфиге меняем строку -vga std на -vga none , подключаем к выходу проброшенной видеокарты кабель к монитору, запускаем виртуалку и у нас на экране должна появится картинка с процессом загрузки. Проверяем функциональность synergy, кнопка F12 блокирует курсор на текущем экране.
4. Прокидываем звук, если вы используете pulseaudio просто укажите перед запуском quemu QEMU_AUDIO_DRV=pa если же ALSA, то предлагаю вам использовать утилиту apulse, она есть в AUR [ https://aur.archlinux.org/packages/apulse/ ] и запуск виртуалки будет следующим QEMU_AUDIO_DRV=pa apulse qemu-system-x86_64. 5. У меня 2 монитора, и при запуске виртуалки на главный монитор(центральный) через vga идет картинка с Windows. а правый становится главным Linux’овым монитором.
К основной видеокарте правый монитор подключен через DVI, центральный монитор подключен к «виртуальной» видюхе через VGA, а к основной через HDMI.
Команда xrandr —output DVI-I-1 —auto && xrandr —output HDMI-0 —off Ваши подключенные мониторы и возможные режимы работы можно посмотреть командой xrandr
Выклаываю полный скрипт запуска виртуалки
Так же рекомендую отключить запрос на восстановление системы при загрузке после сбоев
В данную тему я нырнул лишь ради интереса и возможности поиграть в ММО Black Desert, отлично кстати работает.
UPD 11.10.2016
Сегодня вновь столкнулся с пробросом видеокарты, но теперь мне нужен был еще и звук по hdmi, немного погуглив нашел решение http://vfio.blogspot.ru/2014/09/vfio-interrupts-and-how-to-coax-windows.html?m=1
Что бы нормально работал звук через HDMI проброшенный видюхи нужно включить Message Signaled Interrupts(MSI).
Для этого в реестре Windows необходимо внести правки, а именно в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ найти вашу видеокарту, там будет два устройства видео и звук, далее в Device Parameters\Interrupt Management создать(если его нет) раздел MessageSignaledInterruptProperties и в нем DWORD параметр MSISupported со значением 1, он включит MSI. После перезагрузки звук должен прекрасно заработать.
UPD 01.06.2019
Обновил компьютер до Ryzen и столкнулся с проблемой
Подробности здесь AMD Ryzen и проблемы с пробросом видеокарты в QEMU KVM
UPD 15.09.2019
После очередного обновления начались неприятности, qemu падал в core-dump при попытке издать малейший звук, решилась эта проблема добавлением строки
1000 — id вашего юзера, все переменные QEMU_AUDIO можно убрать.
Если будет писать что нет доступа
Можно скопировать пользовательские cookie в root
На 15.09 проблема с Ryzen еще присутствует, приходится патчить ядро.
Источник