Hi!
I've been trying to get PCI/GPU passthrough to work for a few days but
I've hit a wall. I can't get any video output from the passed GPU. I'm
trying to virtualize Windows 10 Home Edition. I've been using the
following guides:
- Arch Wiki: https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF
- Reddit:
https://www.reddit.com/r/linuxmasterrace/comments/2z30dq/gpu_passthrough_or_how_to_play_any_game_at_near/?st=j1kioetn&sh=a198702b
- http://vfio.blogspot.com/
- Level1Techs:
https://forum.level1techs.com/t/play-games-in-windows-on-linux-pci-passthrough-quick-guide/108981
My hardware should support this:
- OS: Arch Linux with kernel version 4.10.9-1-ARCH
- CPU: Intel Core i5-6600K (supports VT-d and VT-x)
- GPU: Intel HD Graphics 530 (iGPU, used by Linux)
- GPU: AMD Radeon R9 380 (passed through)
- Mobo: Asus Z170 Pro Gaming (if I'm interpreting the manual
correctly, hardware virtualization should be supported)
- RAM: 2x4GB Kingston Savage DDR4-3000
VT-d is enabled from the UEFI BIOS and IOMMU is enabled in the kernel.
This can be confirmed with `dmesg | grep -i iommu`:
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-linux
root=UUID=c6c3c8f3-030c-4dce-be63-8938386ac963 rw quiet intel_iommu=on
[ 0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-linux
root=UUID=c6c3c8f3-030c-4dce-be63-8938386ac963 rw quiet intel_iommu=on
[ 0.000000] DMAR: IOMMU enabled
...
The Radeon GPU and its HDMI audio controller are using the vfio-pci
driver and are in the IOMMU group 1 with a PCIe controller. Output of
`lspci -nnk`:
...
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices,
Inc. [AMD/ATI] Tonga PRO [Radeon R9 285/380] [1002:6939] (rev f1)
Subsystem: Micro-Star International Co., Ltd. [MSI] Device
[1462:2015]
Kernel driver in use: vfio-pci
Kernel modules: amdgpu
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI]
Tonga HDMI Audio [Radeon R9 285/380] [1002:aad8]
Subsystem: Micro-Star International Co., Ltd. [MSI] Device
[1462:aad8]
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel
...
vfio-pci is running properly, as proved by `dmesg | grep -i vfio`:
[ 0.773952] VFIO - User Level meta-driver version: 0.3
[ 0.774978] vfio-pci 0000:01:00.0: vgaarb: changed VGA decodes:
olddecodes=io+mem,decodes=io+mem:owns=none
[ 0.789351] vfio_pci: add [1002:6939[ffff:ffff]] class
0x000000/00000000
[ 0.806016] vfio_pci: add [1002:aad8[ffff:ffff]] class
0x000000/00000000
[ 2.767507] vfio-pci 0000:01:00.0: vgaarb: changed VGA decodes:
olddecodes=io+mem,decodes=io+mem:owns=none
[ 1310.412510] vfio-pci 0000:01:00.0: enabling device (0000 -> 0003)
QEMU, libvirt, OVMF and virt-manager are installed and libvirtd-daemon
is running. Output of `systemctl status libvirtd`:
● libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service;
enabled; vendor preset: disabled)
Active: active (running) since Sat 2017-04-15 12:16:01 EEST; 24h ago
Docs: man:libvirtd(8)
http://libvirt.org
Main PID: 469 (libvirtd)
Tasks: 21 (limit: 4915)
CGroup: /system.slice/libvirtd.service
├─469 /usr/bin/libvirtd
├─708 /usr/bin/dnsmasq
--conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro
--dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
├─709 /usr/bin/dnsmasq
--conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro
--dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
├─754 /usr/bin/dnsmasq
--conf-file=/var/lib/libvirt/dnsmasq/wireless.conf --leasefile-ro
--dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
└─755 /usr/bin/dnsmasq
--conf-file=/var/lib/libvirt/dnsmasq/wireless.conf --leasefile-ro
--dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
I setup my VM with virt-manager like this (exact steps):
1. Create a new QEMU/KVM VM from local install media
2. Use a Windows 10 ISO image found from the hard disk. OS type and
version are detected properly.
3. Use default settings for RAM and CPU: 4096 MiB and 2 cores
4. Create custom storage in /opt/os-storage/win10.qcow2 with size of
60 GiB
5. Check "Customize configuration before install" and click Finish
6. In "Overview":
- Change Firmware to UEFI x86_64: /usr/share/ovmf/x64/ovmf_x64.bin
- Chipset is "i440FX" and Architecture "x86_64"
7. In "CPUs":
- Change Model to "host-passthrough"
8. In "IDE Disk 1":
- Change Disk bus to "VirtIO"
- Change Cache mode to "writeback"
9. In "IDE CDROM 1":
- Connect it to the Win10 ISO
- Change Disk bus to "SATA"
10. In "NIC ...":
- Change Device model to "virtio"
11. In "Controller USB":
- Change Model to "USB 3"
12. Click "Add Hardware"
- Add Storage (Disk device) in
$HOME/os-images/storage/win10-data.qcow2 with size of 400 GiB
- Change Bus type to "VirtIO"
- Change Cache mode to "writeback"
13. Click "Add Hardware"
- Add Storage (CDROM device) connected to virtio drivers from Red
Hat website
- Change Bus type to "SATA"
- Change Cache mode to "Hypervisor default"
14. In "Boot Options":
- Check "Enable boot menu"
- Check "VirtIO Disk 1" and "SATA CDROM 1" from the list
I clicked "Begin Installation". It booted successfully to the
installation media. I was able to load the VirtIO SCSI driver and see my
virtual drives. Then I stopped the installation.
15. Remove "Tablet", "Display Spice", "Sound: ich6", "Serial 1",
"Channel spice", "Video QXL", "USB Redirector 1" and "USB Redirector 2"
16. Click "Add Hardware" and add two "PCI Host Device"s:
- 0000:01:00:0 ... Tonga PRO...
- 0000:01:00.1 ... Tonga HDMI Audio...
I clicked the big play-button and changed my monitor input to the
dedicated GPU, and it detected no signal. Virtual console said
"Graphical console not configured for guest". The system is clearly
starting up: it's allocating RAM and using the processor. I tried the
same in Fedora 24 earlier this week but it failed in the same stage.
Here's the log file from /var/log/libvirt/qemu/win10.log:
https://pastebin.com/DSCW0VXP
I don't know if there are some other log files I'd need to include since
I'm not too familiar with KVM.
What I've tried:
- Different Linux distros: Fedora 24 earlier this week, now Arch
- Different chipsets: i440FX and Q35, with same results
- pci-stub instead of vfio-pci
- It's now faulty cable, I'm using it right now
- Adding `<vendor_id state='on' value='whatever'/>` to `virsh edit`
- Probably many more things I can't recall right now
I asked the same question over at SuperUser but figured that there'd be
more knowledgeable people here.
Thank you,
Elias Kosunen
_______________________________________________
vfio-users mailing list
vfio-users@redhat.com
https://www.redhat.com/mailman/listinfo/vfio-users