3 Min. Lesezeit
Mit Ubuntu Cloud Images arbeiten
Ubuntu von einer ISO-Datei zu installieren heisst, sich jedes Mal durch einen Installer zu klicken. Die Cloud Images von Ubuntu ersparen das. Sie sind vorinstallierte Disk-Images, dieselben, die Cloud-Anbieter starten, und sie richten sich beim ersten Start mit cloud-init selbst ein: Hostname, Benutzer, SSH-Schlüssel, Pakete.
Auf einem Linux-Rechner mit KVM dauert eine frische VM aus einem Cloud Image etwa eine Minute. Diese Notiz zeigt den ganzen Weg, mit Ubuntu 24.04 als Host und als Gast.
1. Hardware-Virtualisierung prüfen
KVM braucht eine CPU mit Intel VT-x oder AMD-V:
egrep -c '(vmx|svm)' /proc/cpuinfo
0 heisst, dass die CPU es nicht unterstützt oder es im BIOS bzw. UEFI ausgeschaltet ist. Alles über 0 passt.
2. KVM und libvirt installieren
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst cloud-image-utils
| Paket | Wofür |
|---|---|
qemu-kvm |
Der Emulator, der die Virtualisierung der CPU nutzt |
libvirt-daemon-system |
Der Dienst, der VMs, Disks und Netzwerke verwaltet |
libvirt-clients |
virsh, die Kommandozeile für libvirt |
virtinst |
virt-install, das VMs anlegt |
cloud-image-utils |
cloud-localds, das den cloud-init-Seed baut |
Um VMs ohne sudo zu verwalten, füg dich der Gruppe libvirt hinzu und melde dich danach ab und wieder an:
sudo adduser $USER libvirt
Ohne sudo verbindet sich virsh standardmässig mit einer privaten Sitzung pro Benutzer, nicht mit dem systemweiten libvirt, in dem die VMs unten leben. Zeig ihm die Systemverbindung und schreib die Zeile in dein Shell-Profil:
export LIBVIRT_DEFAULT_URI=qemu:///system
Prüf, ob libvirt antwortet:
virsh list --all
Eine leere Tabelle ist die richtige Antwort. Ein «Permission denied» heisst meistens, dass die neue Gruppe noch nicht aktiv ist. Läuft der Dienst nicht, startest du ihn mit sudo systemctl enable --now libvirtd.
3. Ein Cloud Image herunterladen
Cloud Images sind keine ISO-Dateien. Es sind Disk-Images im Format qcow2, veröffentlicht auf cloud-images.ubuntu.com. Bewahr eine Kopie als schreibgeschützte Basis auf:
sudo mkdir -p /var/lib/libvirt/images/base
sudo wget -O /var/lib/libvirt/images/base/noble.img \
https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
Die Images liegen unter /var/lib/libvirt/images, damit der QEMU-Benutzer von libvirt sie lesen kann. Images im Home-Verzeichnis scheitern oft an fehlenden Rechten.
4. Jeder VM eine eigene Disk geben
Starte das Basis-Image nicht direkt. Leg eine neue Disk an, die es als Backing File nutzt. Die VM speichert nur ihre eigenen Änderungen, also kostet eine neue VM fast keinen Platz, und die Basis bleibt sauber:
sudo qemu-img create -f qcow2 -F qcow2 \
-b /var/lib/libvirt/images/base/noble.img \
/var/lib/libvirt/images/vm1.qcow2 20G
20G ist die Grösse, die die VM sieht. Die Datei wächst erst, wenn die VM Daten schreibt.
5. Den cloud-init-Seed schreiben
cloud-init liest seine Konfiguration von einer kleinen Disk, die an der VM hängt. Zwei Dateien kommen hinein.
user-data richtet die Maschine ein. Trag deinen eigenen öffentlichen SSH-Schlüssel ein:
#cloud-config
hostname: vm1
users:
- name: dev
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAA... you@laptop
package_update: true
packages:
- htop
meta-data benennt die Instanz:
instance-id: vm1
local-hostname: vm1
Bau aus beiden Dateien die Seed-Disk:
sudo cloud-localds /var/lib/libvirt/images/vm1-seed.iso user-data meta-data
6. Die VM starten
virt-install \
--name vm1 \
--memory 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vm1.qcow2,format=qcow2 \
--disk path=/var/lib/libvirt/images/vm1-seed.iso,device=cdrom \
--os-variant ubuntu24.04 \
--network network=default \
--import \
--graphics none \
--noautoconsole
--import sagt virt-install, dass es die vorhandene Disk starten soll, statt einen Installer auszuführen.
7. Verbinden
Nach ein paar Sekunden hat die VM eine Adresse im Standardnetz von libvirt:
virsh domifaddr vm1
ssh dev@<IP_ADRESSE>
Erscheint noch keine Adresse, warte einen Moment: cloud-init läuft beim ersten Start noch.
Aufräumen
Entferne die VM und ihre Disks, wenn du fertig bist. Das Basis-Image bleibt für die nächste:
virsh destroy vm1
virsh undefine vm1 --remove-all-storage
Eine neue VM sind wieder die Schritte 4 bis 6, mit einem anderen Namen.