4

Я использую Ubuntu и пытаюсь настроить QEMU с помощью GPU. Я следовал этим руководствам:

https://www.youtube.com/watch?v=w-hOr44oBAI

https://www.pugetsystems.com/labs/articles/Multiheaded-NVIDIA-Gaming-using-Ubuntu-14-04-KVM-585/#Step5Createascripttoruneachvirtualmachine

http://www.howtogeek.com/117635/how-to-install-kvm-and-create-virtual-machines-on-ubuntu/

Мои /etc/modules:

lp
rtc
pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel 

Мой /etc/default/grub:

GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1"
GRUB_CMDLINE_LINUX=""

Мой графический процессор:

$ lspci -nn | grep NVIDIA
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106 [GeForce GTX 650 Ti] [10de:11c6] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation GK106 HDMI Audio Controller [10de:0e0b] (rev a1)
$ lspci -nn | grep -i graphic
00:02.0 VGA compatible controller [0300]: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor Graphics Controller [8086:0152] (rev 09)

Мои /etc/initramfs-tools/modules:

pci_stub ids=10de:11c6,10de:0e0b

pci_stub кажется, работает:

$ dmesg | grep pci-stub
[    0.541737] pci-stub: add 10DE:11C6 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    0.541750] pci-stub 0000:01:00.0: claimed by stub
[    0.541755] pci-stub: add 10DE:0E0B sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    0.541760] pci-stub 0000:01:00.1: claimed by stub

Мой /etc/vfio-pci1.cfg:

0000:01:00.0
0000:01:00.1

Мой ~/windows_start.bash: http://pastebin.com/F7fq2Szt

После запуска сценария bash в качестве драйвера используется vfio-pci :

$ lspci -k | grep -C 3 -i nvidia
    Kernel driver in use: ahci
00:1f.3 SMBus: Intel Corporation 7 Series/C210 Series Chipset Family SMBus Controller (rev 04)
    Subsystem: ASRock Incorporation Motherboard
01:00.0 VGA compatible controller: NVIDIA Corporation GK106 [GeForce GTX 650 Ti] (rev a1)
    Subsystem: Gigabyte Technology Co., Ltd Device 3557
    Kernel driver in use: vfio-pci
01:00.1 Audio device: NVIDIA Corporation GK106 HDMI Audio Controller (rev a1)
    Subsystem: Gigabyte Technology Co., Ltd Device 3557
    Kernel driver in use: vfio-pci
03:00.0 PCI bridge: ASMedia Technology Inc. ASM1083/1085 PCIe to PCI Bridge (rev 03)

Версии программного обеспечения:

$ kvm --version
QEMU emulator version 2.5.0, Copyright (c) 2003-2008 Fabrice Bellard

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.3 LTS
Release:    14.04
Codename:   trusty

Проблема в том, что когда я запускаю windows_start.bash , запускается терминал QEMU, но ничего не происходит. Монитор, подключенный к графическому процессору NVIDIA, черный, его должен включить QEMU, но это не так. Что я делаю неправильно? Как я могу отладить это? Что еще я могу попытаться достичь через GPU?

Я проверил, используя это руководство, и кажется, что мой графический процессор не поддерживает UEFI, так что, возможно, в этом причина его сбоя? Это по-прежнему странно, многие люди с успехом использовали даже более старые графические процессоры, поэтому должен быть способ.

РЕДАКТИРОВАТЬ: Я только что попытался запустить VM с libvirt с помощью virt-manager , как предложено @Deltik. Вот как выглядит мой конфиг: http://pastebin.com/W46kNcrh

Результат был почти таким же, как и раньше - он начался, показал черный экран в окне virt-manager , и больше ничего не произошло. В консоли отладки не было ошибок (которые я запустил, запустив virt-manager --debug). Я также попробовал тот же подход на Arch Linux и на более новой версии Ubuntu, это не имело никакого значения вообще.

Я дал награду @Deltik, потому что он дал мне несколько хороших советов, но я все еще не мог заставить это работать. Кажется, что эту задачу невозможно выполнить, по крайней мере, с моим текущим оборудованием.

1 ответ1

3

Ты рядом.

Использование как pci-stub и vfio-pci

Можно использовать pci-stub чтобы зарезервировать устройство PCI (например, ваш графический процессор) для предотвращения захвата графическим драйвером, поскольку графический драйвер (например, nouveau или fglrx) не отпускает устройство.

Фактически, в моем тесте мне нужно было сначала запросить видеокарту PCI с pci-stub потому что vfio-pci не сделает этого при загрузке, что является одной из проблем, с которыми вы столкнулись. В то время как выгрузка одного драйвера (pci-stub) и загрузка другого (vfio-pci) на его место некоторым может показаться уродливым, pci-stub и vfio-pci - это надежная команда тегов, которая приводит к успешной виртуальной машине с проходом через GPU. Мое тестирование не увенчалось успехом с использованием только одного или другого.

Теперь вам нужно освободить PCI-устройство от pci-stub и передать его vfio-pci . Эта часть вашего скрипта уже должна делать это:

configfile=/etc/vfio-pci1.cfg

vfiobind() {
    dev="$1"
        vendor=$(cat /sys/bus/pci/devices/$dev/vendor)
        device=$(cat /sys/bus/pci/devices/$dev/device)
        if [ -e /sys/bus/pci/devices/$dev/driver ]; then
                echo $dev > /sys/bus/pci/devices/$dev/driver/unbind
        fi
        echo $vendor $device > /sys/bus/pci/drivers/vfio-pci/new_id

}

modprobe vfio-pci

cat $configfile | while read line;do
    echo $line | grep ^# >/dev/null 2>&1 && continue
        vfiobind $line
done

Предостережение: " vfiobind " нужен только один раз

Как отмечено в этом комментарии, верно, что переключение с pci-stub на vfio-pci необходимо выполнить только один раз после загрузки. Это действительно так, но на самом деле безопасно запускать функцию « vfiobind » несколько раз, если только виртуальная машина не использует уязвимое PCI-устройство.

Если виртуальная машина использует устройство, операция отмены привязки будет заблокирована (процесс "Состояние D"). Это можно исправить, выключив или убив виртуальную машину, после чего, вероятно, удастся отменить привязку.

Вы можете избежать этого ненужного лишнего связывания и повторного связывания, изменив vfiobind() следующим образом:

vfiobind() {
        dev="$1"
        vendor=$(cat /sys/bus/pci/devices/$dev/vendor)
        device=$(cat /sys/bus/pci/devices/$dev/device)
        if [ -e /sys/bus/pci/devices/$dev/driver/module/drivers/pci\:vfio-pci ]; then
                echo "Skipping $dev because it is already using the vfio-pci driver"
                continue;
        fi
        if [ -e /sys/bus/pci/devices/$dev/driver ]; then
                echo "Unbinding $dev"
                echo $dev > /sys/bus/pci/devices/$dev/driver/unbind
                echo "Unbound $dev"
        fi
        echo "Plugging $dev into vfio-pci"
        echo $vendor $device > /sys/bus/pci/drivers/vfio-pci/new_id
        echo "Plugged $dev into vfio-pci"
}

Проверьте lspci -k для успешного подключения драйвера vfio-pci

Убедитесь, что vfio-pci во владение, используя lspci -k . Этот пример из моей эквивалентной установки:

01:00.0 VGA compatible controller: NVIDIA Corporation GK104 [GeForce GTX 760] (rev a1)
    Subsystem: eVga.com. Corp. Device 3768
    Kernel driver in use: vfio-pci
01:00.1 Audio device: NVIDIA Corporation GK104 HDMI Audio Controller (rev a1)
    Subsystem: eVga.com. Corp. Device 3768
    Kernel driver in use: vfio-pci

Если вы не видите используемый Kernel driver in use: vfio-pci , что-то пошло не так с той частью вашего скрипта, которую я вставил выше.

QEMU сквозная конфигурация

Я немного боролся с черным дисплеем.

В более ранней редакции вашего сценария вы указали:

-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 \

Попробуйте позволить QEMU решить, какую виртуальную шину и адрес использовать:

-device vfio-pci,host=01:00.0,multifunction=on,x-vga=on \
-device vfio-pci,host=01:00.1 \

Вы также должны передать -nographic и -vga none в qemu-system-x86_64 . По умолчанию QEMU показывает эмулируемую видеокарту виртуальной машине, и виртуальная машина может использовать это другое видеоустройство для отображения вместо вашей физической карты NVIDIA.

Если вы по-прежнему получаете пустой экран, попробуйте также добавить флаг -nodefaults , который исключает последовательный порт по умолчанию, параллельный порт, виртуальную консоль, устройство мониторинга, адаптер VGA, дискету и устройство CD-ROM.

Теперь ваша команда qemu-system-x86_64 должна иметь возможность запустить вашу виртуальную машину с пропущенными устройствами PCI 01:00.0 и 01:00.1 а дисплей, подключенный к 01:00.0 должен что-то показывать.

Ссылка / Пример конфигурации

Мой тест не идентичен вашему, но я смог получить рабочую графическую передачу и USB-передачу с помощью этой команды qemu-system-x86_64 после получения всех соответствующих PCI-устройств от pci-stub с помощью vfio-pci:

qemu-system-x86_64 \
-enable-kvm \
-name node51-Win10 \
-S \
-machine pc-i440fx-2.1,accel=kvm,usb=off \
-cpu host,kvm=off \
-m 16384 \
-realtime mlock=off \
-smp 8,sockets=8,cores=1,threads=1 \
-uuid 5c4a3e8a-6e8e-449f-9361-29fcdc35358d \
-nographic \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/node51-Win10.monitor,server,nowait \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=localtime,driftfix=slew \
-global kvm-pit.lost_tick_policy=discard \
-no-hpet \
-no-shutdown \
-global PIIX4_PM.disable_s3=0 \
-global PIIX4_PM.disable_s4=0 \
-boot strict=on \
-device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 \
-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5 \
-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 \
-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x5.0x2 \
-device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x6 \
-drive file=/dev/zd16,if=none,id=drive-virtio-disk0,format=raw,cache=none,aio=native \
-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 \
-drive file=/media/isos/Win10_English_x64.iso,if=none,id=drive-ide0-1-0,readonly=on,format=raw \
-device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \
-device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 \
-netdev tap,fd=24,id=hostnet0,vhost=on,vhostfd=25 \
-device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:11:bf:dd,bus=pci.0,addr=0x3 \
-chardev pty,id=charserial0 \
-device isa-serial,chardev=charserial0,id=serial0 \
-device usb-tablet,id=input0 \
-device intel-hda,id=sound0,bus=pci.0,addr=0x4 \
-device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 \
-device vfio-pci,host=01:00.1,id=hostdev0,bus=pci.0,addr=0x9 \
-device vfio-pci,host=00:12.0,id=hostdev1,bus=pci.0,addr=0x8 \
-device vfio-pci,host=00:12.2,id=hostdev2,bus=pci.0,addr=0xa \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 \
-device vfio-pci,host=01:00.0,x-vga=on \
-vga none \
-msg timestamp=on

Соответствующие предметы из lspci -k:

00:12.0 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
    Subsystem: Gigabyte Technology Co., Ltd Device 5004
    Kernel driver in use: vfio-pci
00:12.2 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
    Subsystem: Gigabyte Technology Co., Ltd Device 5004
    Kernel driver in use: vfio-pci
01:00.0 VGA compatible controller: NVIDIA Corporation GK104 [GeForce GTX 760] (rev a1)
    Subsystem: eVga.com. Corp. Device 3768
    Kernel driver in use: vfio-pci
01:00.1 Audio device: NVIDIA Corporation GK104 HDMI Audio Controller (rev a1)
    Subsystem: eVga.com. Corp. Device 3768
    Kernel driver in use: vfio-pci

Наблюдаемый результат:

Фотография наблюдаемого результата

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .