Hello.
I've been tesing VGA passthrough using libvirt.
However, My *Windows7*(64bit) Virtual Machine stopped at loading screen as
soon as I installed graphic driver(*AMD Radeon HD 7750*) and then restarted
the VM.
How Can I use VGA passthrough technology in my *Windows7* VM?
I attached my testing information(HW, system environment and settings, qemu
log and so on..)
Best Regards.
*------------------------------------- INFORMATION
------------------------------------------------------*
*<1. HW specificatioin>*
1-(1). *Motherboard*: Gigabyte Z87X-OC-CF
1-(2). *CPU*: Intel(R) Core(TM) i5-4430 CPU @ 3.00GHz
1-(3). *Video*: AMD Radeon HD 7750
1-(4). *Audio*: AMD Radeon HD 7700/7800 Series
*<2. System specification>*
2-(1). *OS*: Debian 8.5 (Jessie)
2-(2). *Kernel*: 3.16.0-4-amd64
2-(3). *qemu*: v2.1.2
2-(4). *libvirt*: v1.2.9
2-(5). *virt-manager*: v1.0.1
*<3. Testing process>*
3-(1). Execute a vfio.sh script. -> # ./vfio.sh
3-(2). Execute the following command -> # virsh create
windows7_test999_Radeon.xml
3-(3). Connect to windows7 VM via vnc viewer.
3-(4). Install AMD Radeon HD 7750 graphic driver.
3-(5). Rebooting.
3-(6). Infinite windows7 loading screen. ---> PROBLEM!!
*<4. Detailed system settings and script information>*
*4-(1). vfio.sh script*
# ./vfio.sh
=========================
#!/bin/bash
# vfio.sh
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
exit 0
========================
*4-(2). /etc/vfio-pci1.cfg*
# cat /etc/vfio-pci1.cfg
0000:01:00.0
0000:01:00.1
# lspci -nn
---SNIP---
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc.
[AMD/ATI] Cape Verde PRO [Radeon HD 7750 / R7 250E] [1002:683f]
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Cape
Verde/Pitcairn HDMI Audio [Radeon HD 7700/7800 Series] [1002:aab0]
---SNIP---
*4-(3). /etc/initramfs-tools/modules*
# cat /etc/initramfs-tools/modules
pci_stub ids=1002:683f,1002:aab0
*4-(4). dmesg | grep pci-stub*
# dmesg | grep pci-stub
[ 2.863634] pci-stub: add 1002:683F sub=FFFFFFFF:FFFFFFFF
cls=00000000/00000000
[ 2.863642] pci-stub 0000:01:00.0: claimed by stub
[ 2.863647] pci-stub 0000:02:00.0: claimed by stub
[ 2.863662] pci-stub 0000:03:00.0: claimed by stub
[ 2.863666] pci-stub 0000:04:00.0: claimed by stub
[ 2.863669] pci-stub: add 1002:AAB0 sub=FFFFFFFF:FFFFFFFF
cls=00000000/00000000
[ 2.863673] pci-stub 0000:01:00.1: claimed by stub
[ 2.863678] pci-stub 0000:02:00.1: claimed by stub
[ 2.863684] pci-stub 0000:03:00.1: claimed by stub
[ 2.863690] pci-stub 0000:04:00.1: claimed by stub
*4-(5). /etc/modules*
# cat /etc/modules
pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel
*4-(6). /etc/default/grub*
# cat /etc/default/grub
========================
# cat /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on
vfio_iommu_type1.allow_unsafe_interrupts=1"
GRUB_CMDLINE_LINUX=""
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to
Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"
# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
========================
*4-(7). Kernel module check*
# lsmod | grep pci_stub
pci_stub 12429 0
# lsmod | grep vfio
vfio_pci 31388 0
vfio_iommu_type1 17118 0
vfio 18402 2 vfio_iommu_type1,vfio_pci
# lsmod | grep kvm
kvm_intel 139116 0
kvm 388784 1 kvm_intel
*4-(8). virsh create windows7_test999_Radeon.xml*
# virsh create windows7_test999_Radeon.xml
Domain windows7_test999 created from windows7_test999_Radeon.xml
*4-(9). virsh list*
Id Name State
----------------------------------------------------
2 windows7_test999 running
*4-(10). qemu process check*
# ps aux | grep qemu
root 1283 20.4 24.1 6788084 3965048 ? SLl 16:45 16:17
qemu-system-x86_64 -enable-kvm -name windows7_test999 -S -machine
pc-i440fx-2.1,accel=kvm,usb=off -m 3815 -realtime mlock=off -smp
2,sockets=2,cores=1,threads=1 -uuid a2366bca-b992-4b02-b6ab-c6b2e8198362
-no-user-config -nodefaults -chardev
socket,id=charmonitor,path=/var/lib/libvirt/qemu/windows7_test999.monitor,server,nowait
-mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown
-boot order=dc,menu=on,strict=on -device
piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive
file=/data/iso/win7.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 -drive
file=/data/iso/virtio-win-0.1.118.iso,if=none,id=drive-ide0-1-1,readonly=on,format=raw
-device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 -drive
file=/root/virsh/win7.qcow2,if=none,id=drive-virtio-disk0,format=qcow2,cache=none
-device
virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0
-netdev tap,fd=24,id=hostnet0 -device
rtl8139,netdev=hostnet0,id=net0,mac=94:de:80:a4:4b:39,bus=pci.0,addr=0x3
-device usb-tablet,id=input0 -vnc 0.0.0.0:0 -device
cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device
vfio-pci,host=01:00.0,id=hostdev0,bus=pci.0,addr=0x6 -device
virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -msg timestamp=on
root 2228 0.0 0.0 16640 2312 pts/2 S+ 18:05 0:00 grep qemu
*4-(11). windows7_test999_Radeon.xml*
========================
<domain type='kvm' id='2'>
<name>windows7_test999</name>
<uuid>a2366bca-b992-4b02-b6ab-c6b2e8198362</uuid>
<memory unit='KiB'>3906560</memory>
<currentMemory unit='KiB'>3906252</currentMemory>
<vcpu placement='static'>2</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type>
<boot dev='cdrom'/>
<boot dev='hd'/>
<bootmenu enable='yes'/>
</os>
<features>
<acpi/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/data/iso/win7.iso'/>
<backingStore/>
<target dev='vdc' bus='ide'/>
<readonly/>
<alias name='ide0-1-0'/>
<address type='drive' controller='0' bus='1'
target='0' unit='0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/data/iso/virtio-win-0.1.118.iso'/>
<backingStore/>
<target dev='hdd' bus='ide'/>
<readonly/>
<alias name='ide0-1-1'/>
<address type='drive' controller='0' bus='1'
target='0' unit='1'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<source file='/root/virsh/win7.qcow2'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x04'
function='0x0'/>
</disk>
<controller type='usb' index='0'>
<alias name='usb0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01'
function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'>
<alias name='pci.0'/>
</controller>
<controller type='ide' index='0'>
<alias name='ide0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01'
function='0x1'/>
</controller>
<interface type='network'>
<mac address='94:de:80:a4:4b:39'/>
<source network='default'/>
<target dev='vnet0'/>
<model type='rtl8139'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x03'
function='0x0'/>
</interface>
<input type='tablet' bus='usb'>
<alias name='input0'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='5900' autoport='no'
listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
* <hostdev mode='subsystem' type='pci' managed='yes'>*
* <driver name='vfio'/>*
* <source>*
* <address domain='0x0000' bus='0x01' slot='0x00'
function='0x0'/>*
* </source>*
* <alias name='hostdev0'/>*
* <address type='pci' domain='0x0000' bus='0x00'
slot='0x06'
function='0x0'/>*
* </hostdev>*
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x05'
function='0x0'/>
</memballoon>
</devices>
</domain>
========================
*4-(12). cat /var/log/libvirt/qemu/windows7_test999.log*
# cat /var/log/libvirt/qemu/windows7_test999.log
2016-09-06 09:21:38.826+0000: starting up
LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
QEMU_AUDIO_DRV=none /usr/bin/kvm -name windows7_test999 -S -machine
pc-i440fx-2.1,accel=kvm,usb=off -m 3815 -realtime mlock=off -smp
2,sockets=2,cores=1,threads=1 -uuid a2366bca-b992-4b02-b6ab-c6b2e8198362
-no-user-config -nodefaults -chardev
socket,id=charmonitor,path=/var/lib/libvirt/qemu/windows7_test999.monitor,server,nowait
-mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown
-boot order=dc,menu=on,strict=on -device
piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive
file=/data/iso/win7.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 -drive
file=/data/iso/virtio-win-0.1.118.iso,if=none,id=drive-ide0-1-1,readonly=on,format=raw
-device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 -drive
file=/root/virsh/win7.qcow2,if=none,id=drive-virtio-disk0,format=qcow2,cache=none
-device
virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0
-netdev tap,fd=24,id=hostnet0 -device
rtl8139,netdev=hostnet0,id=net0,mac=94:de:80:a4:4b:39,bus=pci.0,addr=0x3
-device usb-tablet,id=input0 -vnc 0.0.0.0:0 -device
cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device
vfio-pci,host=01:00.0,id=hostdev0,bus=pci.0,addr=0x6 -device
virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -msg timestamp=onDomain
id=2 is tainted: high-privileges