Frage Wie komprimiert man VirtualBox's VDI Dateigröße?


Ich habe eine VirtualBox-VM, die eine sehr große Festplattengröße konfiguriert hat (größer als Host). Ein Programm auf der VM erzeugte viele Log-Dateien und die VDI-Dateigröße wuchs ständig, bis auf dem Host kein Platz mehr war.

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

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


269
2018-01-07 03:41


Ursprung




Antworten:


Sie müssen die folgenden Schritte ausführen:

  1. Defrag in dem Gast ausführen (nur Windows)
  2. Freiraum aufheben:

    Mit einem Linux Gast Führe das 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
    

    Mit einem Windows-Gast, herunterladen SDelete von Sysinternals und führen Sie dies aus:

    sdelete.exe c: -z
    

    (Ersetzen Sie C: durch den Laufwerksbuchstaben der VDI)

  3. Fahren Sie die Gast-VM herunter

  4. Führen Sie jetzt VBoxManages aus modifymedium Befehl mit dem --compact Möglichkeit:

    Mit einem Linux-Host Führe das aus:

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

    Mit einem Windows-Host Führe das aus:

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

    Mit einem Mac-Gastgeber Führe das aus:

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

Dies reduziert die VDI-Größe.


452
2018-01-07 05:05



Für die nächste Person sah mein Befehl so aus: "C: \ Programme \ Oracle \ VirtualBox \ VBoxManage.exe" modifyhd "C: \ Benutzer \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -kompakt - Daniel
Laut der Hilfeseite für das Linux-Hilfsprogramm von zerofree (manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html), sollte zerofree besser sein als dd Für diese Arbeit. dd wäre nicht empfohlen worden, weil "es langsam ist", "es macht das Disk-Image (vorübergehend) zu seinem maximalen Umfang wachsen", "es (vorübergehend) nutzt den gesamten freien Speicherplatz auf der Festplatte, so andere gleichzeitige Schreibaktionen können fehlschlagen". Zerofree ist unter Ubuntu Linux via verfügbar geeignetoder Sie können es selbst kompilieren. - Dakatine
Es macht Spaß, dass die Manpage von zerofree stellt fest, dass mit dd Andere gleichzeitige Schreibvorgänge schlagen fehl, aber zerofree benötigt das Dateisystem, das schreibgeschützt gemountet wird! * duh * - Madarco
Tipp: Legen Sie die beiden Befehle wie folgt in eine Zeile: dd ...; rm /bigfile, wird dies die Zeit mit einer vollen Festplatte minimieren, falls Sie nicht auf die warten dd fertigstellen. - jlh
@Dakatine Mit VirtualBox 4.3.10 hat die Image-Datei funktioniert nicht wachsen in seiner maximalen Ausdehnung. VirtualBox ist schlau genug, um nicht alle Nullblöcke auf die physische Festplatte zu schreiben. - jlh


Wenn der Befehl in der akzeptierten Antwort ausgeführt wird, wird eine nicht hilfreiche Fehlermeldung wie folgt angezeigt

VBoxManage.exe: error: Cannot register the hard disk 'thedisk.vdi'
{aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} because a hard disk 'thedisk.vdi'
with UUID {aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} already exists

Führen Sie einfach den Befehl mit der UUID anstelle des Dateinamens aus:

VBoxManage.exe modifyhd {aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} --compact

34
2018-06-18 07:20





Ich bin auf einem Windows 7-Host mit Windows-Gästen, hier ist eine Batch-Datei, die ich schrieb, 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

Nun, nach all dem habe ich es versucht CloneVDI-Werkzeug und es hat in weniger Zeit und mit einem Klick einen guten Job gemacht.


11
2018-01-09 10:25



Sie würden auf dieser Art von Website denken, würde es eine Art Syntax-Highlighting für DOS geben, aber nein. Es sieht in Notepad ++ viel hübscher aus - CAD bloke
@CAD_bloke, für die eine Parsing-Engine erforderlich wäre. Wenn Sie die Anzahl der verschiedenen Sprachen berücksichtigen, die auf SE veröffentlicht wurden, betrachten Sie ein HUGE-Projekt. Denken Sie nur darüber nach, wie viele Versionen und Dialekte von DOS es gibt, zum Beispiel bevor Sie überhaupt zu Linux usw. gelangen. - Caltor
Sehr guter Punkt. Ironischerweise ist markiert in der Stapelaustausch iOS App. - CAD bloke
Ja, CloneVDI ist viel besser und schneller für den persönlichen Gebrauch - VarunAgw


Debian-Gast auf Windows-Host mit "verwerfen" / "TRIM".

Dies ist keine direkte Antwort an sich, da ich das Problem anspreche, nicht die Frage. Anstatt das Bild regelmäßig zu komprimieren, verwendet diese Lösung Verwerfen, um nicht verwendete Blöcke im VM-Festplattenimage des Hosts automatisch zu entfernen.

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

FDE und Cryptooot werden speziell nicht behandelt, da Sicherheitsbedenken bestehen und keine der anderen Lösungen für diese Frage eine Komprimierung erlauben würde. Das Arch Linux Wiki hat Informationen über TRIM- und dm-crypt-Geräte.

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

Hostkonfiguration

Wenn VBox beendet ist und keine VMs ausgeführt werden, fügen Sie den Disks Unterstützung hinzu, indem Sie beides festlegen discard und nonrotational für jede Festplatte in der Konfigurationsdatei für die VM. In diesem Moment discard ist nicht in der GUI, aber nonrotational wird als das Kontrollkästchen "Solid-State Drive" angezeigt. (ref: vbox Foren, verwerfen Unterstützung)

<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 Verwerfungseinstellung in /etc/lvm/lvm.conf. (ref: debian wiki, lvm.conf Beispiel)

devices {
...
    issue_discards = 1
}

Fügen Sie in der fstab den Befehl hinzu discard Option zu den Dateisystemen, die Sie automatisch löschen möchten (Ref: debian wiki, fstab Beispiel)

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

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

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

Jetzt freie Blöcke manuell mit zuschneiden fstrim. fstrim verwendet das angehängte Dateisystem, nicht das Blockgerät, das es unterstützt. Anstatt fortlaufende Verwerfung in zu setzen fstab, könnte dies auf einer wöchentlichen cron getan werden. (Das wöchentliche Cron wird für physische SSDs empfohlen, die eine fragwürdige Unterstützung für TRIM bieten können, aber dies ist hier nicht relevant, da die zugrunde liegenden SSDs vom Host-Betriebssystem verarbeitet werden. SSD trimmen Warnung).

fstrim /
fstrim /build

An diesem Punkt sollten die Größe der Dateisysteme innerhalb der VM und die Größe der VM-Images ziemlich nahe bei ihrem Wert sein.

Getestet mit:

  • Guest1: Debian 8.7, Kernel: Linux 4.8 Grsec von Backports, Dateisystem: ext4
  • Guest2: Debian 9 RC2, Kernel: Linux 4.9, Dateisystem: ext4
  • Host1: VBox 5.1.14, Win7, Bild fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, Bild fmt: VDI

5
2018-02-24 16:27





Zum MacOS-Gast mach das:

  1. Aufhebung des freien Speicherplatzes im Gastsystem:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (Ersetzen Sie / Volumes / Macintosh HD mit Ihrem Laufwerksnamen)

  2. Fahren Sie die Gast-VM herunter

  3. Führen Sie diesen Befehl aus, um die VDI-Datenträgerabbildgröße zu reduzieren

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

    ODER

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

2
2017-12-16 17:08





Ich verwende dies für mein VDI-Image, das auf virtuellem Debian in Windows VirtualBox gemountet wurde. Es ist keine allgemeine Lösung, aber es sollte dir wenigstens einen Überblick geben, was ich tue.

Befehle in Debian:

root@debian:~# lsblk  # show partitions
NAME MAJ: MIN RM GRÖßE RO ART. MOUNTPUNKT
sdb 8:16 0 128G 0 Scheibe
└─sdb1 8:17 0 128G 0 part / mnt / web # DAS IST DIE INTERESSE VON INTERESSE!
sda 8: 0 0 64G 0 Festplatte
├─sda1 8: 1 0 61,4G 0 Teil /
├─sda2 8: 2 0 1K 0 Teil
└─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
2018-02-05 11:31





Ich möchte die TRIM-Unterstützung in OS nicht aktivieren, da jede Datenlöschung die Komprimierung von Daten in der VDI-Datei erzwingt, wodurch das Gast-System unbrauchbar wird, wenn sich die VDI-Datei auf einer klassischen Rotations-CD befindet. Für mich ist es besser, das Kompaktieren per Hand durchzuführen, z. ein Mal per Monat.

Beim normalen Komprimieren wird der Inhalt der VDI-Datei in eine neue Datei kopiert. Dies erfordert etwas (manchmal großen) freien Speicherplatz auf dem Host-Datenträger.

Ich habe eine ähnliche Lösung wie Andrew Domaszek. Es funktioniert sehr gut sogar mit NTFS (Windows10).

Um dies zu tun:

  • Erstellen Sie eine neue virtuelle Maschine, die mit GParted Live CD startet (Sie können Ihre bevorzugte 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 Disks, um als SSD mit TRIM-Unterstützung sichtbar zu sein:

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
  • Installieren Sie in der Linux-Root-Shell die NTFS-Partition mount /dev/sda2 /mnt
  • null freier Speicherplatz dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • Erzwinge das Komprimieren von VDI, ohne eine neue Datei zu erstellen: fstrim -v /mnt

1
2017-09-15 07:17





Ein sehr netter Trick, um die angenommene Antwort zu ergänzen, ist, dass Sie ohne Komprimierung nach der Nullstellung des Gastraums entkommen können, indem Sie ein komprimiertes Dateisystem auf dem Host verwenden (z. B. den Ordner von virtuellen Laufwerken auf NTFS Eigenschaften auf einem Windows-Host). Dies hat in der Tat den Vorteil, viel mehr Speicherplatz zu sparen, da Betriebssysteme dazu neigen, eine Menge repetitiver Text- oder Binärdateien zu speichern (z. B. kann ein 30GB-Gastlaufwerk mit 15 GB Speicherplatz auf 4 GB auf dem Hostlaufwerk umgestellt werden).

Zu den Vorbehalten gehört, dass der Laufwerkzugriff auf die reale Hardware möglicherweise zunimmt und die CPU-Auslastung leicht ansteigt.


0
2018-01-20 07:13