Archlinux KVM Qemu Windows10 with Graphic Passthrough

in #kvm7 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...