2013-01-07 03:41:45 +0000 2013-01-07 03:41:45 +0000
307
307

Wie kann die VDI-Dateigröße von VirtualBox komprimiert werden?

Ich habe eine VirtualBox-VM, die eine sehr große Festplattengröße (größer als der Host) konfiguriert hat. Durch meinen Fehler erzeugte ein Programm auf der VM viele Protokolldateien, und die VDI-Dateigröße wächst so lange, bis auf dem Host kein Platz 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!

Antworten (8)

520
520
520
2013-01-07 05:05:34 +0000

Sie müssen die folgenden Schritte durchführen:

  1. Führen Sie die Defragmentierung im Gast aus (nur Windows)
  2. Freien Speicherplatz aufheben:

  3. Fahren Sie die Gast-VM herunter:

  4. Führen Sie nun den VBoxManage-Befehl modifymedium mit der Option --compact aus:

Dies reduziert die vdi-Größe.

12
12
12
2015-01-09 10:25:08 +0000

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 gelassen, damit Sie (sozusagen) erzählen können, wie es funktioniert.

bearbeiten

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

7
7
7
2017-02-24 16:27:40 +0000

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 periodisch zu komprimieren, verwendet diese Lösung Discard, um unbenutzte Blöcke im VM-Festplattenimage des Hosts automatisch zu entfernen.

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

FDE und cryptoroot sind ausdrücklich nicht abgedeckt, da Sicherheitsbedenken bestehen und auch keine der anderen Lösungen dieser Frage eine Komprimierung erlauben 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 die VBox beendet ist und keine VMs laufen, fügen Sie Ihren Platten Unterstützung für das Verwerfen hinzu, indem Sie sowohl discard als auch nonrotational für jede Platte in der Konfigurationsdatei für die VM einstellen. Zu diesem Zeitpunkt befindet sich discard nicht in der GUI, aber nonrotational wird als das Kontrollkästchen “Solid-State-Laufwerk” angezeigt. (ref: vbox forums, discard support )

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

Booten Sie die VM hoch und überprüfen Sie, ob die TRIM-Unterstützung aktiviert ist:

sudo hdparm -I /dev/sda | grep TRIM

Gastkonfiguration

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

devices {
...
    issue_discards = 1
}

Fügen Sie in der fstab die Option discard zu den Dateisystemen hinzu, die Sie automatisch verwerfen 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

Die Dateisysteme neu mounten, damit sie ihre neuen Optionen aufnehmen.

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

Manuelles Beschneiden freier Blöcke jetzt mit fstrim. fstrim verwendet das gemountete Dateisystem, nicht das Block-Gerät, das es unterstützt. Anstatt in fstab kontinuierliches Verwerfen einzustellen, könnte dies auf einem wöchentlichen Cron erfolgen. (Der wöchentliche Cron wird für physische SSDs empfohlen, die möglicherweise fragwürdige Unterstützung für TRIM haben, aber das ist hier nicht relevant, da die zugrundeliegenden SSDs vom Host-Betriebssystem gehandhabt werden. siehe: (https://wiki.debian.org/SSDOptimization#WARNING)).

fstrim /
fstrim /build

An diesem Punkt 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 grsec aus Backports, Dateisystem: ext4
  • Gast2: 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
2
2
2
2016-12-16 17:08:31 +0000

Für MacOS-Gast tun Sie dies:

  1. Freien Platz im Gastsystem aufheben:

  2. Fahren Sie die Gast-VM herunter:

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

1
1
1
2016-02-05 11:31:32 +0000

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

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:

Hoffentlich hilft es :)

1
1
1
2017-09-15 07:17:05 +0000

Ich möchte die TRIM-Unterstützung im Betriebssystem nicht aktivieren, weil jede Datenlöschung die Datenkomprimierung in einer VDI-Datei erzwingt, wodurch das Gastsystem unbrauchbar wird, wenn die VDI-Datei auf einer klassischen Rotationsdiskette liegt. Für mich ist es besser, die Komprimierung von Hand durchzuführen, z.B. einmal pro Monat.

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

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

Dazu:

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

  • starten Sie die Maschine

  • In der Linux-Root-Shell mounten Sie die NTFS-Partition mount /dev/sda2 /mnt

  • Null freier Speicherplatz dd if=/dev/zero of=/mnt/bigfile

  • rm /mnt/bigfile

  • erzwingen Sie die Komprimierung von VDI, ohne eine neue Datei zu erstellen: fstrim -v /mnt

0
0
0
2019-08-17 06:07:39 +0000

WICHTIGER HINWEIS FÜR DIE LEGALITÄT (~1997-2007) BETRIEBSSTEUERUNGSSYSTEME

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 noch die Norm, aber Festplatten mit mehr als 2 GB waren bereits im Einsatz. Wenn Sie also versuchen, den gesamten freien Speicherplatz zu verbrauchen, indem Sie eine Datei mit Nullen schreiben (was immer als root geschehen sollte, um den privilegierten freien Speicherplatz von root einzuschließen, den niemand sonst anfassen kann), sehen Sie vielleicht:

Datei zu groß

statt dessen, was Sie erwarten:

Kein Platz mehr auf dem Gerät.

Wenn dies geschieht, haben Sie höchstwahrscheinlich eine Begrenzung der Dateigröße auf 2 GB erreicht. Dies war damals üblich, da viele Dateioperationen Ergebnisse in signierten 32-Bit-Ganzzahlen zurückgaben, so dass negative Werte Fehlercodes melden konnten. Dies bedeutete effektiv, dass die Offset-Ergebnisse ohne besondere Maßnahmen auf 2^31 Bytes begrenzt waren.

Die Abhilfe ist einfach: Erstellen Sie weiterhin separate, unterschiedlich benannte Nullstellungsdateien, bis der Speicherplatz auf der Platte tatsächlich knapp wird.

Wenn Sie als Kursleiter diese Situation für einen Kurs demonstrieren möchten, ist ein 4GB-Plattenabbild mit einer alten Kopie von Red Hat Linux 7.0 ausreichend.

0
0
0
2018-01-20 07:13:01 +0000

Ein sehr netter Trick, um die akzeptierte Antwort zu ergänzen, ist, dass Sie nach dem Nullsetzen des Gastspeichers ohne jegliche Komprimierung auskommen können, indem Sie ein komprimiertes Dateisystem auf dem Host verwenden (z.B. die Auswahl, den Ordner der virtuellen Laufwerke auf NTFS-Eigenschaften auf einem Windows-Host zu komprimieren). 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. kann ein 30 GB großes Gast-Laufwerk, bei dem 15 GB Speicherplatz auf Null gesetzt wurden, auf dem Host-Laufwerk zu 4 GB werden).

Vorbehalte schließen ein, dass der Laufwerkszugriff auf die reale Hardware zunehmen kann und es zu einem leichten Anstieg der CPU-Auslastung kommt.