LINUX.ORG.RU

Несколько вопросов о пробросе видяшки в виртуалку

 , , ,


0

2

Имеется: проц i5-2500, мать AssRock на B75, видяшка для хоста: i5-2500, видяшка для виртуалки: GTX570, kernel 4.2.0, qemu 2.4.0, патчи на ядро: i915_vga_arbitration и acs_override.

Главный вопрос: как сделать многоразовую виртуалку?
У меня она повторно после выключения работать отказывается:

(qemu) qemu-system-x86_64: vfio-pci: Cannot read device rom at 0000:01:00.0
Device option ROM contents are probably invalid (check dmesg).
Skip option ROM probe with rombar=0, or load from file with romfile=
И в dmesg: vfio-pci 0000:01:00.0: Invalid ROM contents.

Сдампил биос видеокарты, скармливаю ей: romfile=vbios.rom - первый запуск все ок (так же как и без дампа), повторный запуск - комп виснет. Перезагрузка гостя тоже приводит к зависанию.

И пара мелких вопросиков:
1) Как-нибудь можно обойтись одной мышкой и клавой? И для хоста и для гостя.
2) Возможно ли использовать qemu-шные spice/vnc одновременно с пробросом видяшки? Или единственный вариант - ставить vncserver на гостя?

Всякое разное:
# grep -iE 'vga|vfio' semero4ka.sh
-device vfio-pci,host=01:00.0,addr=07.0,multifunction=on,x-vga=on,romfile=vbios.rom \
-device vfio-pci,host=01:00.1,addr=07.1 \
-vga none \

# lspci -k | grep VGA -A2
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
        Subsystem: ASRock Incorporation 2nd Generation Core Processor Family Integrated Graphics Controller
        Kernel driver in use: i915
--
01:00.0 VGA compatible controller: NVIDIA Corporation GF110 [GeForce GTX 570] (rev a1)
        Subsystem: Gigabyte Technology Co., Ltd GF110 [GeForce GTX 570]
        Kernel driver in use: vfio-pci

# lspci -n | grep 01:00
01:00.0 0300: 10de:1081 (rev a1)
01:00.1 0403: 10de:0e09 (rev a1)

# grep CMDLINE_LINUX_DEFAULT /etc/default/grub 
GRUB_CMDLINE_LINUX_DEFAULT="vfio-pci.ids=10de:1081,10de:0e09 intel_iommu=on pcie_acs_override=downstream i915.enable_hd_vgaarb=1"

# dmesg -t | grep -iE 'iommu|vfio|dmar'
Command line: BOOT_IMAGE=/boot/kernel-genkernel-x86_64-4.2.0-gentoo-r1 root=/dev/sda2 ro vfio-pci.ids=10de:1081,10de:0e09 intel_iommu=on pcie_acs_override=downstream i915.enable_hd_vgaarb=1
Warning: PCIe ACS overrides enabled; This may allow non-IOMMU protected peer-to-peer DMA
ACPI: DMAR 0x00000000BDF3A748 0000B8 (v01 INTEL  SNB      00000001 INTL 00000001)
Kernel command line: BOOT_IMAGE=/boot/kernel-genkernel-x86_64-4.2.0-gentoo-r1 root=/dev/sda2 ro vfio-pci.ids=10de:1081,10de:0e09 intel_iommu=on pcie_acs_override=downstream i915.enable_hd_vgaarb=1
DMAR: IOMMU enabled
DMAR: Host address width 36
DMAR: DRHD base: 0x000000fed90000 flags: 0x0
DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap c0000020e60262 ecap f0101a
DMAR: DRHD base: 0x000000fed91000 flags: 0x1
DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap c9008020660262 ecap f0105a
DMAR: RMRR base: 0x000000bdd7c000 end: 0x000000bdda8fff
DMAR: RMRR base: 0x000000bf800000 end: 0x000000cf9fffff
DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
DMAR-IR: HPET id 0 under DRHD base 0xfed91000
DMAR-IR: Enabled IRQ remapping in xapic mode
DMAR: No ATSR found
DMAR: dmar0: Using Queued invalidation
DMAR: dmar1: Using Queued invalidation
DMAR: Setting RMRR:
DMAR: Setting identity map for device 0000:00:02.0 [0xbf800000 - 0xcf9fffff]
DMAR: Setting identity map for device 0000:00:14.0 [0xbdd7c000 - 0xbdda8fff]
DMAR: Setting identity map for device 0000:00:1a.0 [0xbdd7c000 - 0xbdda8fff]
DMAR: Setting identity map for device 0000:00:1d.0 [0xbdd7c000 - 0xbdda8fff]
DMAR: Prepare 0-16MiB unity mapping for LPC
DMAR: Setting identity map for device 0000:00:1f.0 [0x0 - 0xffffff]
DMAR: Intel(R) Virtualization Technology for Directed I/O
iommu: Adding device 0000:00:00.0 to group 0
iommu: Adding device 0000:00:01.0 to group 1
iommu: Adding device 0000:00:02.0 to group 2
iommu: Adding device 0000:00:14.0 to group 3
iommu: Adding device 0000:00:16.0 to group 4
iommu: Adding device 0000:00:1a.0 to group 5
iommu: Adding device 0000:00:1b.0 to group 6
iommu: Adding device 0000:00:1c.0 to group 7
iommu: Adding device 0000:00:1c.4 to group 8
iommu: Adding device 0000:00:1c.5 to group 9
iommu: Adding device 0000:00:1d.0 to group 10
iommu: Adding device 0000:00:1e.0 to group 11
iommu: Adding device 0000:00:1f.0 to group 12
iommu: Adding device 0000:00:1f.2 to group 12
iommu: Adding device 0000:00:1f.3 to group 12
iommu: Adding device 0000:01:00.0 to group 13
iommu: Adding device 0000:01:00.1 to group 13
iommu: Adding device 0000:02:00.0 to group 14
iommu: Adding device 0000:03:00.0 to group 15
iommu: Adding device 0000:04:00.0 to group 16
[drm] DMAR active, disabling use of stolen memory
VFIO - User Level meta-driver version: 0.3
vfio_pci: add [10de:1081[ffff:ffff]] class 0x000000/00000000
vfio_pci: add [10de:0e09[ffff:ffff]] class 0x000000/00000000

★★★★★

Ответ на: комментарий от win

У меня с ефи не работает, ибо карта старая.
Поделись конфигами, плз.

Lavos ★★★★★ ()

делать vfio-reset на пустой виртуалке, например скриптом:

#/bin/bash

/etc/init.d/vfio-assign start && sleep 1 &&

qemu-system-x86_64 \
-enable-kvm \
-M q35 \
-m 512 \
-cpu host \
-rtc base=localtime \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/qemu/bios.bin \
-boot menu=off,strict=on -vga none -nographic \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \
-device vfio-pci,host=01:00.1,bus=root.1,addr=00.1

kep ()

1) Как-нибудь можно обойтись одной мышкой и клавой? И для хоста и для гостя.

Synergy.

kep ()

2) Возможно ли использовать qemu-шные spice/vnc одновременно с пробросом видяшки? Или единственный вариант - ставить vncserver на гостя?

нет, подключай второй монитор в пробрасываемую карту.

kep ()

1. http://synergy-project.org Только во всяких игрушках, где поворот осуществляется при зажатой правой кнопке мыши, перс вглядывается в небо и вращается как вентилятор. Сам пакет есть в дистрибутивах, а вот для винды так просто не скачать - требуют донатить, но где-то раньше проскакивала ссылка, по которой можно было скачать ночные сборки без всякого доната. 2. В принципе возможно, но это зависит. Убрать из команды запуска x-vga=on и добавить эмулируемую карточку. С amd у меня здесь никаких проблем не было: на семёрке изображение через vnc/spice замирало, когда подгружались дрова для проброшенной карточки, но изображение появлялось на проброшенной карте, а через vnc/spice можно было захватить клаву и мышь; на восьмёрке появлялось 2 экрана, один на vnc, второй на проброшенной карте. Если так заработает, то synergy не нужно. А вот на интеле я могу пробросить карточку только как первичный адаптер. Если добавить vnc/spice, то при подгрузке дров получаю чёрный экран.

Попробуй не пробрасывать hdmi-audio. Просто забинди его, но в виртуалку не пихай. На интеле у меня проброс работает только в таком режиме, а если я добавляю проброс hdmi-audio, то получаю чёрный экран, даже если видеокарточка используется как первичный адаптер. Это может помочь с зависаниями, я так думаю.

Ещё вариант - извлекать перед выключением гостя видеокарточку (это если гость заработает с vnc/spice) и hdmi-audio, либо ручками, либо прописать в скрипт выключения вызов deveject. Но при этом перезагрузку надо осуществлять через выключение гостя.

PS У меня второй экран (spice) работал только в 10-ке, в 7-ке и 8-ке я получал чёрный экран. А с пробросом hdmi-audio гость не заработал ни в одной винде.

anonymous ()
Ответ на: комментарий от kep

Не понял. Этот скрипт просто запускает виртуалку с проброшенной видяхой, но без дисков.
У меня запуск этого скрипта приводит к той же самой ошибке:

vfio-pci: Cannot read device rom at 0000:01:00.0
Как именно через него сбрасывать видяху?

Lavos ★★★★★ ()
Ответ на: комментарий от kep

Synergy посмотрю, спасибо.

нет, подключай второй монитор в пробрасываемую карту.

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

Lavos ★★★★★ ()
Ответ на: комментарий от anonymous

На интеле у меня проброс работает только в таком режиме, а если я добавляю проброс hdmi-audio, то получаю чёрный экран, даже если видеокарточка используется как первичный адаптер. Это может помочь с зависаниями, я так думаю.

Без HDMI-аудио попробую, но наверное это не поможет, у меня оно даже биос видяхи считать не может при повторном запуске. До черного экрана даже не доходит.
А как понять 'первичный адаптер'? Что это и на что влияет?

Ещё вариант - извлекать перед выключением гостя видеокарточку (это если гость заработает с vnc/spice) и hdmi-audio, либо ручками, либо прописать в скрипт выключения вызов deveject. Но при этом перезагрузку надо осуществлять через выключение гостя.

Можно подробнее? Что за deveject и как его готовить? А руками как?

Lavos ★★★★★ ()
Последнее исправление: Lavos (всего исправлений: 2)
Ответ на: комментарий от anonymous

http://synergy-project.org/download/free/

ну и ещё гдето на гитхабе видел(ссылку не дам - в истории не нашел - но она существует)

http://synergy-project.org/download/ - это для тех кому не лень регистрироватся

в любом случае везде клиент для виндовс доступен также как и для линуха.

win ()
Ответ на: комментарий от win

ан не - всёже версии разные

но суть не в этом - клиент для линуха доступен также как и для других ОС - и донатить нечего ненадо

А так требует регистрацию. Я ошибаюсь?

канечно ты ошибаешся - ты до этого про донат писал

требуют донатить

...

win ()
Ответ на: комментарий от Lavos

в общем, мне лень вспоминать всю подноготную, я как настроил год назад, так и работает как часы завода Луч по сей день, но у меня карта не через vfio пробрасывается, а через pci-assign, может быть в моём случае это работает, а в твоём — нет.

Я нашел (несколько раз встречал) этот вариант здесь же в разных топиках на эту тему.

kep ()
Ответ на: комментарий от Lavos

Без HDMI-аудио попробую, но наверное это не поможет, у меня оно даже биос видяхи считать не может при повторном запуске. До черного экрана даже не доходит. А как понять 'первичный адаптер'? Что это и на что влияет?

У кого-то здесь хост зависал при выключении гостя. Удалось отловить, что последняя запись - невозможно ресетнуть девайс, который как раз и был hdmi-audio. Тоже NVidia у него была. Чем закончилось, я не знаю.

Первичный адаптер - тот, на котором отображается загрузка при включении гостя (параметр x-vga=on и эмулируемая карточка не используется). Если добавляется эмулируемая карточка, то к гостю можно подключаться через vnc/spice, и она является первичным адаптером (x-vga=on здесь не нужен и не поможет), если только не используется загрузка через uefi (ovmf биос нужен, вроде). При загрузке через uefi, биос вроде автоматом назначает проброшенную карточку первичным адаптером, а эмулируемая карточка будет в винде вторым экраном.

https://www.linuxserver.io/index.php/2013/09/12/xen-4-3-windows-8-with-vga-pa... смотри раздел «Getting rebooting to work». Там используется DevManView.exe, но в форумах арча народ использовал deveject http://www.withopf.com/tools/deveject/. Ну, и я тоже использовал deveject, когда боролся с HD7970 (из коробки она не работала в госте после его рестарта или повторного запуска). Потом мне это надоело и я пробросил HD6970, а 7970 оставил на хосте. Попробуй для начала ручками извлечь hdmi-audio и, может быть, видео. Если поможет, тогда будет смысл заморачиваться с этим софтом. Но, всё-таки попробуй сначала не пробрасывать hdmi-audio.

А руками - так же, как флешку извлекаешь. Проброшенная карточка болтается в том же списке, что и флешки и другие hotplug-девайсы.

anonymous ()

когда пробрасывал через pci stub нужно было отключать карту в винде что бы была нормальная перезагрузка, потом перешел на vfio и все работает как часы, на счет второго вопроса не понял, вирутальное окно и реальная карта спокойно работают вместе, есть даже способ как в qemu окне получить аппаратное ускорение от реальной карты. https://www.youtube.com/watch?v=d3HL9x0CEtY

Novell-ch ★★★★★ ()
Ответ на: комментарий от Novell-ch

А у меня -vga qxl конфликтует с проброшенной (в диспетчере устройств винды прочитал).

Lavos ★★★★★ ()
Ответ на: комментарий от anonymous

Убрал hdmi-audio, вроде перестало виснуть.
Поставил драйвера нвидии, а они не работают - код 43.
Добавил kvm=off в -cpu - теперь семерочка падает в синий экран сразу на загрузке. Печаль.

Lavos ★★★★★ ()
Ответ на: комментарий от Lavos

ну так что нвидиа очень геморройная в плане проброса это не новость, особенно с новыми дровами где лочат проброс, слався Хуанг.

Novell-ch ★★★★★ ()
Ответ на: комментарий от Novell-ch

Это да, а амд не умеет железо делать.
Нагуглил, что нвидии только primary пробрасываются. Вечером попробую.

Lavos ★★★★★ ()

От BSOD спасает только -vga none, совместно с -vga std -vnc (хоть primary, хоть secondary) - BSOD.

Зато вернулись зависания от ребута гостя, пропадали они не из-за отключения hdmi-audio, а из-за отсутствия опции x-vga=on (пытался пробросить нвидию как secondary). С x-vga=on ребут гостя, или повторный запуск после shutdown == вешалка.

Попробовал проброс через pci-assign - совсем не работает: No IOMMU found. Unable to assign device hostpci0, работает только через vfio, но только один раз.

Извлечение карты не помогает. Проверял через RDP: после извлечения карты картинка на мониторе сразу пропадает (внезапно), а RDP еще шевелится. Но после отправления венды в shutdown виртуалка виснет. На чем виснет не понятно, т.к. картинки на мониторе нет, а RDP к тому времени уже отваливается. killall qemu с повторным запуском == вешалка.

Кроме ребута хоста помогает еще pm-suspend секунд на 10, после выхода из суспенда виртуалку снова можно запустить.

Производительность нормальная вроде, индекс в венде такой же, как на голом железе. С -cpu host,kvm=off драйвера нвидии взлетели и работают, кодом 43 не ругаются.

Ну как же починить вешалку от ребута гостя...? pm-suspend конечно меньший костыль, чем ребут хоста, но все равно не айс.
А pci-e слот как-то можно сбросить по питанию? Это был бы еще меньший костыль, чем pm-suspend...

Lavos ★★★★★ ()

Зависания починились заменой карты...

Lavos ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.