[ OK ]Initialisiere Kernel...
~/im/blog
Beauftragen

Lass uns reden

Gibt es ein Infrastrukturproblem oder wird Unterstützung bei einem Projekt benötigt? Ich stehe für neue Aufgaben zur Verfügung.

Kontakt aufnehmen

Netzwerke

Hier bin ich online zu finden.

© 2026 Irfan Miral. Alle Rechte vorbehalten.Entwickelt vonIrfan Miral
DatenschutzerklärungAGB
StartDiensteLebenslaufBlogKontaktTools
2026-04-16• 5 Min. Lesezeit

Eine KVM-VM über die CLI hochziehen

Cloud KVM Virtualization Linux Administration

Werbung

Die allererste KVM-Virtual-Machine, die man erstellt, läuft fast immer über eine grafische Oberfläche (GUI). Ob das nun virt-manager, Cockpit oder das Web-Interface von Proxmox ist – man klickt sich brav durch Festplattengrößen, Netzwerk-Bridges und ISO-Auswahlen. Das ist ein absolut legitimer Weg, um visuell zu lernen, was all diese Optionen eigentlich bedeuten.

Aber sobald man regelmäßig VMs erstellt, wird die GUI augenblicklich zum langsamsten Teil des gesamten Prozesses. Es ist eine ermüdende Abfolge von manuellen Klicks, die jedes einzelne Mal auf exakt dieselbe Art und Weise passieren muss. Und "jedes einzelne Mal auf exakt dieselbe Art und Weise" ist buchstäblich genau das, wofür die Kommandozeile (Command Line) gebaut wurde.

Die zwei Bausteine: Ein Base-Image und Cloud-Init

Anstatt manuell eine Installer-ISO zu booten und mich durch einen langsamen OS-Installationsbildschirm zu klicken, starte ich immer mit einem Cloud-Image. Das sind exakt dieselben minimalen, vorinstallierten Images, die auch die großen Cloud-Provider verwenden. Anschließend lasse ich Cloud-Init die komplette Konfiguration beim ersten Start (First-Boot) übernehmen:

# Ein Cloud-Image genau einmal herunterladen
wget https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img \
  -O /var/lib/libvirt/images/ubuntu-24.04-base.img

Die Konfiguration von Cloud-Init besteht lediglich aus zwei kleinen YAML-Dateien. Die user-data-Datei richtet automatisch den Hauptbenutzer ein, injiziert Ihren SSH-Key und führt alle Kommandos für den ersten Start aus:

# user-data
#cloud-config
hostname: app-01
users:
  - name: deploy
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo
    shell: /bin/bash
    ssh_authorized_keys:
      - ssh-ed25519 AAAA... your-key-here
package_update: true
packages:
  - curl
  - git

Die meta-data-Datei benötigt lediglich eine Instance-ID und den Hostnamen:

# meta-data
instance-id: app-01
local-hostname: app-01

Diese beiden winzigen Textdateien werden dann sauber in eine sehr kleine ISO verpackt, die Cloud-Init beim allerersten Start nativ einlesen kann:

genisoimage -output app-01-seed.iso -volid cidata -joliet -rock user-data meta-data

Die VM erstellen

Nachdem das Base-Image herüberkopiert und die Seed-ISO sauber gebaut wurde, erstellt und startet virt-install die VM tatsächlich mit einem einzigen, mächtigen Befehl:

cp /var/lib/libvirt/images/ubuntu-24.04-base.img /var/lib/libvirt/images/app-01.qcow2
qemu-img resize /var/lib/libvirt/images/app-01.qcow2 40G

virt-install \
  --name app-01 \
  --memory 4096 \
  --vcpus 2 \
  --disk /var/lib/libvirt/images/app-01.qcow2,format=qcow2,bus=virtio \
  --disk app-01-seed.iso,device=cdrom \
  --os-variant ubuntu24.04 \
  --network bridge=br0,model=virtio \
  --import \
  --noautoconsole

Das Flag --import sagt virt-install explizit, dass es das bestehende Festplatten-Image direkt booten soll, anstatt quälend langsam einen Installer auszuführen. Das Flag --noautoconsole gibt die Kontrolle sofort wieder an Ihr Terminal zurück, anstatt nervigerweise ein Konsolenfenster zu öffnen.

Innerhalb von ein bis zwei Minuten ist die VM vollständig hochgefahren. Cloud-Init hat den Benutzer deploy mitsamt dem exakten SSH-Key aus der user-data bereits angelegt, und:

ssh deploy@<vm-ip>

...funktioniert einfach sofort. Es gibt keine manuelle Betriebssystem-Installation, kein Durchklicken durch einen Setup-Assistenten und absolut keinen Zwang mehr, sich daran erinnern zu müssen, den SSH-Key danach noch manuell hinzuzufügen.

Warum sich das selbst für Einmal-VMs (One-Offs) lohnt

Der offensichtlichste Vorteil hierbei ist, dass es vollständig skriptbar ist. Packen Sie das Ganze in eine simple Shell-Funktion oder einen Ansible-Task, und das Hochziehen einer neuen VM ist plötzlich nur noch ein einziger Befehl, der lediglich einen Hostnamen als Argument verlangt.

Aber selbst für eine VM, die man wirklich nur ein einziges Mal braucht, gibt es einen wesentlich unscheinbareren, aber gewaltigen Vorteil: Die gesamte Konfiguration (Hostname, Benutzer, Basis-Pakete, SSH-Key) liegt sauber in zwei kleinen Textdateien vor, die direkt ins exakt selbe Git-Repo wandern können wie alles andere auch.

Wenn Sie sechs Monate später verzweifelt genau diese VM neu aufbauen müssen oder einfach nur wissen wollen, was genau darauf eigentlich installiert war, lautet die Antwort nicht: "Irgendwas, worauf ich damals grob geklickt habe". Die Antwort lautet: Zwei hochgradig lesbare Dateien, die Sie in exakt dreißig Sekunden überprüfen können.

Werbung

Brauchen Sie hierbei Hilfe?

Wenn Sie das Thema Proxmox-Virtualisierung & HA-Cluster lieber abgeben möchten – genau das mache ich beruflich.

Kontakt aufnehmen
VorherigerProxmox-Snapshots sind keine BackupsNächster Warum ich neben AWS immer noch OVH und Contabo empfehle