
Ich habe viele Stunden damit verbracht, im Internet nach Möglichkeiten zur Verkleinerung von KVM-Virtual-Disk-Images zu suchen, insbesondere für Windows-Gäste, aber ohne Erfolg.
Ich habe lediglich herausgefunden, dass ich den freien Speicherplatz der VM auf Null setzen, die virtuelle Festplatte (unter Windows) defragmentieren und dann qemu-img convert -c ...
( -c
Flag zum Komprimieren) ausführen muss.
Ich habe eine Windows 7-VM mit einer virtuellen Laufwerksgröße von 100 GB. Anfangs verbrauchte dieses VDD 40 GB auf dem Host-Speicher. Sobald es auf Null gesetzt ist, verbraucht das VDD tatsächlich 100 GB auf dem Host. Und qemu-img -c ...
erstellt 91 GB, was überhaupt nicht meinen Erwartungen entspricht.
Auf der Modernie-Website können wir W7-VMs herunterladen, die kleiner als 10 GB sind. Wie ist das möglich? Gibt es eine Möglichkeit, die VM-Images „wirklich“ zu komprimieren?
Dank @dyasny habe ich einen kleinen Test mit durchgeführt virt-sparsity
. Ich habe die W7-VM-Festplatte bereinigt, den Ruhezustand deaktiviert, sodass die VDD nur 20 GB verbraucht. Habe die Festplatte erneut herabgestuft und erneut ausgeführt sdelete -z
. Das Ausführen virt-sparsity
mit dem --compress
Flag ergibt ein virtuelles Laufwerk mit 80 GB. Weit entfernt von dem, was ich erhofft hatte.
EDIT-2016-02-16: Ich „aktualisiere“ diese Frage, weil die hier besprochene Methode zum Verkleinern einer VM zwar sehr effizient ist, aber einen großen Nachteil hat: Sie löscht alle VM-Snapshots. Wenn jemand weiß, wie man eine VM verkleinert und dabei die Snapshots beibehält, kann er es gerne weitergeben!
Antwort1
Um ein Windows-Gastbetriebssystem zu verkleinern, müssen Sie die Partition innerhalb des Gastes verkleinern, die VM herunterfahren, eine neue kleinere Festplatte der gewünschten Größe erstellen, die Daten von der alten Festplatte auf die neue kleinere Festplatte kopieren, die Festplattennamen austauschen und die VM neu starten.
Dies ist unkompliziert, kann jedoch bei unsachgemäßer Anwendung zum Verlust von Daten – und Haaren – führen.
Hier sind die Schritte für KVM mit einem Windows Server 2012-Gast mit 100 GB, den wir mithilfe des QCOW2-Formats auf 35 GB verkleinern möchten.
WICHTIG: Bei dieser Methodekeine Modifikation der virtuellen MaschineDefinition. Stattdessen erfordert es nurDisk-Image-Manipulationen.
Annahmen für den Gast:
- Gast ist ein Windows Server 2012
- Disk-Image von 100 GB im QCOW2-Format
- Zwei Partitionen:
- 350 MB Boot
- 99,6 GB des Laufwerks C: mit 20 GB genutztem Speicherplatz
- Wir wollen C: von 99,6 GB auf 34 GB verkleinern
Annahmen für den Host:
- Ubuntu 16 LTS-Server
- KVM (libvirt)
- 250 GB-Laufwerk
- Virtuelle Bilder befinden sich in /var/lib/libvirt/images
SCHRITT 1: Vorbereitung des Windows-Gasts, Verkleinerung der Hauptpartition C:
In diesem Schritt reduzieren wir unsere Windows-Partitionen direkt von Windows aus. Das resultierende Disk-Image am Ende dieses Schritts ist die Summe der Startpartition, des Laufwerks C: (reduziert) und eines verbleibenden ungenutzten Speicherplatzes, den wir löschen werden (indem wir ihn nicht auf eine neue Festplatte kopieren).
- Melden Sie sich beim Windows-Gast an
- Öffnen Sie das Dienstprogramm „Computerverwaltung“, indem Sie es mit der Suchfunktion des Startmenüs suchen.
- Klicken Sie auf der linken Seite auf „Speicher->Datenträgerverwaltung“Screenshot der Speicherdatenträgerverwaltung
- Klicken Sie auf dem neuen Bildschirm mit der rechten Maustaste auf die Partition C: und klicken Sie auf „Volume verkleinern …“. Es sollte ein wenig dauern, bis ein Dialogfeld angezeigt wird. Haben Sie etwas Geduld.
Sobald das Dialogfenster „C: verkleinern“ angezeigt wird, geben Sie unter „Zu verkleinernder Speicherplatz“ die Größe des Speicherplatzes ein, die den Wert „Gesamtgröße nach Verkleinerung in MB“ auf die gewünschten 35 GB bringt. Klicken Sie dann auf „Verkleinern“.
NOTIZ: Möglicherweise erhalten Sie eine Fehlermeldung, wenn der neue Speicherplatz zu klein ist. In diesem Fall sollten Sie die „Zu verkleinernde Speicherplatzmenge“ schrittweise um 1 GB reduzieren, bis der Fehler verschwindet und die Verkleinerung erfolgt. In der Praxis behalten wir gerne 10 GB freien Speicherplatz.
Nehmen wir an, Sie konnten die Partition C: auf 34 GB verkleinern.
Wenn Sie fertig sind, fahren Sie die VM herunter, indem Sie eine Eingabeaufforderung öffnen und Folgendes eingeben:
shutdown /s /t 0
- Ihr Windows-Gast ist bereit.
SCHRITT 2: Verkleinerung der Festplatte auf dem VM-Host
Bei dem Vorgang handelt es sich nicht wirklich um eine Verkleinerung. Stattdessen erstellen wir eine neue Festplatte (mit der endgültigen Größe), auf die wir die beiden Partitionen der Originalfestplatte kopieren und den ungenutzten Speicherplatz nicht übertragen.
Das Ziel ist, eine Festplatte zu erstellen, deren Gesamtgröße der Bootpartition + Partition C: entspricht. Außerdem bleibt ein wenig Speicherplatz übrig (es sei denn, Ihre Berechnung war perfekt), über den Sie sich aber keine Sorgen machen müssen, da wir uns im letzten Schritt darum kümmern.
- Melden Sie sich beim Linux-Host an
- zum Superuser wechseln:
sudo su
- Gehen Sie zum Speicherort der virtuellen Bilder:
cd /var/lib/libvirt/images
- Listen Sie die Dateien auf:
ls -l
- Suchen Sie Ihr Gastabbild (es gibt jede Menge Tutorials dazu an anderer Stelle). Nehmen wir an, unser Windows-Gastabbild heißt „windows.qcow2“
wir machen ein Backup:
mkdir backup cp windows.qcow2 backup/windows.qcow2.bak
(gehen Sie einen Kaffee trinken, da dies bei einer großen Festplatte eine Weile dauern wird)
Installieren Sie GuestFS-Pakete, die Ihnen möglicherweise fehlen:
apt-get install libguestfs-tools
Okay, überprüfen wir unsere Windows-Festplatte noch einmal, indem wir das Windows-Image mit folgendem untersuchen
virt-filesystems
:virt-filesystems --long --parts --blkdevs -h -a windows.qcow2
die folgendes ausgibt:
Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 34G /dev/sda /dev/sda device - 100G -
Beachten Sie, dass dies
/dev/sda1
unsere Windows-Startpartition mit 350 MB ist,/dev/sda2
dies unsere C:-Partition mit jetzt 34 GB ist und dass das gesamte Disk-Image/dev/sda/
100 G groß ist, sodass uns eine Menge Platz zum Reduzieren bleibt.Hier ist also der wichtige Schritt: Rechnen Sie nach: 34 G + 350 M passen in 35 G, daher erstellen wir ein Image mit 35 GB. Es wird zwangsläufig etwas Platz übrig bleiben – es sei denn, Ihre Berechnungen sind perfekt – aber machen Sie sich darüber keine Sorgen, wir kümmern uns weiter unten darum.
Lassen Sie uns die neue virtuelle QCOW2-Festplatte
newdisk.qcow2
mit einer Gesamtgröße von 35 GB erstellen:qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 35G
welches ausgibt:
Formatting 'newdisk.qcow2', fmt=qcow2 size=37580963840 encryption=off cluster_size=65536 preallocation=metadata lazy_refcounts=off refcount_bits=16`
Ändern wir die Größe der Festplatte, indem wir die alte Festplatte auf die neu zugewiesene kopieren. Das ist der Teil, der absolut genial ist. Die meisten anderen Anleitungen zeigen furchtbar komplizierte Dinge. Das geht ganz einfach mit diesem Befehl, danach sollten Sie sich einen Kaffee holen – das wird wahrscheinlich eine Weile dauern:
virt-resize windows.qcow2 newdisk.qcow2`
die folgendes ausgibt:
[ 0.0] Examining windows.qcow2 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? --:-- ********** Summary of changes: /dev/sda1: This partition will be left alone. /dev/sda2: This partition will be left alone. There is a surplus of 439.8M. An extra partition will be created for the surplus. ********** [ 8.8] Setting up initial partition table on newdisk.qcow2 [ 9.9] Copying /dev/sda1 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00 [ 15.1] Copying /dev/sda2 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00 Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly.
Beachten Sie, dass das Tool überschüssigen Speicherplatz gefunden hat. Erinnern Sie sich an die Kommentare zu Math. Sie können also den Vorgang abbrechen und die Festplatte neu erstellen oder einfach weitermachen, wie wir es hier tun, und die
sda2
Partition erweitern, wie in SCHRITT 3 beschrieben.Sobald dies erledigt ist, überprüfen Sie das resultierende Bild:
virt-filesystems --long --parts --blkdevs -h -a newdisk.qcow2
die folgendes ausgibt:
Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 34G /dev/sda /dev/sda3 partition 83 439.8M /dev/sda /dev/sda device - 35G -
Beachten Sie, dass der Typ
/dev/sda3
für den verbleibenden Speicherplatz Linux ist. Der übrig gebliebene Speicherplatz ist in Ordnung, es sei denn, Sie haben genau richtig gerechnet. Wir werden uns weiter unten mit dieser zusätzlichen Partition vom Windows-Gast befassen. Ignorieren Sie sie jetzt einfach.Tauschen Sie die Disk-Images aus:
mv windows.qcow2 backup/ mv newdisk.qcow2 windows.qcow2
Starten Sie Ihre VM.
SCHRITT 3: Abschließen des Festplattenvorgangs auf dem Windows-Gast
In diesem Schritt bestätigen wir, dass Windows ordnungsgemäß startet, und erweitern unsere C-Partition um den zusätzlichen Speicherplatz.
Melden Sie sich beim Windows-Gast an
Öffnen Sie das Dienstprogramm „Computerverwaltung“, indem Sie es mit der Suchfunktion des Startmenüs suchen.
Klicken Sie auf der linken Seite auf „Speicher->Datenträgerverwaltung“
Sie sollten drei Partitionen sehen: Boot, C: und eine kleine 439-MB-Partition (ganz rechts).Screenshot der Computerverwaltung mit den 3 Partitionen
Löschen Sie die Linux-Partition durch Rechtsklick -> Volume löschen. (Klicken Sie bei jeder Eingabeaufforderung auf „Ja“)
Klicken Sie mit der rechten Maustaste auf die Partition C: und klicken Sie auf „Erweitern“, dann auf „Weiter“ und „OK“ in den Dialogen. Es sollte nur eine Erweiterung um die Größe der letzten Partition angeboten werden. Sobald Sie fertig sind, haben Sie die Größe von C: geändert und haben nur noch zwei Partitionen übrig.
Das ist alles. Ihr Windows-Gast nutzt jetzt nur noch etwa 35 GB. Denken Sie daran, dass das eigentliche Disk-Image aufgrund des gesamten Overheads usw. größer sein kann (es könnte näher an 38 GB liegen).
Überprüfen Sie, ob alles ordnungsgemäß funktioniert, und löschen Sie Ihre Image-Backups oder verschieben Sie sie offline in den Speicher.
Antwort2
Ich habe es endlich geschafft, den VM-Speicherplatz wirklich zu verkleinern. Zu Beginn hat die W7-VM 107 GB des Host-Speichers verbraucht. Die virtuelle Festplattengröße beträgt 100 GB und derzeit verbraucht die VM nur 18 GB ihres virtuellen Speichers.
Folgendes habe ich getan:
- Bereinigen Sie das virtuelle Laufwerk (entfernen Sie temporäre Dateien usw.).
- Defragmentierung mit der Open Source-Software UltraDefrag mit „vollständiger Optimierung“
- Laufen
sdelete -c c:
- Laufen
sdelete -z c:
- Laufen
qemu-img convert -c -f qcow2 w7-64.qcow2 -O qcow2 w7-64-compressed.qcow2
Auf diese Weise wurde die qcow2-Datei von 107 GB auf ... 7 GB verkleinert!
Antwort3
Wenn Sie ausführen qemu-img -c
, komprimieren Sie das Image. Dadurch wird zwar etwas Platz gespart, die Leistung kann jedoch erheblich beeinträchtigt werden. Wenn Sie die Nullen auf der Festplatte deduplizieren möchten, müssen Sie ausführen qemu-img convert
, im Grunde so, als ob Sie versuchen würden, das Image von einem Format in ein anderes zu konvertieren (selbst wenn die Quell- und Zielformate identisch sind).
Bei diesem Vorgang wird ein neues konvertiertes Image ohne Nullen geschrieben, wodurch der mit Nullen belegte Speicherplatz auf dem Laufwerk effektiv dedupliziert wird.
Eine andere Möglichkeit wäre, einfach „ virt-sparsify
natürlich“ zu verwenden.
Antwort4
In Xenial und Bionic ist das Dienstprogramm virt-sparsify
aus dem Paketlibguestfs-toolssollte funktionieren. Beachten Sie Folgendes:
- Sie müssen KEIN Tool wie
sdelete
im Gast vorher ausführen (aber es schadet nicht) - Sie können das Flag verwenden
--in-place
, um Speicherplatz freizugeben, ohne die Datei zu kopieren (nützlich, wenn das Disk-Image bereits größer ist als der verbleibende freie Speicherplatz auf Ihrem Laufwerk!) - Das Tool unterstützt Bilder im qcow2- und Raw-Format