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

Hoe kan ik de VDI-bestandsgrootte van VirtualBox verdichten?

Ik heb een VirtualBox VM die een zeer grote harde schijf heeft geconfigureerd (groter dan de host). Door mijn fout heeft een programma op de VM veel logbestanden gegenereerd en de VDI bestandsgrootte blijft groeien totdat er geen ruimte meer is op de host.

Nu heb ik de logbestanden verwijderd maar de VDI bestandsgrootte wordt niet kleiner na het gebruik van VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

Is er een manier om de VDI bestandsgrootte echt te comprimeren? Bedankt!

Antwoorden (8)

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

Je moet de volgende stappen doen:

    1. Start defrag in de gast (alleen Windows) . 2. Maak de vrije ruimte ongedaan:
    1. Sluit de gast VM

af. Voer nu het commando modifymedium van VBoxManage uit met de optie --compact:

Dit verkleint de grootte van de vdi.

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

Ik ben op een Windows 7 host met Windows gasten, Hier is een batch file die ik heb geschreven naar Compact alle VDI’s in een mapstructuur

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

Ik heb de links in de commentaren gelaten zodat je (soort van) kunt vertellen hoe het werkt.

bewerken

Nou, na dat alles, heb ik de CloneVDI tool geprobeerd en het deed goed werk in veel minder tijd en in een klik.

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

ospite Debian su host Windows usando discard/TRIM.

Questa non è una risposta diretta di per sé, perché sto affrontando il problema, non la domanda. Invece di compattare periodicamente l'immagine, questa soluzione utilizza lo scarto per rimuovere automaticamente i blocchi inutilizzati nell'immagine disco VM dell'host.

Questa soluzione richiede un filesystem guest che supporti TRIM continuo. Il wiki di Arch Linux ha una lista di filesystem che supportano le operazioni TRIM .

FDE e cryptoroot non sono specificamente coperti, poiché ci sono problemi di sicurezza e nessuna delle altre soluzioni a questa domanda permetterebbe di compattare. Il wiki di Arch Linux ha informazioni su TRIM e dispositivi dm-crypt .

In teoria, questo funzionerà per tutti gli ospiti Linux su host VBox che utilizzano lo storage VDI.

Configurazione host

Con VBox uscito e nessuna VM in esecuzione, aggiungere il supporto allo scarto ai dischi impostando sia discard che nonrotational per ogni disco nel file di configurazione per la VM. In questo momento discard non è nella GUI, ma nonrotational è esposto come casella di controllo “Solid-state Drive”. (rif: vbox forums, discard support )

<AttachedDevice discard="true" nonrotational="true" type="HardDisk" [..other options..] >
``` ```
sudo hdparm -I /dev/sda | grep TRIM

Avviare la VM e verificare che il supporto TRIM sia abilitato:

devices {
...
    issue_discards = 1
}

Guest Configuration

Se LVM è in uso, modificare l'impostazione di disinserimento in /etc/lvm/lvm.conf. (rif: debian wiki, lvm.conf example )

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
``` ```
sudo mount -o remount /
sudo mount -o remount /build

In fstab, aggiungere l'opzione discard ai filesystem che si desidera scartare automaticamente (rif: debian wiki, fstab example )

fstrim /
fstrim /build

Rimontare i filesystem per fargli prendere le nuove opzioni.

&001 &001

Tagliare manualmente i blocchi liberi ora con fstrim. fstrim usa il filesystem montato, non il dispositivo a blocchi che lo supporta. Invece di impostare lo scarto continuo in fstab, questo potrebbe essere fatto su un cron settimanale. (Il cron settimanale è raccomandato per SSD fisici che possono avere un supporto discutibile per TRIM, ma questo non è rilevante in questo caso poiché gli SSD sottostanti sono gestiti dal sistema operativo host. vedi: ssd trim warning ).

&001 &001

A questo punto, la dimensione dei filesystem all'interno della VM e la dimensione delle immagini della VM dovrebbero essere abbastanza vicine in valore.

Testato con:

  • Guest1: Debian 8.7, kernel: linux 4.8 grsec da backports, filesystem: ext4
  • Guest2: Debian 9 RC2, kernel: linux 4.9, filesystem: ext4
  • Host1: VBox 5.1.14, Win7, immagine fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, immagine fmt: VDI
2
2
2
2016-12-16 17:08:31 +0000

Voor MacOS Guest doe dit:

  1. Maak de vrije ruimte in het gastensysteem ongedaan:

    1. Sluit de gast VM

af. 4. Voer dit commando uit om de grootte van de VDI-schijf te verminderen

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

Ik gebruik dit voor mijn VDI-image die in Windows VirtualBox op virtuele Debian is gemonteerd. Het is geen algemene oplossing, maar het zou je op zijn minst een kern van wat ik doe moeten geven.

Commando’s 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

Commando’s in Windows:

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

Hoop dat het helpt :)

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

Ik wil TRIM-ondersteuning in het OS niet inschakelen, omdat elke gegevensschrapping het verdichten van gegevens in het VDI-bestand afdwingt, waardoor het gastsysteem onbruikbaar wordt als het VDI-bestand op een klassieke rotatieschijf staat. Voor mij is het beter om het comprimeren met de hand uit te voeren, bijvoorbeeld één keer per maand.

Tijdens het normale comprimeren wordt de inhoud van het VDI-bestand gekopieerd naar een nieuw bestand. Dit vereist enige (soms grote) vrije ruimte op de host disc.

Ik heb een oplossing die vergelijkbaar is met die van Andrew Domaszek. Het werkt heel goed, zelfs met NTFS (Windows10).

Om dit te doen:

  • maak een nieuwe virtuele machine die opstart met GParted Live CD (je kunt je favoriete Linux distro gebruiken).
  • bewerk machine-instellingen en stel SATA disc controller in - voeg bestaande VDI bestanden toe die u wilt comprimeren
  • verander VDI gebaseerde schijven om zichtbaar te zijn als SSD met TRIM ondersteuning:

  • start machine

  • in Linux root shell, mount NTFS partitie mount /dev/sda2 /mnt

  • nul vrije ruimte dd if=/dev/zero of=/mnt/bigfile

  • rm /mnt/bigfile

  • forceer het comprimeren van VDI zonder een nieuw bestand aan te maken: fstrim -v /mnt

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

BELANGRIJKE OPMERKING VOOR WETENSCHAP (~1997-2007) OPERATINGSSYSTEMEN

In het algemeen zijn de technieken in de eerder gegeven antwoorden geldig; HOWEVER, er is een zeer belangrijk speciaal geval.

Voor een periode van enkele jaren - misschien 1997-2007 of zo - waren 32-bits besturingssystemen nog steeds de norm, maar harde schijven groter dan 2GB waren al in gebruik. Als gevolg hiervan, wanneer je probeert alle vrije ruimte te gebruiken door een bestand met nullen te schrijven (wat altijd als root gedaan moet worden, om de geprivilegieerde vrije ruimte van root op te nemen, die niemand anders kan aanraken), zie je misschien:

Bestand te groot

in plaats van wat je verwacht:

Geen ruimte meer op het apparaat.

Als dit gebeurt, heb je hoogstwaarschijnlijk een 2GB beperking van de bestandsgrootte geraakt. Dit was in die tijd gebruikelijk omdat veel bestandsbewerkingen die terugkomen resulteren in gesigneerde 32-bits gehele getallen, zodat negatieve waarden foutcodes kunnen melden. Dit betekende effectief dat de offset resultaten beperkt waren tot 2^31 bytes zonder speciale maatregelen.

De workaround is eenvoudig: blijf aparte, anders genoemde zeroing bestanden maken tot de schijf daadwerkelijk uit de ruimte is.

Als u een instructeur bent die deze situatie wil demonstreren voor een les, is een 4GB schijfimage met een oude kopie van Red Hat Linux 7.0 voldoende.

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

Een zeer nette truc om het geaccepteerde antwoord aan te vullen is dat u weg kunt komen zonder enige verdichting na het op nul zetten van de gastruimte, door gebruik te maken van een gecomprimeerd bestandssysteem op de host (bijvoorbeeld door te kiezen voor het comprimeren van de map met virtuele schijven op NTFS-eigenschappen op een Windows-host). Dit heeft in feite het voordeel om veel meer ruimte te besparen, omdat besturingssystemen de neiging hebben om veel herhalende tekst of binaire bestanden vast te houden (bijvoorbeeld een 30GB gastschijf die 15GB ruimte op nul had staan, kan op de hostschijf tot 4GB worden omgevormd).

Onder voorbehoud van het feit dat de schijftoegang op de echte hardware kan toenemen en dat er een lichte toename van het CPU-gebruik is.