KVM unter Debian 10 mit Windows 10 VM

Ziel

Es soll auf einem Hetzner Server KVM installiert werden und eine virtuelle Maschine mit Windows 10 darauf laufen. Hetzner bietet virtuelle MAC Adressen für einzelne IPs an. Das heißt die VM hat danach ihre eigene IP und bekommt über Hetzner mittels DHCP die zusätzliche IP Adresse zugeteilt.

Hinweis

Ich bin kein Profi auf diesem Gebiet. Da ich im Netz keine vernünftige Anleitung gefunden habe, die all meine Anforderungen abdeckt, habe ich mich dazu entschlossen selbst eine zu schreiben. Habt ihr Verbesserungen oder Kommentare, dann würde ich mich freuen wenn ihr einen Kommentar dalassen würdet. Natürlich auch gerne wenn ich euch mit dem Beitrag helfen konnte.

Vorbereitung

Zunächst prüfen wir ob unsere CPU Virtualisierung unterstütz:

egrep -c '(vmx|svm)' /proc/cpuinfo

Sofern hier farbig “vmx” (Intel) oder “svm” (AMD) auftaucht, unterstützt die CPU Virtualisierung und wir können loslegen.

Installation der benötigen Pakete:

apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virtinst libvirt-daemon virt-manager -y

Wenn alles geklappt hat sollte der Service laufen. Dies prüfen wir mit folgendem Befehl:

systemctl status libvirtd.service

solltet ihr hier folgende Ausgabe sehen, war die Installation erfolgreich:

● libvirtd.service - Virtualization daemon
   Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset:
   Active: active (running) since Sat 2020-10-10 21:36:43 CEST; 5min ago

Um die Maschinen später als normaler User verwalten zu können, erstellen wir einen neuen Benutzer. In meinem Beispiel nenne ich diesen “vmmanager” (denkt daran die Pfade anzupassen, da euer User vermuztlich anders heisst). Der Benutzer wird nun den entsprechenden Gruppen hinzugefügt:

adduser vmmanager libvirt
adduser vmmanager libvirt-qemu

Im Anschluss werden die Gruppen neu eingelesen:

newgrp libvirt
newgrp libvirt-qemu

Wie ich festgestellt habe reicht dies jedoch nicht aus. Mit dem normalen User ohne sudo sieht man z.B. die virtuellen Netzwerke der VM nicht. Um die Funktionen komplett nutzen zu können, brauchen wir noch ein paar weitere Schritte.

Wir bearbeiten die /etc/libvirt/libvirt.conf und entfernen das # bei folgenden Eintrag (dieser Eintrag wird aktiv):

uri_default = "qemu:///system"

Die Datei müssen wir außerdem in das Home Verzeichnis unseres Users kopieren. In meinem Fall (Debian 10) muss die Datei hierhin:

/home/vmmanager/.config/libvirt/libvirt.conf

Nun entfernen wir bei 2 Optionen den Kommentar Tag # in folgender Datei: /etc/libvirt/libvirtd.conf

unix_sock_group = "libvirt"
unix_sock_rw_perms = "0770"

Anschließend wird der libvirt Dienst neu gestartet:

systemctl restart libvirtd.service

Nun geht es daran die virtuellen Maschinen zu erstellen. Hierzu brauchen wir ein paar ISOs. Erstellt euch am besten irgendwo einen Ordner in dem alle vDisks sowie Images liegen. In meinem Fall liegt der Ordner in /home/vmmanager/kvm. Darin befindet sich für jede Maschine noch ein Unterordner.

In diesen Unterordner (ihr könnt das wie gesagt auch anders machen) stellen wir nun unser Betriebssystem ISO, die virtuelle Festplatte sowie die VirtIO Treiber für die Installation bereit.

Die HDD erstellen wir mit folgendem Befehl im RAW Format (dieses Format bietet meines Wissens die beste Performance, jedoch braucht sie auch sofort den ganzen Platz auf der Host HDD):

qemu-img create -f raw -o preallocation=full win10disk.img 400G

Die Windows 10 ISO könnt ihr euch per Media Creation Tool von Microsoft erstellen: https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
Die VirtIO Treiber findet ihr hier: https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

Netzwerk richtig konfigurieren

Bei Hetzner sieht eine Standardkonfiguration der /etc/network/interfaces so aus:

### Hetzner Online GmbH installimage

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback
iface lo inet6 loopback

auto enp35s0
iface enp35s0 inet static
  address <main-ip-v4>
  netmask <main-netmask-v4>
  gateway <main-gateway-v4>

iface enp35s0 inet6 static
  address <main-ip-v6>
  netmask 64
  gateway <main-gateway-v6>

ACHTUNG:
Je nach Anbieter unterscheidet sich ggf. die Konfiguration. Denkt dran, dass ihr euch von eurem Server aussperrt, wenn die Netzwerkkonfiguration nicht richtig angegeben ist. Im Falle von Hetzner ist das kein Problem, weil man die Konfigurationsdatei mittels Rescue System jederzeit anpassen kann. Ob ihr die Möglichkeit bei eurem Anbieter hat, kann ich natürlich nicht sagen.

Da wir für unsere Konfiguration eine Bridge brauchen, ändern wir die obigen Werte ab, damit unsere Datei zum Schluss so aussieht:

### Hetzner Online GmbH installimage

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback
iface lo inet6 loopback

auto  br0
iface br0 inet static
  address <main-ip-v4>
  netmask <main-netmask-v4>
  gateway <main-gateway-v4>
  bridge_ports enp35s0
  bridge_stp off
  bridge_fd 1
  bridge_hello 2
  bridge_maxage 12

Wie ihr seht entfällt die Konfiguration von enp35s0 komplett und wir haben nur noch das Interface br0. Startet den Server nun neu um die Konfiguration zu übernehmen.

Erstellen der ersten VM

Kommen wir nun zur eigentlichen Installation der virtuellen Maschine:

virt-install \
--name=gameserver-windows \
--ram=16384 \
--cpu=host \
--vcpus=4 \
--os-type=windows \
--os-variant=win10 \
--cdrom /home/vmmanager/kvm/gameserver-windows/windows.iso \
--disk path=/home/vmmanager/kvm/gameserver-windows/virtio-win.iso,device=cdrom \
--disk path=/home/vmmanager/kvm/gameserver-windows/win10.raw,format=raw,bus=virtio,size=400 \
--network bridge=br0 \
--graphics vnc,password=yourSecureVNCInstallPasswordFor,listen=0.0.0.0

Verbindet euch jetzt über einen VNC Viewer zu eurem Server. Wenn dies die erste VM ist die VNC benutzt, dann erreicht ihr euren Server (als Beispiel hat dieser die IP 192.168.0.1) unter folgender Adresse: 192.168.0.1:0 im VNC Viewer.

Denkt daran später per

virsh edit <NameDeinerVirtuellenMaschine>

den Eintrag für VNC zu entfernen oder die Listen Adresse auf 127.0.0.1 umzustellen um VNC wieder zu deaktivieren

Tuning von AMD CPUs

Vielen Danke an Mathias Hueber, der mir mit seinem Beitrag enorm geholfen hat. Die VM erkennt den Ryzon 3700x als das was er ist und nicht als “generic processor” oder sonstiges.

Um das ganze zu erreichen, muss man mittels virsh edit <NameDeinerVirtuellenMaschine> die VM bearbeiten und ändert dann die werte von CPU wie hier angegeben:

<cpu mode='host-passthrough' check='none'>
    <topology sockets='1' cores='4' threads='2'/>
    <cache mode='passthrough'/>
    <feature policy='require' name='topoext'/>
    <!-- add additional cpu features here-->
 </cpu>

Weiterführende Webseiten

Folgende Webseiten haben mir geholfen mein Projekt umzusetzen und diesen Beitrag zu schreiben. Diese möchte ich hier lobend erwähnen:

https://mathiashueber.com/performance-tweaks-gaming-on-virtual-machines
https://linuxhint.com/install_kvm_debian_10/
https://www.linuxtechi.com/install-configure-kvm-debian-10-buster/
https://computingforgeeks.com/use-virt-manager-as-non-root-user/
https://serverfault.com/questions/803283/how-do-i-list-virsh-networks-without-sudo
https://www.sysorchestra.com/hetzner-root-server-with-kvm-ipv4-and-ipv6-networking/
https://community.hetzner.com/tutorials/install-and-configure-proxmox_ve/de#Netzwerkkonfiguration_KVM
https://docs.hetzner.com/de/robot/dedicated-server/network/net-config-debian/

Filed under: Debian, Virtualisierung, Windows

No comment yet, add your voice below!


Add a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Comment *
Name *
Email *
Website