Archlinux KVM Qemu Windows10 with Graphic Passthrough

in kvm •  7 years ago  (edited)

Archlinux KVM Qemu Windows10 with Graphic Passthroughkvm_001.jpg

1.) intel_iommu=on # kann am boot eintrag angefügt werden für Intel

z.b.: options root=LABEL=ROOT rootflags=subvol=@snapshots/TESTING rw intel_iommu=on

2.) ### Mkinticpio.conf
MODULES="vfio vfio_iommu_type1 vfio_pci vfio_virqfd"

3.) ### nano /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:1b81,10de:10f0 #### ids anpassen

4.) mkinitcpio -p linux

5.) ### Eine Textdatei zum starten ersten z.b.: win10.sh

#!/bin/bash

Schaltet den Monitor fuers System um immer anpassen

xrandr --output DP-4 --off --output HDMI-0 --mode "1920x1080" --rate 60 --primary

DEVICE1="03:00.0"
DEVICE2="03:00.1"

SNAP="1"
PREFIX="SPIELE"
USER=$USER
PFAD="/KVM/VMs" ## "/winssd/vms/$USER" ##
INSTALL_IMG="$PFAD/windows10_sys.qcow2"
SNAPSHOT_IMG="$PFAD/windows10_sys_$PREFIX.qcow2.ovl"

SPIELEDATEN_IMG="/KVM/VM_Daten/$USER/windows10_spieledaten.qcow2"

Erstellt die Systemfestplatte für die Installation

if [ ! -e $INSTALL_IMG ]; then
qemu-img create -f qcow2 -o lazy_refcounts=on $INSTALL_IMG 233G
fi

Erstellt einen Snapshot auf dem dann weiter gearbeitet wird

if [ "$SNAP" == "1" ]; then
if [ ! -e $SNAPSHOT_IMG ]; then
#qemu-img create -f qcow2 -o backing_file=$INSTALL_IMG, backing_fmt=qcow2 $SNAPSHOT_IMG
qemu-img create -b $INSTALL_IMG -f qcow2 $SNAPSHOT_IMG
fi
INSTALL_IMG=$SNAPSHOT_IMG
fi

Erstellt die Systemfestplatte für die Installation

if [ ! -e $SPIELEDATEN_IMG ]; then
qemu-img create -f qcow2 -o lazy_refcounts=on $SPIELEDATEN_IMG 4T
fi

QEMU name and PID

OPTS="$OPTS -name windows-10-$PREFIX"
OPTS="$OPTS -pidfile /tmp/windows-10_$PREFIX.pid"

Processor typen wie core2duo qemu64 host

OPTS="$OPTS -cpu host,kvm=off"
OPTS="$OPTS -smp 8,sockets=1,cores=4,threads=2"
OPTS="$OPTS -enable-kvm"

Machine

OPTS="$OPTS -machine type=pc-i440fx-2.10,accel=kvm"

Die folgende einstellung aktiviert S3 (suspend to RAM). OVMF unterstuetzt S3

suspend/resume. Ist abgeschaltet wenn Q35 genutzt wird

OPTS="$OPTS -global PIIX4_PM.disable_s3=0"

Arbeitsspeicher

OPTS="$OPTS -m 16384"

Harware Uhr

OPTS="$OPTS -rtc base=localtime,driftfix=slew"

Soundkarte

export QEMU_AUDIO_DRV=alsa
export QEMU_ALSA_ADC_BUFFER_SIZE=1024 QEMU_ALSA_ADC_PERIOD_SIZE=256
export QEMU_ALSA_DAC_BUFFER_SIZE=1024 QEMU_ALSA_DAC_PERIOD_SIZE=256
export QEMU_AUDIO_DAC_FIXED_SETTINGS=1
export QEMU_AUDIO_DAC_FIXED_FREQ=92000 QEMU_AUDIO_DAC_FIXED_FMT=S16 QEMU_AUDIO_ADC_FIXED_FREQ=92000 QEMU_AUDIO_ADC_FIXED_FMT=S16
export QEMU_AUDIO_DAC_TRY_POLL=1 QEMU_AUDIO_ADC_TRY_POLL=1
export QEMU_AUDIO_TIMER_PERIOD=80
OPTS="$OPTS -soundhw hda"

#export QEMU_PA_SAMPLES=1024
#export QEMU_AUDIO_TIMER_PERIOD=80
#export QEMU_AUDIO_DRV=pa ##dsound pa
#export QEMU_PA_SERVER=/run/user/1000/pulse/native
#OPTS="$OPTS -soundhw hda"

Grafikkarte passthrough/durchreichen (Geforce GTX 1070)

OPTS="$OPTS -device vfio-pci,host=$DEVICE1,multifunction=on,x-vga=on"

USB vorbereitungen

OPTS="$OPTS -usb"

#xset led 3 ; sleep 0.25 ; xset -led 3
#sleep 0.5s
BUSID=007 # lsusb | grep 'Microdia' | grep -Eo '\<[[:digit:]]{1,3}\>' | head -n 1 | sed -e 's/^0*//'
#sleep 2.5s
#xset led 3 ; sleep 0.25 ; xset -led 3

#BUSID=006 ## lsusb | grep 'Microsoft Corp. Wireless XBox Controller Dongle' | grep -Eo '\<[[:digit:]]{1,3}\>' | head -n 1 | sed -e 's/^0*//'

USB 2.x passthrough/durchreichen

OPTS="$OPTS -device usb-host,hostbus=$BUSID,hostport=1.1" # Tastatur
OPTS="$OPTS -device usb-host,hostbus=$BUSID,hostport=1.2" # Trust Maus
OPTS="$OPTS -device usb-host,hostbus=$BUSID,hostport=1.3" # KVM Switch

USB 3.x passthrough/durchreichen

OPTS="$OPTS -usbdevice host:0x0d8c:0x000c" # Sound C-Media Electronics, Inc. Audio Adapter

OPTS="$OPTS -usbdevice host:0x0a12:0x0001" # Cambridge Silicon Radio, Ltd Bluetooth Dongle

OPTS="$OPTS -usbdevice host:0x0eb7:0x0197" # Fanatec Lenkrad Endor AG

OPTS="$OPTS -usbdevice host:0x045e:0x0719" # XBox 360 Kontroller

OPTS="$OPTS -usbdevice host:0x045e:0x02e6" # XBox One Kontroller Wireless Stick

Boot Reihenfolge

OPTS="$OPTS -boot order=c"

OVMF BIOS EFI

cp /KVM/ovmf/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd /8tb_Raid0/KVM/Win10/Bios/my_vars_$PREFIX.fd
OPTS="$OPTS -drive if=pflash,format=raw,readonly,file=/KVM/ovmf/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd"
OPTS="$OPTS -drive if=pflash,format=raw,file=/KVM/Win10/Bios/my_vars_$PREFIX.fd"

System Laufwerk(e)

OPTS="$OPTS -drive id=disk0,if=none,cache=none,format=qcow2,file=$INSTALL_IMG"
OPTS="$OPTS -device driver=virtio-scsi-pci,id=scsi0"
OPTS="$OPTS -device scsi-hd,drive=disk0"

Spiele usw Laufwerk(e)

#OPTS="$OPTS -drive id=disk1,if=none,cache=none,format=qcow2,file=$SPIELEDATEN_IMG"
#OPTS="$OPTS -device driver=virtio-scsi-pci,id=scsi1"
#OPTS="$OPTS -device scsi-hd,drive=disk1"

Weiteres Laufwerk mit einem Echten Datetraeger (block kopieren f. weitere laufwerke)

#OPTS="$OPTS -drive id=disk2,if=none,cache=none,format=raw,file=/dev/disk/by-id/PLATTENID"
#OPTS="$OPTS -device driver=virtio-scsi-pci,id=scsi2"
#OPTS="$OPTS -device scsi-hd,drive=disk2"

Virtio Treiber

OPTS="$OPTS -drive id=virtiocd,if=none,format=raw,file=/KVM/KVM_Treiber/virtio-win-0.1.141.iso"
OPTS="$OPTS -device driver=ide-cd,bus=ide.1,drive=virtiocd"

Netzwerk

OPTS="$OPTS -netdev tap,id=br0,vhost=on,ifname=tap0,script=/KVM/Netzwerk/br0-ifup,downscript=/KVM/Netzwerk/br0-ifdown -device virtio-net-pci,netdev=br0"

Disable display

OPTS="$OPTS -vga none"
OPTS="$OPTS -serial null"
OPTS="$OPTS -parallel null"

echo "password"|sudo -S taskset -c 0-8 qemu-system-x86_64 $OPTS

Schaltet die alten Einstellungen fuer den Monitor wieder an (immer anpassen)

xrandr --output DP-4 --mode "1920x1080" --rate 60 --primary --output HDMI-0 --off

6.) ### Netzwerk scripte erstellen fuer zur laufzeit erstellte br0 z.b.: br0-ifup

#!/bin/sh
set -x

switch=br0

if [ -n "$1" ];then
brctl addbr $switch
sleep 0.5s
ip tuntap add $1 mode tap user whoami
sleep 0.5s
ip link set dev $1 up promisc on
sleep 0.5s
brctl addif $switch eno1
sleep 0.5s
LIPCheck=$(ip addr show eno1 | grep -Eo '<[[:digit:]]{1,3}(.[[:digit:]]{1,3}){3}>')
if [ -n "$LIPCheck" ];then
ip addr add 192.168.5.240/24 broadcast 192.168.5.255 dev $switch
else
ip addr add 192.168.5.3/24 broadcast 192.168.5.255 dev $switch
fi
sleep 0.5s
ip link set dev $switch up
sleep 0.5s
link set $1 master $switch
sleep 0.5s
#if [ -n "$LIPCheck" ];then
# echo "Alles Gut: Hier gibt es eine IP Adresse..."
#else
# ip link set dev eno1 down
# sleep 0.5s
# ip link set dev eno1 down
# sleep 0.5s
# systemctl restart [email protected]
# sleep 0.5s
#fi
brctl addif $switch $1
sleep 0.5s
ip route del default via 192.168.5.1
sleep 0.5s
ip route add default via 192.168.5.1
else
echo "Error: no interface specified"
exit 1
fi

7.) ### Netzwerk script erstellen fuer zur laufzeit beendete br0 z.b.: br0-ifdown

#!/bin/sh
set -x

if [ -n "$1" ];then
ip link set dev $1 down
sleep 0.5s
ip link del $1
sleep 0.5s
ip link set dev br0 down
sleep 0.5s
brctl delbr br0
sleep 0.5s
LIPCheck=$(ip addr show eno1 | grep -Eo '<[[:digit:]]{1,3}(.[[:digit:]]{1,3}){3}>')
if [ -n "$LIPCheck" ];then
echo "Alles Gut: Hier gibt es eine IP Adresse..."
else
systemctl restart [email protected]
fi
sleep 0.5s
ip route del default via 192.168.5.1
sleep 0.5s
ip route add default via 192.168.5.1
else
echo "Error: no interface specified"
exit 1
fi

Bei fragen helfe ich gerne weiter...

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!