VDI verkleinern mit 'vboxmanage modifyhd ****.vdi –compact' klappt nur im Terminal

Allgemeine Diskussionen über den Einsatz von VirtualBox.
Post Reply
Mousehouse
Posts: 1
Joined: 22. Mar 2019, 18:36
Primary OS: Debian other
VBox Version: OSE Debian
Guest OSses: Windows 7
Location: München

VDI verkleinern mit 'vboxmanage modifyhd ****.vdi –compact' klappt nur im Terminal

Post by Mousehouse »

Hallo liebe Leute,

meine Virtuelle Maschine belegt inzwischen über 30 GiB obwohl ich auf ihr keine Dateien speichere.

Nachdem ich meinen Windows 7 (Gast) defragmentiert habe, versuchte ich mit dem Terminalbefehl vboxmanage modifyhd ****.vdi –compact das VDI zu verkleinern (Leere Bereiche mit Nullen zu überschreiben). Im Terminal hat‘s auch geklappt:

Code: Select all

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Nur in der „Realität“ hat sich nichts verändert. Als Test habe ich ein Klon aufgepumpt indem ich über einen gemeinsamen Ordner eine große Datei hineinkopiert habe um sie sogleich wieder zu löschen. Erwartungsgemäß hat sich die Klon-VDI vergrößert und durch das Löschen nicht wieder verkleinert. Dieser aufgepumpte Klon zeigte die gleiche Reaktion im Terminal, blieb aber real unverändert groß.

Freue mich über weiterführende Tipps - bin Anfänger.

Herzliche Grüße,
M

__________________________________________
Windows 7 auf Linux Mint Debian (LMDE3)
FST
Posts: 29
Joined: 30. Jul 2014, 09:43

Re: VDI verkleinern mit 'vboxmanage modifyhd ****.vdi –compact' klappt nur im Terminal

Post by FST »

Hallo,

benutze dafür doch einfach das Tool CloneVDI viewtopic.php?f=5&t=24672

mit den richtigen Einstellungen funktioniert das wunderbar

Grüße
John
stefan.becker
Volunteer
Posts: 7639
Joined: 7. Jun 2007, 21:53

Re: VDI verkleinern mit 'vboxmanage modifyhd ****.vdi –compact' klappt nur im Terminal

Post by stefan.becker »

Und da ja Host anscheinend Debian: Das Tool geht auch problemlos mit WINE.

Frage nicht nach anderen Lösungen, die taugen nichts.
MarkFalk
Posts: 29
Joined: 11. Mar 2021, 19:16

Re: VDI verkleinern mit 'vboxmanage modifyhd ****.vdi –compact' klappt nur im Terminal

Post by MarkFalk »

Ich exhumiere das mal - nicht, weil der OP noch auf eine Antwort warten würde, sondern damit andere, die das gleiche Problem haben und bei ihrer Suche auf diesen Fred hier stoßen, auch eine Antwort/Lösung bekommen:

Damit mit "VBoxManage.exe modifyhd *.vdi --compact" die .vdi-Datei verkleinert werden kann müssen zuvor die leeren Blöcke mit Null gefüllt werden. In Windows-VM kann man hierzu das Tools sdelete.exe aus den Sysinternals nehmen, mit dem Aufruf
sdelete.exe -z c:
innerhalb der VM.
Nach meinen Tests
viewtopic.php?f=6&t=102047&p=497587#p497587
sollte zuvor in der VM der freie Platz defragmentiert werden, z.B. mit mydefrag.exe, script für SSD-defragmentieren. Dies hilft auch, wenn man das "komprimieren" nicht mit VBoxManage sondern mit CloneVDI erledigen möchten - dies führt nach meinen Erkenntnissen zu vergleichbaren Ergebnissen, spart aber den zeitaufwendigen Schritt des Nullschreibens.

Will man dagegen das virtuelle Laufwerk verkleinern, also die maximale Größe der dynamischen VM-Datei ("logische" Größe der VM) verringern, scheint dies nur über das clonen der VM-Datei in eine neue VM-Datei mit entsprechend reduzierter maximaler Größe zu gehen. Dabei muß die tatsächliche (physische) Größe kleiner sein, also zunächst wie oben beschrieben "shrinken" und das Volume erforderlichenfalls entsprechend verkleinern. Dann eine neue leere .vdi-Datei erzeugen und mit
vboxmanage clonemedium "(Quell-Pfad+Datei)" "(Ziel-Pfad+Datei)" --existing
die alte .vdi in die neue .vdi mit kleinerer Maximalgröße clonen.

Erforderlich ist das z.B., wenn man eine existierende OS-Installation von einer HD in eine VM überführt hat. Meist ist die Festplatte größer als der für die VM zur Verfügung stehende Platz oder beim Konvertieren werden auch "leere" andere Partitionen mit eingebunden, so daß die "logische" Größe der VM, also die zur Verfügung stehende Kapazität, viel zu groß ist. Denn die dynamische VM wächst bei Bedarf so lange, bis die "logische" Größe erreicht ist.

Das Ganze geht auch mit .vhd-VM. Defragmentieren und "Nullschreiben" wie oben. Zum "shrinken" kann man diskpart verwenden, also auf Host-Ebene in der (Admin)-Eingabeaufforderung diskpart.exe aufrufen und dann:
select vdisk file="(Pfad+Datei)"
attach vdisk readonly
compact vdisk
detach vdisk
exit
In meinen Versuchen hat dies manchmal an der physischen Größe der Datei nichts geändert; das mag daran gelegen haben, daß das Defragmentieren nicht wirklich zu großem freien Platz am Ende der virtuellen Disk geführt hat; in Mydefrag waren ganz kleine Fragmente zu sehen. Aber merkwürdigerweise war dies nach dem Kopieren in eine leere .vhd-Datei (egal ob gleich groß oder kleiner) oder einem backup mit folgendem restore oder auch einem Durchgang mit vhdresize behoben, d.h. die Größe der neuen .vhd-Datei entsprach dann dem tatsächlichen Inhalt.

Erfreulicherweise funktionierte dies alles auch außerhalb der .vhd-VM. Denn da sich die .vhd-VM/Datei in der Datenträgerverwaltung von Windows als Laufwerk einbinden lassen können die tools wie Mydefrag und sdelete auf Host-Ebene verwendet werden, was zumindest bei älterer Hardware zu einer Beschleunigung führt.

Das Herabsetzen der Maximalgröße der .vhd-VM (also die "logische" Größe der VM) soll mit dem vorerwähnten tool vhdresize möglich sein. Die ursprgl. Seite des Herstellers ist down, aber im Netz gibt es hier und da eine Downloadmöglichkeit der anscheinend einzigen/letzten Version 1.0.42 (manchmal auch als "toolkit" bezeichnet). Ich habe es ausprobiert und es hat sogar funktioniert, wenn wie oben angesprochen die physische Größe mangels "wirksamer" Verkleinerung größer war als die angestrebte physische Größe (aber größer als der wirkliche Inhalt).
Ein anderer Weg besteht in dem Erzeugen einer leeren dynamischen VM-.vhd-Datei mit entsprechender Maximalgröße, z.B. über die Windows-Datenträgerverwaltung. Alte und neue .vhd-Datei lassen sich über die Datenträgerverwaltung als Laufwerke einbinden und dann mit den favorisierten Werkzeugen der Inhalt der alten VM in die neue Datei kopieren. Also bspw. über ein backup-Programm. Ich habe es mit dem AOMI-backuper, weil er gerade zur Hand war, ausprobiert. Das klappte sowohl als cloning wie auch als backup und restore in gesonderten Schritten. Ein ähnlicher Weg wird im Netz auch für .vdi-VM beschrieben, aber das geht natürlich nicht auf Host-Ebene sondern nur eben innerhalb der VM, in der die neue, leere VM mit eingebunden wird (ausprobiert habe ich dies nicht). Aber anscheinend macht vhdresize nichts anderes, nämlich die .vhd-Datei Block für Block in eine neue Datei zu schreiben. Der Weg über eine backup-Software hat dann den Vorteil, daß die VM als komprimiertes backup verbleibt.
Post Reply