Virtualisierung mit KVM ermöglicht es, Snapshots virtueller Maschinen zu erstellen. Ein Weg führt dabei allerdings in die Sackgasse.
Snapshots virtueller Maschinen sind für viele Zwecke praktisch. Wer etwa sein System kaputtkonfiguriert, kann damit auf einen früheren Zustand, bei dem noch alles funktionierte, zürückkehren. Mit KVM/Libvirt lässt sich ein Snapshot mit einem Befehl erzeugen. Entweder mit „virsh snapshot-create“, das ein XML-File erwartet, das den Snapshot genauer definiert, oder „virsh snapshot-create-as“, das die meisten Werte einfach mit Defaults vordefiniert:
$ virsh snapshot-create-as test Domain snapshot 1495450809 created $ virsh snapshot-list test Name Creation Time State ------------------------------------------------------------ 1495450809 2017-05-22 13:00:09 +0200 running
Genauso einfach kehren Sie zu einem alten Zustand wieder zurück, entweder über den Namen oder mit „–current“ zum neuesten Snapshot:
$ virsh snapshot-revert --current test
Ein weiterer Virsh-Befehl entfernt den Snapshot wieder:
$ virsh snapshot-delete --current test Domain snapshot 1495450809 deleted </bash> Alle das funktioniert aber nur, wenn das von der VM verwendete Image im QCOW2-Format gespeichert ist. Denn Libvirt unterscheidet zwischen sogenannten internen und externen Snapshots. Die internen Snapshots sichern auch den aktuellen Zustand der VM und funktionieren nur mit QCOW2. Die externen Snapshots sichern nur den Disk-Zustand und lassen sich auch mit Raw-Images erstellen. Leider haben die Entwickler auf halber Strecke Halt gemacht und externe Snapshots nicht komplett implementiert. Red Hat schreibt in seiner Dokumentation dazu lapidar: "At the moment external snapshots are a one-way operation as libvirt can create them but cannot do anything further with them." Deshalb sind externe Snapshots im Moment nicht besonders nützlich, können aber andererseits hinderlich sein, wenn Sie etwa aus Versehen einen externen Snapshot angelegt haben und dann die VM löschen möchten. Denn die Virt-Tools verweigern nicht nur das Löschen einer VM, wenn es noch Snapshots davon gibt, sie erlauben es auch nicht, einen externen Snapshot einfach zu löschen, wie die folgende Befehlskette zeigt: <code bash> $ virsh snapshot-create-as test2 error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw $ virsh snapshot-create-as --disk-only test2 Domain snapshot 1495451275 created $ virsh snapshot-revert --current test2 error: unsupported configuration: revert to external snapshot not supported yet $ virsh snapshot-delete --current test2 error: Failed to delete snapshot 1495451275 error: unsupported configuration: deletion of 1 external disk snapshots not supported yet
Die Lösung aus diesem Dilemma besteht darin, zuerst die „Metadaten“ des externen Snapshots zu entfernen und dann das Image von Hand zu löschen:
$ virsh snapshot-delete --current --metadata test2 Domain snapshot 1495451275 deleted # ls -l /var/lib/libvirt/images/test2* -rw------- 1 libvirt-qemu kvm 983040 Mai 22 13:10 test2.1495451275 -rw-r--r-- 1 libvirt-qemu kvm 10737418240 Mai 22 13:07 test2.img
# rm /var/lib/libvirt/images/test2.1495451275
— Marko Oldenburg 2023/02/11 08:27