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

Ich habe eine VirtualBox-VM, die eine sehr große Festplattengröße (größer als Host) konfiguriert hat. Durch meinen Fehler hat ein Programm auf der VM viele Protokolldateien generiert und die VDI-Dateigröße wächst weiter, bis auf dem Host kein Speicherplatz mehr vorhanden ist.

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

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

Author: Karan, 2013-01-07

8 answers

Sie müssen die folgenden Schritte ausführen:

  1. Defrag im Gast ausführen (nur Windows)

  2. Freier Speicherplatz zunichte machen:

    Mit einem Linux-Gast führen Sie 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
    

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

     sdelete.exe c: -z
    

(ersetzen Sie C: durch den Laufwerksbuchstaben des VDI)

  1. Den Gast herunterfahren VM

  2. Jetzt VBoxManage ' s ausführen modifymedium befehl mit der Option --compact:

    Mit einem Linux-Host führen Sie Folgendes aus:

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

    Mit einem Windows-Host führen Sie Folgendes aus:

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

    Mit einem Mac-Host führen Sie Folgendes aus:

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

    VBoxManage befindet sich hier: /Applications/VirtualBox.app / Inhalt / macOS / VBoxManage

Dies reduziert die VDI-Größe.

 567
Author: magicandre1981,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-11-17 14:34:41

Ich bin auf einem Windows 7-Host mit Windows-Gästen, Hier ist eine Batch-Datei, die ich geschrieben habe, um alle VDIs in einem Ordnerbaum 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 versucht, die CloneVDI Werkzeug und es hat einen guten Job in viel weniger Zeit und mit einem Klick.

 12
Author: CAD bloke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-12 13:48:39

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

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

Für diese Lösung ist ein Gastdateisystem erforderlich, das Continuous TRIM unterstützt. Das Arch Linux Wiki hat eine Liste von Dateisystemen, die TRIM Operationen unterstützen.

FDE und cryptoroot sind insbesondere nicht abgedeckt, da es Sicherheitsbedenken gibt und keine der anderen Lösungen für diese Frage eine Verdichtung ermöglichen würde. Das Arch Linux Wiki enthält Informationen über TRIM und dm-crypt Geräte.

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

Host-Konfiguration

Wenn VBox beendet ist und kein VMs ausgeführt wird, fügen Sie Discard-Unterstützung zu Ihren Festplatten hinzu, indem Sie sowohl discard als auch nonrotational für jede Festplatte in der Konfigurationsdatei für die VM. Zu diesem Zeitpunkt befindet sich discard nicht in der GUI, aber nonrotational wird als Kontrollkästchen "Solid-State Drive" angezeigt. (ref: vbox Foren, Unterstützung verwerfen)

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

Starten Sie die VM hoch und stellen Sie sicher, dass die TRIM-Unterstützung aktiviert ist:

sudo hdparm -I /dev/sda | grep TRIM

Gastkonfiguration

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

devices {
...
    issue_discards = 1
}

Fügen Sie in fstab die Option discard zu den Dateisystemen hinzu, die Sie automatisch verwerfen möchten (ref: debian wiki, 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

Mounten Sie die Dateisysteme neu, damit sie ihre neuen Optionen auswählen können.

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

Trimmen Sie die freien Blöcke jetzt manuell mit fstrim. fstrim verwendet das gemountete Dateisystem, nicht das Blockgerät, das es unterstützt. Anstatt continuous discard in fstab zu setzen, könnte dies auf einem wöchentlichen Cron erfolgen. (Die wöchentliche cron wird für physische SSDs empfohlen, die fragwürdige Unterstützung für TRIM haben können, aber dies ist hier nicht relevant, da zugrunde liegende SSDs vom Host-Betriebssystem behandelt werden. siehe: ( trim warning).

fstrim /
fstrim /build

Zu diesem Zeitpunkt sollten die Größe der Dateisysteme innerhalb der VM und die Größe der VM-Images ziemlich nahe beieinander liegen.

Getestet mit:

  • Guest1: Debian 8.7, kernel: linux 4.8 von grsec-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, image fmt: VDI
 11
Author: Andrew Domaszek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-12 13:48:39

Ich verwende dies für mein VDI-Image, das in Windows VirtualBox auf Virtual Debian gemountet ist. Es ist keine allgemeine Lösung, aber es sollte Ihnen zumindest einen Kern dessen geben, was ich tue.

Befehle in Debian:

root@debian:~# lsblk  # show partitions
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 
sdb 8:16 0 128G 0 disk 
└─sdb1 8:17 0 128G 0 part /mnt/web  # THIS IS THE PARTITION OF INTEREST!
sda 8:0 0 64G 0 disk 
├─sda1 8:1 0 61,4G 0 part / 
├─sda2 8:2 0 1K 0 part 
└─sda5 8:5 0 2,7G 0 part 
[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

Hoffe es hilft :)

 2
Author: Dejv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-02-05 11:31:32

Für macOS Guest tun Sie dies:

  1. Freien Speicherplatz im Gastsystem zunichte machen:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (ersetzen Sie / Volumes / Macintosh HD durch Ihren Laufwerknamen)

  2. Herunterfahren der Gast-VM

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

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

    ODER

    VBoxManage modifymedium /path/to/thedisk.vdi --compact
    
 2
Author: Mrskman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-12-16 17:08:31

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

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

Für einen Zeitraum von einigen Jahren-vielleicht 1997-2007 oder so-waren 32-Bit-Betriebssysteme immer noch die Norm, aber Festplatten, die größer als 2 GB waren, wurden bereits verwendet. Wenn Sie versuchen, den gesamten freien Speicherplatz zu verbrauchen, indem Sie eine Datei mit Nullen schreiben (was immer als root erfolgen sollte, um root ' s einzuschließen privilegierter freier Speicherplatz, den niemand sonst berühren kann), können Sie sehen:

Datei zu groß

Anstelle dessen, was Sie erwarten:

Kein Platz mehr auf dem Gerät.

In diesem Fall haben Sie höchstwahrscheinlich eine Beschränkung der Dateigröße von 2 GB erreicht. Dies war zu dieser Zeit üblich, da viele Dateioperationen Ergebnisse in signierten 32-Bit-Ganzzahlen zurückgaben, sodass negative Werte Fehlercodes melden konnten. Dies bedeutete effektiv, dass die Offset-Ergebnisse auf 2^31 Bytes ohne spezielle begrenzt waren Maßnahmen.

Die Problemumgehung ist einfach: Erstellen Sie weiterhin separate, unterschiedlich benannte Nullen-Dateien, bis der Speicherplatz auf der Festplatte tatsächlich knapp wird.

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

 2
Author: breakpoint,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-08-17 06:07:39

Ich möchte die TRIM-Unterstützung im Betriebssystem nicht aktivieren, da jedes Löschen von Daten die Datenkomprimierung in der VDI-Datei erzwingt und das Gastsystem unbrauchbar macht, wenn sich die VDI-Datei auf der Classic-CD befindet. Für mich ist es besser, das Verdichten von Hand durchzuführen, z. B. einmal pro Monat.

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

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

Um dies Zu tun:

  • Erstellen Sie eine neue virtuelle Maschine, die mit GParted Live CD bootet (Sie können Ihre Lieblings-Linux-Distribution verwenden).
  • Maschineneinstellungen bearbeiten und SATA Disc Controller einstellen
  • Fügen Sie vorhandene VDI-Dateien hinzu, die Sie komprimieren möchten
  • Ändern Sie VDI - basierte Discs so, dass sie als SSD mit TRIM-Unterstützung sichtbar sind:

    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

  • Mounten Sie in der Linux-Root-Shell die NTFS-Partition mount /dev/sda2 /mnt
  • null-freies Raum dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • Erzwingen Sie das Komprimieren von VDI, ohne eine neue Datei zu erstellen: fstrim -v /mnt
 2
Author: niziak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-08-17 08:20:07

Ein sehr netter Trick, um die akzeptierte Antwort zu ergänzen, besteht darin, dass Sie nach dem Nullstellen des Gastspeichers ohne Komprimierung davonkommen können, indem Sie ein komprimiertes Dateisystem auf dem Host verwenden (z. B. Auswählen, um den Ordner zu komprimieren 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, viele sich wiederholende Text - oder Binärdateien zu speichern (z. B. ein 30-GB-Gastlaufwerk mit 15 GB Speicherplatz auf Null kann auf 4 GB geschaltet werden das host-Laufwerk ist).

Vorbehalte beinhalten, dass der Laufwerkzugriff auf der realen Hardware zunehmen kann und die CPU-Auslastung leicht zunimmt.

 1
Author: j riv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-01-20 07:18:38