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 qemu-utils -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/
Sebastian meint
Danke für den hilfreichen Eintrag!
Beim Konfigurieren der Netzwerkbrücke ist es ggf. nötig, das Netzwerkdevice zu initialisieren. Also die Zeile
iface enp35s0 inet manual
einfügen. Andernfalls kann es sein, dass das Hostsystem nach einem Reboot nicht per Netzwerk erreichbar ist.
Heinz meint
Klasse Anleitung ich habe die ganzen letzten tage nach exat so einer anleitung gesucht. Wirklich Spitze !!!
Vielen Dank hierfür.
Gruß Heinz
Kolja meint
Top Anleitung. Aber so funktioniert ipv6 nicht Mehr auf dem host!
Florian meint
Das ist klar, wie es mit IPv6 geht habe ich nicht versucht, da ich kein IPv6 brauche.