LINUX.ORG.RU

Не пробрасывается видеокарта в kvm

 , , , ,


1

3

К сожалению, гуглинг не помог, посему - здравствуй, ЛОР! Пробрасываю видеокарту NVIDIA GeForce 8600 GT по мануалу http://habrahabr.ru/post/211909 . Оффтопик драйвера на карту ставит, но вылетает через 2-3 минуты после загрузки. Убунта выводит следующее:

[ 92.1440147 ] nouveau E[Xorg[1429]] failed to idle channel 0xcccc0000 [Xorg[1429]]
[ 186.668012 ] nouveau E[Xorg[1675]] failed to idle channel 0xcccc0000 [Xorg[1675]] was shut down
что говорит о том, что как-то хреново я видеокарту пробросил.

Материнская плата: Asus M5A97 R2.0, в биосе всё включено, что требуется включить. Процессор: AMD FX8320. Видео хоста: Saphire 7750. То есть, модуль nouveau в ядре не прогружен. ОС хоста: Debian testing.

Строка kvm:

#!/bin/sh

ID="2"
tapID="2"
MAC="00:23:cb:5f:ff:"$ID$ID

export QEMU_AUDIO_DRV=alsa
export QEMU_AUDIO_DAC_FIXED_FREQ=48000
export QEMU_AUDIO_ADC_FIXED_FREQ=48000
export QEMU_ALSA_DAC_BUFFER_SIZE=8192

kvm \
-enable-kvm \ -cpu host \ -m 4096M \
-machine type=q35,accel=kvm \
-bios /usr/share/seabios/bios.bin \
-acpitable file=/usr/share/seabios/q35-acpi-dsdt.aml \
-boot menu=off,order=d \
-drive file=`pwd`/hda.vdi,index=0,media=disk,cache=writeback \
-usb $usb \
-net nic,id=guest$ID,macaddr=$MAC \
-net tap,id=net$ID,ifname=tap$tapID,script=no,downscript=no \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root \
-device ahci,bus=pcie.0,id=ahci \
-device vfio-pci,host=06:00.0,bus=root,addr=00.0,multifunction=on,x-vga=on \
-usbdevice tablet \ -soundhw hda \ -vga qxl \
-serial null -parallel null \
(Если ставлю vga none, то вместо экранчика выводит консоль qemu: compat_monitor0 console)

Инициализация IOMMU:

root@server:/home/user/VM's# dmesg | grep AMD-Vi
[    1.228678] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
[    1.228679] AMD-Vi: Interrupt remapping enabled
[    1.228807] AMD-Vi: Initialized for Passthrough Mode
root@server:/home/user/VM's# lspci | grep IOMMU
00:00.2 IOMMU: Advanced Micro Devices, Inc. [AMD/ATI] RD990 I/O Memory Management Unit (IOMMU
Строка загрузки ведра
linux   /boot/vmlinuz-4.0.0-2-amd64 root=UUID=bfbe2f66-ffc6-4efb-a5a9-be0dfdceebf4 ro quiet pci-stub.ids=10de:0402 iommu=pt iommu=1 amd_iommu=fullflush

Инициализация pci-stub

root@server:/home/user/VM's# dmesg | grep pci-stub
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.0.0-2-amd64 root=UUID=bfbe2f66-ffc6-4efb-a5a9-be0dfdceebf4 ro quiet pci-stub.ids=10de:0402 iommu=pt iommu=1 amd_iommu=fullflush
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.0.0-2-amd64 root=UUID=bfbe2f66-ffc6-4efb-a5a9-be0dfdceebf4 ro quiet pci-stub.ids=10de:0402 iommu=pt iommu=1 amd_iommu=fullflush
[    9.687197] pci-stub: add 10DE:0402 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    9.687213] pci-stub 0000:06:00.0: claimed by stub
[  384.095363] pci-stub 0000:06:00.0: claimed by stub
[  545.576587] pci-stub 0000:06:00.0: claimed by stub
Подключение модуля vfio для видеокарты
root@server:/home/user/VM's# ls -Flh /dev/vfio/
итого 0
crw-rw---- 1 root kvm 248,   0 авг 16 01:24 13
crw-rw---- 1 root kvm  10, 196 авг 16 00:23 vfio
06:00.0 VGA compatible controller: NVIDIA Corporation G84 [GeForce 8600 GT] (rev a1)
        Subsystem: Micro-Star International Co., Ltd. [MSI] Device 1020
        Kernel driver in use: vfio-pci

Заранее всем спасибо в моём нелёгком деле.


Если задал -vga none, то у тебя сразу должна идти картинка на монитор(к карточке должен быть подключен второй монитор или второй вход на основном мониторе). Если этого нет, то проброс обломался сразу. Когда указываешь -vga qxl, то x-vga=on убирай. Даже если не собираешься пробрасывать hdmi-audio, её всё равно надо забиндить на vfio(вообще, если пробрасывается только одно устройство, то все остальные в этой же iommu_group тоже надо биндить).

PS Драйвер nvidia определяет виртуалку и отказывается работать. Надо задавать дополнительные параметры в строке запуска, которые скрывают для гостя виртуальное окружение. Однако, если у тебя сразу не появляется картинка на втором мониторе, то с этим пока можно не морочиться.

PPS Я бы попробовал переставить nvidia и amd и пробрасывать amd, хотя с ней могут быть проблемы при перезагрузке гостя.

anonymous
()

x-vga=on я вместе с -vga не использую, но у меня так тоже работает, а вот после того как скопипастил пару строк с биосом и acpi и добавил bus=root,addr=00.0 к карте на q35 нормально стали новые драйвера для амд, до этого все что выше 15.6 вешало сисему и нужно было сидеть на pc i440

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

Второго монитора нет. Разве нельзя открывать ВМ в окне с опцией -display sdl?

Аудио на карте Nvidia нет. В lspci больше устройств не обнаруживается. Аудиокарточку эмулирую (см. строку запуска kvm).

PS Драйвер nvidia определяет виртуалку и отказывается работать.

Я читал про это, но думал, что это уже пофиксили, и проблема только в Windows.

-vga qxl ставлю, потому что иначе изображения вообще нет, и вылазит compat_monitor0 console.

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

Про sdl не знаю. А если переткнуть видео кабель в nvidia, то в момент старта вм будет отбражаться загрузка биоса (нвидиа должны быть единственным адаптером в вм и опция x-vga=on должна присутствовать)? Если да, то всё нормально и нужно танцевать с доп. опциями, чтобы обмануть драйвер нвидиа. А ежели нет, то в голову приходит только переставить местами карточки и пробовать с амд.

Я использую libvirt и он генерит следующую строку запуска:

LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin /usr/bin/qemu-system-x86_64 -name windows-7 -S -machine pc-q35-2.1,accel=kvm,usb=off -cpu host -m 8192 -realtime mlock=off -smp 6,sockets=1,cores=3,threads=2 -uuid f71afb4e-635d-4997-b939-d8956a9f2948 -nographic -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/windows-7.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=localtime -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device i82801b11-bridge,id=pci.1,bus=pcie.0,addr=0x1e -device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.1,addr=0x1 -device ich9-usb-ehci1,id=usb,bus=pci.2,addr=0x3.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.2,multifunction=on,addr=0x3 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.2,addr=0x3.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.2,addr=0x3.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.2,addr=0x4 -drive file=/dev/sde,if=none,id=drive-virtio-disk0,format=raw,cache=none,aio=native -device virtio-blk-pci,scsi=on,bus=pci.2,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive if=none,media=cdrom,id=drive-sata0-0-0,readonly=on,format=raw,cache=none,aio=native -device ide-cd,bus=ide.0,drive=drive-sata0-0-0,id=sata0-0-0 -netdev tap,fd=23,id=hostnet0,vhost=on,vhostfd=24 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:a3:c2:06,bus=pci.2,addr=0x1 -chardev tty,id=charserial0,path=/dev/ttyS0 -device isa-serial,chardev=charserial0,id=serial0 -chardev spicevmc,id=charchannel0,name=vdagent -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=com.redhat.spice.0 -device usb-tablet,id=input0 -device intel-hda,id=sound0,bus=pci.2,addr=0x2 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -chardev spicevmc,id=charredir0,name=usbredir -device usb-redir,chardev=charredir0,id=redir0 -chardev spicevmc,id=charredir1,name=usbredir -device usb-redir,chardev=charredir1,id=redir1 -device usb-host,hostbus=1,hostaddr=2,id=hostdev0 -device usb-host,hostbus=1,hostaddr=7,id=hostdev1 -device usb-host,hostbus=1,hostaddr=9,id=hostdev2 -device virtio-balloon-pci,id=balloon0,bus=pci.2,addr=0x6 -device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 -device vfio-pci,host=02:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on -msg timestamp=on
anonymous
()
Ответ на: комментарий от anonymous

А если переткнуть видео кабель в nvidia, то в момент старта вм будет отбражаться загрузка биоса (нвидиа должны быть единственным адаптером в вм и опция x-vga=on должна присутствовать)? Если да, то всё нормально и нужно танцевать с доп. опциями, чтобы обмануть драйвер нвидиа.

Да, с опциями -vga none \ -nographic \ на втором мониторе запустилось изображение виртуалки. К сожалению, монитор в N+1 раз умер, но система по-прежнему не грузится. Похоже, это всё-таки драйвер («Fuck you, nVidia!»).

Кстати, не подскажите несложный способ доступа к виртуалке из хоста (мышью и клавиатурой к гостю, либо пробросом монитора в хост)?

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

Для обмана nvidia к опции -cpu добавляется kvm=off, то есть получается что-то типа такого: -cpu host,kvm=off

Для проброса мыши и клавы я использую synergy, хоть проект и с открытыми исходниками, но без доната они не давали скачать установщик(но можно было скачать ночные сборки, если знать адрес). В дебьяне и федоре synergy присутствует. Вообще, я пробрасываю одну мышь(usb) средствами qemu, так как через synergy в играх при зажатой правой кнопке мыши начинает бешено вращаться небо. Клава работает нормально, но некоторая долбаная защита игры может её блочить(например, фрост в линейке). В таком случае, клаву(usb) тоже можно пробросить через qemu. Я использую virt-manager, где можно это делать на ходу в несколько кликов(для этого у меня вторая мышь).

PS Для прцессоров amd грузи модуль kvm-amd с опцией npt=0, иначе в играх фпс будет в несколько раз меньше. И можно уменьшить значение up_threshold до 25 и ниже, чтобы фпс не сильно скакал(политика ondemand), или выставлять политику performance.

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

Да, если победишь нвидию, то можно попробовать добавить эмулируемый адаптер, тогда экран на этом адаптере может захватить клаву и мышь и их можно свободно юзать в виртуалке. На 7-ке в момент подгрузки драйвера этот экран замирает, но клаву и мышь захватывает, а на втором мониторе появляется картинка. 8-ка и 10-ка могут расширить рабочий стол на 2 экрана. Но всё равно нужен второй монитор(дополнительный вход на единственном мониторе), подключенный к проброшенной карточке, чтобы видеть с неё картинку. У меня на интеле виртуалка может работает только с одной карточкой, если я добавляю эмулируемую, то получаю облом в виде недостаточно ресурсов для запуска устройства.

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

Не, эта опция делает следующее: Hide the KVM hypervisor from standard MSR based discovery.

anonymous
()
27 декабря 2015 г.
Ответ на: комментарий от anonymous

Вроде бы как проброс видеокарты заработал, но с usb-клавиатурой по-прежнему проблемы. В строке запуска kvm добавил следующее:

-usb \
-usbdevice host:1C4F:0002 \
Но, похоже, хост её не «отдаёт»:
libusb: error [_get_usbfs_fd] libusb requires write access to USB device nodes.
libusb: error [_get_usbfs_fd] libusb couldn't open USB device /dev/bus/usb/008/007: Permission denied

Не подскажете, в какую сторону копнуть?

tensor
() автор топика
Ответ на: комментарий от NeverLoved

Я пробрасываю не usbdevice, а сам порт

Какой строкой qemu? Или каким скриптом баша?

qemu добавить в группу usb/plugdev?

Нет такого юзера. Я в группе plugdev. Запуск ВМ рута даёт те же ошибки.

P.S.: Похоже, видеокарта маленько того, RIP. Изображение на подключаемом мониторе появляется в 1 случае из 10, в остальных уходит в энергосберегающий режим.

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