我正在运行 Ubuntu,并尝试使用 GPU 直通配置 QEMU。我遵循以下指南:
https://www.youtube.com/watch?v=w-hOr44oBAI
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.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 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-stub
和vfio-pci
可以使用pci-stub
来保留 PCI 设备(例如您的 GPU)以防止图形驱动程序抓取它,因为图形驱动程序(例如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
应该显示一些内容。
参考/示例配置
我的测试与您的不完全相同,但在qemu-system-x86_64
声明所有相关的 PCI 设备后,我能够使用此命令获得有效的图形直通和 USB 直通: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
观察结果: