Über die Zeit werden die VM-Dateien Qcow2 immer größer und verbrauchen unter Umständen viel Speicherplatz auf dem Hostsystem. Das kommt davon das virtuellen Maschinen gelöschte Bereiche nur als gelöscht markieren und auf dem Partition nicht freigeben und als ganze null definieren. Also wird z.B. eine 1GB große Datei gelöscht und Ihr habt keine SSD mit der Trim Funktion aktiv im Einsatz, dann wird dieser gelöschte Bereich in dem Qcow2 Diskimage nicht wieder freigegeben. Die VM selber weiß natürlich das dieser Speicherplatz wieder frei ist, aber bis zum Hostsystem kommt diese Information nicht durch.

Es gibt 2 Lösungen für dieses Problem

SSD mit TRIM Funktion (Proxmox Discard)

Die meisten SSDs haben heutzutage die Trim Funktion mit dabei. Das bewirkt lediglich das diese Löschkommandos von der VM bis zur SSD durchgereicht werden und gelöschte Objekte in gänze freigegeben werden bis runter auf die Festplatte. In Proxmox müsst Ihr dazu in den Optionen der Hard Disk die Discard Funktion aktivieren. Alle zukünftig gelöschten Teilbereiche werden direkt bis runter auf die SSD als wieder frei gekennzeichnet und in der Qcow Datei wird der Speicherplatz auch wieder freigegeben.

Discard aktivieren in Proxmox für die SSD Trim Funktion
Discard aktivieren in Proxmox für die SSD Trim Funktion

Wer noch zusätzlich überprüfen möchte ob seine verbaute SSD diese Trim Funktion unterstützt, kann sich dies mit folgendem Befehl anzeigen lassen.

sudo hdparm -I /dev/sda | grep -i TRIM

Als Ausgabe kann in etwa das erwartet werden:

root@server:~#  hdparm -I /dev/sda | grep -i TRIM
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read data after TRIM

Das QCOW2 Disk Image verkleinern und optional Komprimieren

Wer keine Festplatte hat mit der Trim-Funktion wird wohl das Problem haben, dass das Imagefile immer weiter anwächst. Jetzt bleibt einem nur übrig das Qcow Image zu Konvertieren. Bei diesem Konvertieren-Prozess werden alle gelöschten Bereiche (Nullen, Zeros) wieder freigegeben und ein neues Qcow2 Image erzeugt.

  • Als erstes die Virtuelle Maschine herunterfahren (Shutdown)
  • Wechselt auf dem Proxmox-Host in das Verzeichnis wo in der Regel die Disk-Images abgelegt sind. (Bei Proxmox üblicherweise in /var/lib/vz/images/<VMID>)
  • Erstellt nun eine Kopie von eurem Disk-Image
cp <IMAGE>.qcow2 <IMAGE>_backup.qcow2
  • Jetzt wird von der „Backup“ Image-Datei das neue Image geschrieben bzw. Konvertiert. Hier ergibt sich noch die Möglichkeit das Image direkt zu Komprimieren. Das verringert zwar die Größe des Images, aber geht auch ein bisschen zur Lasten den CPU im späteren Betrieb.
#Konvertieren und Nullen löschen OHNE Komprimierung
qemu-img convert -O qcow2 <IMAGE>_backup.qcow2 <IMAGE>.qcow2
#Konvertieren und Nullen löschen MIT Komprimierung
qemu-img convert -O qcow2 -c <IMAGE>_backup.qcow2 <IMAGE>.qcow2
  • Nun kann man die VM wieder starten und überprüfen ob alles in-Ordnung ist.
  • Wenn alles OK ist, kann die „_backup.qcow2“ Datei wieder gelöscht werden.

Schlusswort

Dieser Artikel entsteht im Jahre 2020 und ich bin der Meinung, dass bis jetzt zumindest alle im Umfeld von Virtualisierung benutzten Festplatten die TRIM Funktion mit dabei haben sollten. Wenn das der Fall sein sollte, überprüft ob die Discard Option in den Hard Disk Einstellungen gesetzt ist. Es passiert sehr schnell das dies vergessen wird, da das Häkchen kein Default Wert ist.
Ansonsten der Prozess zum manuellen Verkleinern der Images ist natürlich kein wöchentlicher Prozess, sondern bei schnelllebigen VMs 1x im Quatal und bei normalen 1x im Jahr. Das sollte jedenfalls ausreichen, um nicht zu viel Speicherplatz belegt zu haben, welcher eigentlich frei sein könnte.

Eine Videoanleitung gibt es auch: https://schroederdennis.de/allgemein/qcow2-image-verkleinern-unter-proxmox/

Ich hoffe diese Anleitung hat geholfen! Gibt es Ergänzungen oder Verbesserungen? Dann lass es mich bitte gerne über die Kommentare wissen. Danke 🙂

Dennis Schröder – Geiler Typ