Geben Sie nicht genutzten Speicherplatz in einer QCOW2-Image-Datei auf KVM / QEMU frei

23

wir verwenden kvm / qemu mit qcow2-images für unsere virtuellen maschinen.

qcow2 hat diese nette Funktion, bei der die Image-Datei nur den tatsächlich benötigten Speicherplatz der virtuellen Maschine zuweist. Aber wie kann ich die Image-Datei verkleinern, wenn der zugewiesene Speicherplatz der virtuellen Maschine kleiner wird?

Beispiel:

1.) Ich erstelle ein neues Bild im qcow2-Format mit einer Größe von 100 GB

2.) Ich benutze dieses Bild, um Ubuntu zu installieren. Die Installation benötigt ca. 10 GB, die Image-Datei wächst auf ca. 10 GB. bisher nichts Unerwartetes.

3.) Ich fülle das Bild mit ca. 40 GB zusätzlichen Daten. Die Image-Datei kann bis zu 50 GB groß werden. damit bin ich einverstanden :-)

4.) hier wird es merkwürdig: ich lösche alle 40 GB Daten auf dem Bild, aber die Bildgröße frisst immer noch 50 GB.

frage: wie schaffe ich es, dass 40 gb daten frei werden und schrumpfe das image auf die nur benötigten 10 gb?

danke im voraus, berni

bmaeser
quelle

Antworten:

26

Das Bild wird nicht automatisch verkleinert, da Sie beim Löschen von Dateien keine Daten löschen (daher funktioniert das Wiederherstellen). Qemu hat die Möglichkeit, qcow2-Images zurück zu verkleinern, aber das Dienstprogramm dedupliziert wirklich die Nullen von der Festplatte, wobei alle anderen Informationen intakt bleiben. Die Idee wäre also:

  1. Füllen Sie das Laufwerk mit Nullen ( dd if=/dev/zero of=/some/filebis Sie keinen Platz mehr haben)
  2. / some / file löschen
  3. Fahren Sie die VM herunter
  4. CD, wo die Images für die VM aufbewahrt und ausgeführt werden qemu-img convert -O qcow2 original_image.qcow2 deduplicated_image.qcow2
  5. Ändern Sie die VM-Einstellungen, um die neue Datei deduplicated_image.qcow2 zu verwenden, testen Sie, ob die VM funktioniert, und entfernen Sie das alte Image

Dies funktioniert afaik nur mit qcow2-Bildern, andere Formate habe ich nicht getestet.

dyasny
quelle
3
Wenn Sie einen Windows - Gaststart haben SDelete -z auf Null bis alle freien Raum (Schritte 1,2 oben)
ndemou
17

virt-sparsify kann dies alles mit weniger Aufwand für Sie erledigen: http://libguestfs.org/virt-sparsify.1.html

Eric Blake
quelle
Ich
bin
2
@dyasny Wenn die vorhandenen Antworten auf alte Fragen im Laufe der Zeit veraltet sind, lohnt es sich, eine neue Antwort zu schreiben. Diese spezielle neue Antwort entspricht jedoch möglicherweise nicht den Standards für diese Site.
Kasperd
4
@dyasny Wenn jemand sich die Mühe machen möchte, eine neue Qualitätsantwort zu schreiben, sollte er jedes Mal, wenn die alte veraltet ist, dazu ermutigt werden. Eine eingehendere Diskussion über den Umgang mit veralteten Antworten ist besser für Meta geeignet.
Kasperd
1

virt-sparsify fileA fileBwird all das tun, aber die Größe des Bildes nicht wirklich reduzieren. Dazu müssen Sie hinzufügen --compress.

cmyster
quelle