使用 QEMU 和 KVM 进行 VGA 直通 - 屏幕上没有任何内容

使用 QEMU 和 KVM 进行 VGA 直通 - 屏幕上没有任何内容

最近几天,我一直在尝试设置带有 VGA 直通的 Windows 虚拟机,主要参考本指南:https://www.pugetsystems.com/labs/articles/Multiheaded-NVIDIA-Gaming-using-Ubuntu-14-04-KVM-585/

我的电脑使用英特尔 i7-4790 和集成英特尔 HD 4600,我将其用作主卡,还有 NVIDIA GTX 960,这是我想要传递的卡。

我安装了 NVIDIA 驱动程序,并且在 nvidia 设置中禁用混合图形后,我成功地将 nvidia 卡绑定到 vfio-pci 控制器,没有任何问题。

我尝试将 nvidia 驱动程序列入黑名单并使用 pci-stub 从它们那里“窃取” GPU,这样我就可以避免任何可能的错误,但是它没有起作用,所以我在操作系统启动后手动卸载 nvidia 模块,使用这个脚本(在控制台模式下):

#!/bin/bash
sudo service lightdm stop
sudo rmmod nvidia_uvm
sudo rmmod nvidia_drm
sudo rmmod nvidia_modeset
sudo rmmod nvidia
sudo service lightdm start

我通过移除设备(gpu)检查了这是否有效,并在重新扫描时验证了该卡是由 vfio-pci 而不是 nvidia 驱动程序声明的。

设置完所有驱动程序后,我使用以下脚本启动了虚拟机:

#!/bin/bash

sudo qemu-system-x86_64 -enable-kvm -M q35 -m 4096 -cpu host,kvm=off \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/seabios/bios.bin -vga none \
-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,x-vga=on \
-device virtio-scsi-pci,id=scsi \
-drive file=/home/xanty/windows1.img,id=disk,format=raw,cache=none,if=none -device scsi-hd,drive=disk \
-drive file=/home/xanty/Descargas/windows7pro.iso,id=isocd,cache=none,if=none -device scsi-cd,drive=isocd \
-boot menu=on

exit 0

我终于让它运行起来了,在检查 qemu 监视器上的 pci 信息时(图片在此),一切看起来都很好,但是我连接到 nvidia 卡的 DVI-I 端口的第二台显示器没有显示任何内容。显示器似乎没有收到任何信号

我需要一些帮助来弄清楚如何解决这个问题,或者至少找到这种方法的可行替代方法。

作为附加信息,我正在使用 Ubuntu Studio 16.04,我的第一台显示器是插入英特尔 DVI-I 端口的三星显示器,第二台显示器是带有一个 VGA 和一个 DVI-I 端口的 BENQ,我已将其插入 GTX 960 DVI-I 端口(此型号没有 VGA 端口)

我非常感谢您提供的任何帮助。

编辑1:

通常,在我尝试启动虚拟机之前,并且在删除 nvidia 模块之后,我会删除该设备并重新扫描它:

echo > 1 /sys/bus/pci/devices/0000:01:00.0/remove
echo > 1 /sys/bus/pci/devices/0000:01:00.1/remove
echo > 1 /sys/bus/pci/rescan

如果我这样做,虚拟机似乎可以顺利运行,不会出现重大问题,但如果不这样做,qemu 监视器在我尝试启动时会冻结,除非我“kill -9”,否则我无法关闭它或停止该进程。这是因为以下行:

-device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,x-vga=on \

如果我删除“x-vga=on”参数,它仍然可以正常工作。

编辑2: 在对此问题进行进一步测试和研究之后,我发现当我启动 kvm 时,vfio-pci 驱动程序没有启用 gpu。

启动 kvm 后,“dmesg|grep -i vfio”命令返回以下新行:

[ 1572.975051] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x1e@0x258
[ 1572.975063] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x19@0x900

应该还有另一行与此类似的:

[ 3182.192258] vfio-pci 0000:01:00.0: enabling device (0000 -> 0003)

但它不见了。

编辑3: 我刚刚降级到 Ubuntu Studio 14.04,终于能够让 pci-stub 在 nvidia/nouveau 驱动程序之前获取 gpu。我可以轻松地将 gpu 绑定到 vfio-pci 驱动程序,并且不会崩溃,启动 kvm 后的输出如下所示:

[  130.988082] vfio-pci 0000:01:00.0: enabling device (0000 -> 0003)
[  130.988186] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x1e@0x258
[  130.988196] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x19@0x900

但经历了这一切之后,显示器仍然没有收到任何信号。我真的需要一些帮助。我唯一的选择就是尝试将我的内核从4.2.0-27-低延迟4.1.x,我担心它会破坏我的操作系统。

答案1

解决了。

经过大量研究,我注意到两个主要问题:

1- 我的集成显卡 i915 驱动程序有问题,我发现要么必须用非官方补丁修补我的内核,要么在 UEFI 模式下安装我的虚拟机,并模拟 BIOS 启动。为此,我必须安装 ovmf。

apt-get install ovmf

2- Windows nvidia 驱动程序检测到我在 kvm 上运行 Windows 并且阻止了我的 gpu。

最后,安装 ovmf 后,我按照本教程了解如何使用 virt-manager 和 ovmf 进行设置: http://vfio.blogspot.com.es/2015/05/vfio-gpu-how-to-series-part-4-our-first.html

它还解释了如何编辑机器的 xml 配置以混淆 nvidia 驱动程序中的 kvm。

我还发现了一个很搞笑的特点:

如果我选择 vga 启动选项(VNC 服务器)在窗口上模拟机器,一旦窗口启动,它将窗口检测为第二个物理监视器,允许我捕获鼠标和键盘,而无需通过 USB 控制器。

相关内容