Virtuelle Maschinen mit KVM/QEMU auf jedem Linux Server

Nachdem ich vieles immer gerne „von Hand“ mache um zu verstehen wie es funktioniert gibt es hier mal eine Anleitung wie man auf einem Hetzner Root-Server (mit zusätzlicher IP) eine virtuelle Maschine (in dem Fall Ubuntu Linux) betreibt.


Natürlich muss die Maschine nicht Linux sein und auch der Hoster muss nicht Hetzner sein 🙂
Wenn man sich die Arbeit sparen möchte und einfach nur unkompliziert virtuelle Maschinen laufen lassen will empfehle ich die Linux-Distribution Proxmox VE (auf Debian passierend).
Damit kann man virtuelle Maschinen einfach per Klick verwalten und auch ein User-Control Panel anlegen wenn man einem Bekannten eine virtuelle Maschine einrichten will auf die dieser (in bestimmten Rahmen) Vollzugriff hat (er sie also rauf-, und runterfahren kann, nicht aber die Plattenkapazität beliebig erhöhen!).
Nachteil der Lösung ist natürlich dass man nun als Hostsystem nicht das geliebte Ubuntu hat sondern ein Hostsystem was eigentlich nur fürs hosten von virtuellen Maschinen gedacht ist.

In meinem Fall aber ist das Hostsystem ein Ubuntu. Damit bin ich quasi aufgewachsen 🙂

Jetzt aber los, zuerst installieren wir mal ein paar Pakete die natürlich direkt in den Paketquellen von Ubuntu beinhaltet sind:

apt-get install qemu-system-x86 qemu-system kvm screen bridge-utils uml-utilities

Nun konfigurieren wir (per Symbolic Link) die Standardarchitektur von QEMU auf 64Bit. Unser Host ist schließlich ein 64Bit System und deswegen kann er VMs mit gleicher Architektur am besten virtualisieren.

ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu

Nun erzeugen wir uns ein paar Ordner wo unsere Daten rein sollen (ich hab hier der Einfachheit halber mal alles mit dem User ‚root‘ durchgeführt. Das ist natürlich nicht ratsam für den Dauerbetrieb, macht uns aber erstmal am wenigsten Probleme!):

mkdir /root/qemu
mkdir /root/qemu/VM
mkdir /root/qemu/ISO
mkdir /root/qemu/Snapshots

Nun laden wir uns ein Ubuntu-Server System unserer Wahl runter:

cd /root/qemu/ISO
wget http://releases.ubuntu.com/14.04.1/ubuntu-14.04.1-server-amd64.iso

Für dieses System brauchen wir auch noch eine Platte. Diese erzeugt QEMU mit folgendem Kommando (in dem Fall: 50 GB):

qemu-img create /root/qemu/VM/tcv1_ubuntu_14_04.img 50G

Jetzt kommt eine Hetzner-Spezialität, wir müssen für unsere IP (5.9.93.48) eine Netzwerkbrücke eintragen, denn alle Pakete für unsere extra IPs (die wir bei Hetzner gebucht haben) kommen dort an und sollten von dort aus abhängig von der MAC-Adresse (man muss für die extra gebuchten IPs eine eigene MAC-Adresse einstellen bei Hetzner) an die einzelnen VMs geroutet werden.
Die Netzwerkbrücke definieren wir in der Datei /etc/network/interfaces – hier der komplette nötige Inhalt:

# /etc/network/interfaces

# Loopback device:
auto lo
iface lo inet loopback

# Haupt-IP als Netzwerkbruecke
auto vmbr0
iface vmbr0 inet static
       address                 5.9.93.48
       netmask                 255.255.255.255
       gateway                 5.9.93.33
       pointopoint             5.9.93.33
       bridge_ports            eth0
       bridge_stp              off
       bridge_fd               1
       bridge_hello            2
       bridge_maxage           12

So, und bevor wir nun unsere VM starten, starten wir eine screen-Session in der die VM laufen soll:

screen

Jetzt aber los., wir starten eine Maschine ohne Grafikausgabe mit 512 MB Ram. Die Konsole ist über VNC auf Port 5901 (Standardport ist 5900 und wir haben ‚:1‘ angegeben) zu erreichen. Außerdem stecken wir unsere CD ins Laufwerk, booten von der CD und geben die feste MAC-Adresse an. (5.9.93.33 ist die IP unseres Hosts für die VNC-Verbindung, 00:50:56:00:67:C3 ist die MAC-Adresse unserer extra IP).
Achja und das Tastaturlayout ist deutsch:

qemu -enable-kvm -hda /root/qemu/VM/tcv1_ubuntu_14_04.img -device e1000,netdev=net0,mac=00:50:56:00:67:C3 -netdev tap,id=net0 -cdrom /root/qemu/ISO/ubuntu-14.04.1-server-amd64.iso -boot d -m 512 -nographic -vnc 5.9.93.33:1,password -monitor stdio -k de

Wir sind nun in der QEMU-Konsole. Hier müssen wir dem VNC-Server noch ein Passwort geben:

change vnc password

Und schon kann man sich über VNC (IP 5.9.93.33 Port 5901) verbinden und den Server über VNC bequem installieren.

Wenn die virtuelle Maschine mal fertig installiert ist kann man die CD aus dem Laufwerk nehmen und VNC nicht aktivieren:

qemu -enable-kvm -hda /root/qemu/VM/tcv1_ubuntu_14_04.img -device e1000,netdev=net0,mac=00:50:56:00:67:C3 -netdev tap,id=net0 -boot d -m 512 -nographic -vnc none -monitor stdio -k de

Man kann VNC jederzeit nachträglich in der Konsole über folgendes Kommando aktivieren:

change vnc 5.9.93.33:1
change vnc password

Und deaktiveren:

change vnc none

Mittels dem folgenden Kommado kann man der Maschine übrigens mehr Prozessoren geben:

-cpu host -smp 4

QEMU erlaubt auch das simulieren jeglicher Prozessorarchitekturen (diese muss dann statt ‚host‘ angegeben werden). Das ist aber natürlich aus Performancegründen nicht ratsam.

Ich selbst betreibe mehrere virtuelle Maschinen damit. Unter anderem Windows10, Ubuntu und CentOS und hatte bislang keinerlei Probleme.
Klar, es ist alles handgestrickt und selber gemacht und es gibt wahrscheinlich viel bessere Lösungen, aber mal eben so schnell auf einem x-beliebigen Linux-Rechner ne VM zu starten geht mit diesen Befehlen schon recht einfach, ohne dass man groß etwas installieren müsste.

Weitere Hintergrundinfos zu QEMU: Ubuntuusers.de
Hier gibts noch Infos aus dem Hetzner WIKI zu extra IPs und deren Routing: Proxmox VE

18 Antworten auf „Virtuelle Maschinen mit KVM/QEMU auf jedem Linux Server“

  1. Darf ich fragen warum du die Maschine in einer Screen-Session startest? Normalerweise läuft diese doch unter libvirt bzw. mit libvirt und wird mittels virsh oder ähnlichem administriert. Die Screen-Session hat in der Regel ja keinen Einfluss darauf ob die Maschine läuft oder nicht. Bzw starte mal die Maschine mit Screen und kill die Session unter virsh müsstest du dann sehen das die weiterhin läuft.

    1. Hallo Max,

      sobald ich Qemu starte bin ich in der QEMU Konsole und komme aus dieser nicht mehr raus.
      Ein beenden mit Strg+C beendet auch die virtuelle Maschine.
      Auch der Versuch QEMU als Job in den Hintergrund zu verfrachten funktionierte leider auch nicht. Der Job steht einfach auf ‚Stopped‘ und die virtuelle Maschine fährt nicht hoch.

      Das killen des Screens von außen (in dem Fall mit „screen -X -S [PID] quit“) lässt auch die virtuelle Maschine sterben.

      Jeder Screen für jede VM hat einen eigenen Namen und ich kann mit ’screen -ls‘ sehen welche Maschinen laufen und mit ’screen -r PID‘ auf die Konsole der Maschine kommen. Find das ganz praktisch.

      Ich hab mich mit der Screen Lösung ganz gut arrangiert, wenns eine bessere gibt wäre ich aber für Input dankbar!

      Thomas

      1. Also wenn du nur Qemu nutzt dann erschliesst sich mir das mit dem Screen, benutze den virt-manager, virt-installer und virsh zur Verwaltung deiner Büchsen das funktioniert zuverlässing und die laufen quasi im Background.

        1. Hallo Max,

          von dem Weg hatte ich auch schon gehört. Klang mir bislang zu kompliziert.
          Aber ich werds mal ausprobieren, danke für den Tipp!

          Thomas

    1. Gerne!

      Geht das auch nur über SSH? Nehme ich mal an…

      Hast ein paar einfache Befehle oder nen Link für mich?

      Thomas

        1. Hmmm…
          Sieht super aus. Aber wie erstell ich da eine neue VM?
          Ich sehe nur einen Befehl um eine VM auf Basis einer .xml-Datei zu erzeugen.
          Wenn ich die aber nicht habe?

            1. Hallo Max,

              das sieht natürlich tatsächlich viel komfortabler aus 🙁
              Wenn ich meinen dedizierten Server auf dem meine VMs laufen neu aufsetzen muss würde ich wahrscheinlich darauf setzen.
              Danke, Max – hat sich doch das aufsetzen dieses WordPress-Blogs schon gelohnt!

                1. Also bei meinem root-Server kann ich nicht mit 100 Punkten dienen, aber immerhin mit 93 – das ist dann ein B 🙂

                  Das Blog verschlüsselt zu übertragen hab ich natürlich vor – hatte nur was rumoren hören dass all-inkl (wo das Blog gehostet wird) da auch eine Automatik zum Einspielen von Letsencrypt Zertifikaten machen will, somit muss ich keines extra kaufen.
                  Bei netcup z.B. geht das schon einwandfrei!

                  Hab mal den all-inkl Support angeschrieben, mal sehen was der sagt.

                  UPDATE: Hab das Support-Ticket verfasst um ~08:00 Uhr, und zehn Minuten später bekomm ich schon die Nachricht dass das Zertifikat eingespielt ist und in 5 Minuten aktiv sein wird. WOW!!!

  2. Unter Ubuntu 16 wollte sich qemu so leider nicht starten lassen, ich habe immer eine Fehlermeldung erhalten:

    „QEMU 2.5.0 monitor – type ‚help‘ for more information
    (qemu) qemu: cannot use stdio by multiple character devices
    qemu: could not connect serial device to character backend ’stdio'“

    Nach langer Recherche und Testen habe ich eine Lösung dafür gefunden:

    „-monitor stdio -serial none“

    1. Hallo bluepuma,

      cool, danke für den Hinweis!
      Ich habs bislang tatsächlich erst unter Ubuntu 14.04 getestet gehabt!

      Thomas

    2. Hallo bluepuma,

      hab jetzt meinen Host upgedatet von Ubuntu 14.04 auf Ubuntu 16.04.
      Bekam den Fehler:
      (qemu) qemu: cannot use stdio by multiple character devices
      qemu: could not connect serial device to character backend 'stdio'

      beim Start von Qemu.

      Und zwar wurde da der Bug korrigiert dass die Eingabe nach dem laufen lassen von Qemu nicht mehr richtig funktioniert (wenn mans unter einem Screen startet merkt man das nicht!).

      Dein Tipp hat jedenfalls geholfen. Vielen Dank!

      Thomas

      PS: Eine zweite Warnung bekam ich noch:
      WARNING: Image format was not specified for '/root/qemu/VM/winexchange.img' and probing guessed raw.
      Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
      Specify the 'raw' format explicitly to remove the restrictions.

      Da muss man aus
      -hda /root/qemu/VM/meinevm.img
      einfach
      -drive format=raw,file=/root/qemu/VM/meinevm.img
      machen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.