Wie komprimiere ich die VDI-Dateigröße von VirtualBox?


302

Ich habe eine VirtualBox-VM, die eine sehr große Festplatte (größer als der Host) konfiguriert hat. Aus Versehen hat ein Programm auf der VM viele Protokolldateien generiert, und die Größe der VDI-Datei wächst so lange, bis auf dem Host kein Speicherplatz mehr verfügbar ist.

Jetzt habe ich die Protokolldateien gelöscht, aber die VDI-Dateigröße wird nach der Verwendung nicht kleiner VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

Gibt es eine Möglichkeit, die VDI-Dateigröße wirklich zu komprimieren? Vielen Dank!

Antworten:


509

Sie müssen die folgenden Schritte ausführen:

  1. Defragmentierung im Gast ausführen (nur Windows)
  2. Freien Speicherplatz aufheben:

    Führen Sie mit einem Linux-Gast Folgendes aus:

    dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile
    

    Oder:

    telinit 1
    mount -o remount,ro /dev/sda1
    zerofree -v /dev/sda1
    

    Laden Sie mit einem Windows-Gast SDelete von Sysinternals herunter und führen Sie Folgendes aus:

    sdelete.exe c: -z
    

    (Ersetzen Sie C: durch den Laufwerksbuchstaben des VDI)

  3. Fahren Sie die Gast-VM herunter

  4. Führen Sie nun den modifymediumBefehl von VBoxManage mit der --compactOption aus:

    Führen Sie auf einem Linux-Host Folgendes aus:

    vboxmanage modifymedium --compact /path/to/thedisk.vdi
    

    Führen Sie auf einem Windows-Host Folgendes aus:

    VBoxManage.exe modifymedium --compact c:\path\to\thedisk.vdi
    

    Führen Sie auf einem Mac-Host Folgendes aus:

    VBoxManage modifymedium --compact /path/to/thedisk.vdi
    

Dies reduziert die VDI-Größe.


16
Für die nächste Person sah mein Befehl so aus: "C: \ Programme \ Oracle \ VirtualBox \ VBoxManage.exe" modifyhd "C: \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -compact
Daniel

36
Nach dem zerofree Linux Utility manpage ( manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html ) sollte zerofree als besser sein , dd für diesen Job. dd wurde nicht empfohlen, weil "es langsam ist", "es das Festplatten-Image (vorübergehend) maximal wachsen lässt", "es (vorübergehend) den gesamten freien Speicherplatz auf der Festplatte nutzt, sodass andere gleichzeitige Schreibaktionen fehlschlagen können". Zerofree ist unter Ubuntu Linux über apt verfügbar , oder Sie können es selbst kompilieren.
Dakatine

27
Es macht Spaß, dass die Manpage von zerofree angibt, dass mit dd andere gleichzeitige Schreibvorgänge fehlschlagen, aber für zerofree muss das Dateisystem schreibgeschützt sein! * duh *
Madarco

7
Tipp: Fügen Sie die beiden Befehle wie folgt in eine Zeile ein: dd ...; rm /bigfileDies minimiert die Zeit mit einer vollen Festplatte, falls Sie nicht auf den ddAbschluss warten .
14.

21
@Dakatine Unter Verwendung von VirtualBox 4.3.10 wuchs die Disk-Image-Datei nicht in maximalem Umfang. VirtualBox ist clever genug, um sich nicht die Mühe zu machen, alle Nullblöcke auf die physische Festplatte zu schreiben.
14.

12

Ich arbeite auf einem Windows 7-Host mit Windows-Gästen. Hier ist eine Batchdatei, die ich geschrieben habe, um alle VDIs in einer Ordnerstruktur zu komprimieren

echo off
mode con:cols=140 lines=200
cls
:: see https://forums.virtualbox.org/viewtopic.php?p=29272#p29272
:: How can I reduce the size of a dynamic VDI on disk?
:: but that page says to use sdelete -s which is suboptimal. 
:: use -z as per http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx

:: First run the sdelete -z c: inside the VMs that zero-out all the free space
:: THEN run this batch file 

Title Compacting Free space on Virtual Machine VMs

:: http://ss64.com/nt/for_r.html
:: http://stackoverflow.com/questions/8836368/windows-batch-file-how-to-loop-through-files-in-a-directory/8836401#8836401

Setlocal EnableDelayedExpansion
:: http://ss64.com/nt/delayedexpansion.html ... 
:: Notice that within the for loop we use !variable! instead of %variable%.

For /R %CD% %%G IN (*.vdi) DO (
 set ohai=%%G
 set lastfive=!ohai:~-5!
:: Skip snapshots which are named {guid}.vdi
 if NOT !lastfive!==}.vdi (
 echo .
 echo Compacting %%G
 "C:\Program Files\Oracle\VirtualBox\VboxManage.exe" modifyhd "%%G" --compact )
 )

pause 
exit

Ich habe die Links in den Kommentaren hinterlassen, damit Sie (irgendwie) sagen können, wie es funktioniert.

bearbeiten

Nach all dem habe ich das CloneVDI-Tool ausprobiert und es hat in viel kürzerer Zeit und mit einem Klick gute Arbeit geleistet.


5
Sie würden denken, auf dieser Art von Site gäbe es eine Art Syntax-Hervorhebung für DOS, aber nein. In Notepad ++ sieht es viel hübscher aus
CAD-Typ

1
@CAD_bloke, für das eine Parsing-Engine erforderlich wäre. Wenn Sie die Anzahl der auf SE veröffentlichten Sprachen berücksichtigen, handelt es sich um ein RIESIGES Projekt.
Stellen

Sehr guter Punkt. Ironischer es wird auf dem Stapel Austausch iOS - App hervorgehoben.
CAD Kerl

2
Ja, CloneVDI ist viel besser und schneller für den persönlichen Gebrauch
VarunAgw

6

Debian-Gast auf Windows-Host mit discard / TRIM.

Dies ist an sich keine direkte Antwort, da ich das Problem und nicht die Frage anspreche. Anstatt das Image regelmäßig zu komprimieren, werden bei dieser Lösung nicht verwendete Blöcke im VM-Image des Hosts mithilfe von Discard automatisch entfernt.

Diese Lösung erfordert ein Gastdateisystem, das kontinuierliches TRIM unterstützt. Das Arch Linux-Wiki enthält eine Liste von Dateisystemen, die TRIM-Operationen unterstützen .

FDE und Cryptoroot werden speziell nicht behandelt, da es Sicherheitsbedenken gibt und keine der anderen Lösungen für diese Frage eine Komprimierung ermöglichen würde. Das Arch Linux-Wiki enthält Informationen zu TRIM- und dm-crypt-Geräten .

Theoretisch funktioniert dies für alle Linux-Gäste auf VBox-Hosts, die VDI-Speicher verwenden.

Host-Konfiguration

Mit VBox verlassen und keine VMs ausgeführt wird , fügen beide auf Ihre Festplatten Ablage Unterstützung durch das Setzen discardund nonrotationalfür jede Platte in der Konfigurationsdatei für die VM. Zu diesem Zeitpunkt discardbefindet sich das nonrotationalKontrollkästchen nicht in der GUI, sondern wird als "Solid-State-Laufwerk" angezeigt. (ref: vbox foren, support verwerfen )

<AttachedDevice discard="true" nonrotational="true" type="HardDisk" [..other options..] >

Starten Sie die VM und vergewissern Sie sich, dass die TRIM-Unterstützung aktiviert ist:

sudo hdparm -I /dev/sda | grep TRIM

Gastkonfiguration

Wenn LVM verwendet wird, ändern Sie die Discard-Einstellung in /etc/lvm/lvm.conf. (ref: debian wiki, lvm.conf beispiel )

devices {
...
    issue_discards = 1
}

discardFügen Sie in fstab die Option zu den Dateisystemen hinzu, die Sie automatisch verwerfen möchten (Ref: Debian-Wiki, Beispiel fstab ).

UUID=8db6787f-1e82-42d8-b39f-8b7491a0523c   /   ext4    discard,errors=remount-ro   0   1
UUID=70bfca92-8454-4777-9d87-a7face32b7e7   /build  ext4    discard,errors=remount-ro,noatime   0   1

Stellen Sie die Dateisysteme erneut bereit, damit sie ihre neuen Optionen abrufen können.

sudo mount -o remount /
sudo mount -o remount /build

Freie Blöcke jetzt manuell mit zuschneiden fstrim. fstrimVerwendet das gemountete Dateisystem und nicht das Blockgerät, das es sichert. Anstatt fortlaufend zu verwerfen fstab, könnte dies auf einem wöchentlichen Cron erfolgen. (Der wöchentliche Cron wird für physische SSDs empfohlen, die möglicherweise eine fragwürdige Unterstützung für TRIM bieten . Dies ist hier jedoch nicht relevant, da zugrunde liegende SSDs vom Host-Betriebssystem verarbeitet werden. Siehe: ssd trim warning ).

fstrim /
fstrim /build

Zu diesem Zeitpunkt sollten die Größe der Dateisysteme in der VM und die Größe der VM-Images einen ähnlichen Wert haben.

Getestet mit:

  • Gast1: Debian 8.7, Kernel: Linux 4.8 grsec von Backports, Dateisystem: ext4
  • Gast2: Debian 9 RC2, Kernel: Linux 4.9, Dateisystem: ext4
  • Host1: VBox 5.1.14, Win7, Bilddatei: VDI
  • Host2: VBox 5.1.14, Win8.1, Bilddatei: VDI

2

Gehen Sie für MacOS Guest wie folgt vor:

  1. Freien Speicherplatz im Gastsystem aufheben:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (Ersetzen Sie / Volumes / Macintosh HD durch Ihren Laufwerksnamen)

  2. Fahren Sie die Gast-VM herunter

  3. Führen Sie diesen Befehl aus, um die Größe des VDI-Festplattenabbilds zu verringern

    VBoxManage modifyhd /path/to/thedisk.vdi --compact
    

    ODER

    VBoxManage modifymedium /path/to/thedisk.vdi --compact
    

1

Ich verwende dies für mein VDI-Image, das in das virtuelle Debian in Windows VirtualBox eingebunden ist. Es ist keine generelle Lösung, aber es sollte Ihnen zumindest einen Überblick darüber geben, was ich tue.

Befehle in Debian:

root@debian:~# lsblk  # show partitions
NAME MAJ: MIN RM GRÖSSE RO TYP MOUNTPOINT 
SDB 8:16 0 128G 0 Festplatte 
└─sdb1 8:17 0 128G 0 part / mnt / web # DAS IST DIE INTERESSENTRENNUNG!
sda 8: 0 0 64G 0 Festplatte 
├─sda1 8: 1 0 61,4G 0 Teile / 
├─sda2 8: 2 0 1K 0 part 
└─sda5 8: 5 0 2,7G 0 Teil 
[SWAP] sr0 11: 0 1 56,3M 0 rom
root@debian:~# service mysql stop  # terminate all operations with partition
root@debian:~# service apache2 stop  # terminate all operations with partition
root@debian:~# umount /mnt/web  # unplug partition
root@debian:~# apt-get install zerofree  # install tool for filling in zeros to empty space
root@debian:~# zerofree -v /dev/sdb1  # fill with zeros
root@debian:~# poweroff  # shut down machine

Befehle in Windows:

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd --compact "D:\VirtualBox VMs\web.vdi"  # convert zeros to empty space

Ich hoffe es hilft :)


1

Ich möchte die TRIM-Unterstützung im Betriebssystem nicht aktivieren, da bei jedem Löschen der Daten die Daten in der VDI-Datei komprimiert werden und das Gastsystem unbrauchbar wird, wenn sich die VDI-Datei auf einer klassischen Rotationsdisk befindet. Für mich ist es besser, die Verdichtung von Hand durchzuführen, z. B. einmal im Monat.

Während der normalen Komprimierung wird der Inhalt der VDI-Datei in eine neue Datei kopiert. Dies erfordert einen (manchmal großen) freien Speicherplatz auf der Host-CD.

Ich habe Lösung ähnlich von Andrew Domaszek gezeigt. Es funktioniert sehr gut, auch mit NTFS (Windows 10).

Um dies zu tun:

  • Erstellen Sie eine neue virtuelle Maschine, die mit GParted Live CD startet (Sie können Ihre Lieblings-Linux-Distribution verwenden).
  • Bearbeiten Sie die Geräteeinstellungen und stellen Sie den SATA-Disc-Controller ein
  • Fügen Sie vorhandene VDI-Dateien hinzu, die Sie komprimieren möchten
  • Ändern Sie VDI-basierte Discs so, dass sie mit TRIM-Unterstützung als SSD angezeigt werden:

    VBoxManage storageattach "gpared live" --storagectl "SATA" --port 0 --discard on --nonrotational on
    VBoxManage storageattach "gpared live" --storagectl "SATA" --port 1 --discard on --nonrotational on
    
  • Maschine starten

  • Hängen Sie in der Linux-Root-Shell die NTFS-Partition ein mount /dev/sda2 /mnt
  • Null freier Speicherplatz dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • Komprimieren von VDI erzwingen, ohne eine neue Datei zu erstellen: fstrim -v /mnt

0

Ein sehr nützlicher Trick, um die akzeptierte Antwort zu ergänzen, besteht darin, dass Sie durch die Verwendung eines komprimierten Dateisystems auf dem Host (z. B. durch Auswahl der Option zum Komprimieren des Ordners virtueller Laufwerke in NTFS-Eigenschaften auf einem Server) davonkommen können, ohne den Gastspeicher zu komprimieren Windows-Host). Dies hat in der Tat den Vorteil, dass viel mehr Speicherplatz gespart wird, da Betriebssysteme dazu neigen, viele sich wiederholende Text- oder Binärdateien zu speichern (z. B. kann ein 30-GB-Gastlaufwerk mit 15 GB auf dem Hostlaufwerk auf 4 GB zurückgesetzt werden).

Vorsichtsmaßnahmen umfassen, dass der Laufwerkzugriff auf die reale Hardware zunehmen kann und die CPU-Auslastung leicht zunimmt.


0

WICHTIGER HINWEIS FÜR LEGACY (~ 1997-2007) BETRIEBSSYSTEME

Im Allgemeinen sind die Techniken in den zuvor gegebenen Antworten gültig; Es gibt jedoch einen sehr wichtigen Sonderfall.

Einige Jahre lang - vielleicht zwischen 1997 und 2007 - waren 32-Bit-Betriebssysteme noch die Norm, aber Festplatten mit mehr als 2 GB wurden bereits verwendet. Wenn Sie versuchen, den gesamten freien Speicherplatz zu belegen, indem Sie eine Datei mit Nullen schreiben (dies sollte immer als root erfolgen, um den privilegierten freien Speicherplatz von root einzuschließen, den sonst niemand berühren kann), wird möglicherweise Folgendes angezeigt:

Datei zu groß

anstatt was Sie erwarten:

Kein Speicherplatz auf Gerät.

In diesem Fall liegt höchstwahrscheinlich eine Dateigrößenbeschränkung von 2 GB vor. Dies war zu der Zeit üblich, da viele zurückgegebene Dateioperationen zu vorzeichenbehafteten 32-Bit-Ganzzahlen führten, sodass negative Werte Fehlercodes melden konnten. Dies bedeutete effektiv, dass die Offset-Ergebnisse ohne besondere Maßnahmen auf 2 ^ 31 Bytes begrenzt wurden.

Die Problemumgehung ist unkompliziert: Erstellen Sie so lange separate Nullstellungsdateien mit unterschiedlichen Namen, bis auf der Festplatte tatsächlich kein Speicherplatz mehr verfügbar ist.

Wenn Sie ein Kursleiter sind, der diese Situation für eine Klasse demonstrieren möchte, ist ein 4-GB-Disk-Image mit einer alten Kopie von Red Hat Linux 7.0 ausreichend.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.