Ü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.
# | Preview | Product | Rating | Price | |
---|---|---|---|---|---|
1 | Proxmox VE 8 Praxisbuch: Informationen, Tipps und Tricks für Proxmox-Einsteiger und… | 8,55 EUR | Bei Amazon ansehen | ||
2 | Proxmox VE Homelab: Ansätze von Virtualisierung und Containerisierung von Home-Automation… | 9,10 EUR | Bei Amazon ansehen |
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.
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/
21. November 2024 um 12:43 Uhr
Danke für Ihren Beitrag.
Ich habe eine Proxmox-VM mit Plesk und diese Vm verbrauchte etwa 900 GB, obwohl die Plesk-Webprojekte nur etwa 30 GB und das VM-Backup etwa 100 GB groß waren.
Ich folgte den Anweisungen und installierte die hdparm-Pakete, aber habe eine bessere Alternative (fstrim) gefunden. Die Bereinigung wird einmal pro Woche durchgeführt, bzw. keine ständige Belastung für den Server.
Befehle:
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer
Starten Sie die Bereinigung: sudo fstrim -v /