Glücklicherweise geht das Klonen einer existierenden virtuellen Maschine einfacher vonstatten. Dazu gibt es unter den Tools der Libvirt das Programm
»virt-clone
«
, das eine virtuelle Maschine komplett kopiert. Leider muss man beim derzeitigen Stand der Technik dazu das Ursprungssystem pausieren. Als Parameter sind hinter
»-o
«
die Original-VM, mit
»-n
«
der Name der neuen VM und mit
»-f
«
der Name des neu entstehenden Disk-Images anzugeben. Alternativ bietet
»virt-clone
«
mit
»-a
«
auch einen Modus, in dem es selbst die passenden Namen wählt.
Versagen die Tools der Libvirt auf mysteriöse Weise ihren Dienst, liegt das möglicherweise daran, dass sie den KVM-Hypervisor nicht finden, der auch auf einer anderen Maschine laufen kann. Um ihn zu finden, bieten alle Programme den Parameter
»-c
«
oder
»--connect
«
, hinter dem die URI des Hypervisors folgt. Beim lokalen System sieht das etwa so aus:
virsh -c qemu:///system list
Dauerhaft für die Shell-Sitzung setzt man diesen Wert am besten mit der entsprechenden Umgebungsvariablen:
export LIBVIRT_DEFAULT_URI=qemu:///system
Drei Aufrufe auf der Kommandozeile pausieren dann die laufende VM, fertigen ein Klon-System an und setzen den Betrieb der Original-VM wieder fort:
virsh suspend oldvm virt-clone -o oldvm -n newvm -f /var/lib/libvirt/images/newvm.qcow virsh resume oldvm
Per Default vergibt
»virt-clone
«
für die Netzwerkkarte der neuen virtuellen Maschine eine zufällig erzeugte MAC-Adresse. Zwar lässt sich auch per
»-m
«
von Hand eine solche Adresse übergeben, das ändert jedoch nichts an dem nun auftretenden Problem, dass in manchen Netzwerk-Skripts der geklonten Maschine die MAC-Adresse der Original-VM steht, etwa bei Red Hat Enterprise Linux und Fedora die Dateien
»/etc/sysconfig/network-scripts/ifcfg-eth0
«
und
»/etc/udev/rules.d/70-persistent-net.rules
«
.
Man könnte nun die geklonte VM booten und zum Beispiel per SSH die Dateien editieren, eleganter geht es aber mit dem Guestfish-Tool, das das Editieren von Dateien eines Gastsystems erlaubt. Dazu bietet es nach dem Mounten des Dateisystems den eingebauten Befehl
»edit
«
. Automatisieren lässt sich dies mittels des mitgelieferten Skripts
»virt-edit
«
, das mit dem Schalter
»-e
«
auch die Ersetzung von Strings beherrscht. Die MAC-Adressen der alten und der neuen VM lassen sich beispielsweise ihren jeweiligen XML-Konfigurationsdateien entnehmen und mit einem Befehl ersetzen:
virt-edit newvm /etc/sysconfig/network-scripts/ifcfg-eth0 -e "s/Alte-MAC-Adr/Neue-MAC-Adr/"
Ebenso verfährt man mit den oben erwähnten Udev-Regeln. Auch der Hostname lässt sich auf diesem Weg so ersetzen, dass er dem beim Klonen vergebenen entspricht. Auf den Red-Hat-Systemen ist dazu die Datei
»/etc/sysconfig/network
«
zu ändern.
Zum mehr oder weniger automatisierten Klonen von virtuellen Maschinen kann man beispielsweise in einer kleinen Textdatei Buch über die vergebenen Ziffern führen oder sich mit
»virsh list --all
«
alle VMs anzeigen lassen und dann hochzählen. Ein Beispiel für ein solches Skript, das virtuelle Maschinen so verwaltet, gibt
Listing 1
. Den Ablauf des Skripts zeigt
Abbildung 1
.
Listing 1
clone-vm
Um passwortloses Login per SSH zu ermöglichen, gibt es wiederum mehrere Wege. Ist das virtuelle System schon übers Netz erreichbar, kann man zum Beispiel mit
»ssh-copy-id
«
den Schlüssel in den entsprechenden Account in der VM kopieren. Alternativ bietet es sich auch an, die Datei
».ssh/authorized_keys
«
mit dem nötigen Public Key auszustatten und das Verzeichnis
».ssh
«
mit
»virt-copy-in
«
in die noch nicht gebootete VM zu kopieren.