带 GPU 直通功能的 QEMU 无法启动

带 GPU 直通功能的 QEMU 无法启动

我正在运行 Ubuntu,并尝试使用 GPU 直通配置 QEMU。我遵循以下指南:

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=""

我的GPU:

$ 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.bashhttp://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 GPU 的显示器是黑色的,它应该由 QEMU 打开,但它没有。我做错了什么?我该如何调试它?我还能尝试什么来实现 GPU 直通?

我检查了使用本指南而且我的 GPU 似乎不支持 UEFI,所以也许这就是失败的原因?还是很奇怪,许多人都取得了成功使用更旧的 GPU,所以一定有办法。

编辑:我刚刚尝试libvirt使用来运行虚拟机virt-manager,正如@Deltik 所建议的那样。我的配置如下:http://pastebin.com/W46kNcrh

virt-manager结果与之前几乎相同 - 它启动了,在窗口中显示黑屏,没有其他任何事情发生。调试控制台中没有错误(我通过运行来启动它virt-manager --debug)。我也在 Arch Linux 和较新版本的 Ubuntu 上尝试了同样的方法,没有任何区别。

我已经将赏金给了@Deltik,因为他给了我一些很好的建议,但我仍然无法让它工作。看来这个任务是不可能完成的,至少在我目前的硬件上是不可能完成的。

答案1

你很接近了。

使用pci-stubvfio-pci

可以使用pci-stub来保留 PCI 设备(例如您的 GPU)以防止图形驱动程序抓取它,因为图形驱动程序(例如nouveaufglrx)不会放弃该设备。

事实上,在我的测试中,我需要先声明 PCI 显卡,pci-stub因为vfio-pci在启动时无法这样做,这是您遇到的问题之一。虽然卸载一个驱动程序 ( pci-stub) 并加载另一个驱动程序 ( vfio-pci) 代替它可能会对某些人来说似乎很丑陋pci-stubvfio-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-pcivfiobind除非虚拟机目前正在使用受影响的 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应该显示一些内容。

参考/示例配置

我的测试与您的不完全相同,但在qemu-system-x86_64声明所有相关的 PCI 设备后,我能够使用此命令获得有效的图形直通和 USB 直通:pci-stubvfio-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

观察结果:

观察结果照片

相关内容