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

Come compattare la dimensione dei file VDI di VirtualBox?

Ho una VirtualBox VM che ha configurato una dimensione del disco rigido molto grande (più grande dell'host). Per mio errore, un programma sulla VM ha generato molti file di log e la dimensione del file VDI continua a crescere fino a quando non c'è più spazio sull'host.

Ora ho cancellato i file di log ma la dimensione del file VDI non diventa più piccola dopo aver usato VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

C'è un modo per compattare veramente la dimensione del file VDI? Grazie!

Risposte (8)

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

È necessario eseguire i seguenti passi:

  1. 1. Eseguire la deframmentazione nell'ospite (solo per Windows)
    1. Annullare lo spazio libero:
    1. Spegnere l'ospite VM
  2. Spegnere l'ospite VM

Ora eseguire il comando modifymedium di VBoxManage con l'opzione --compact:

Questo riduce la dimensione del vdi.

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

Sono su un host Windows 7 con ospiti Windows, Ecco un file batch che ho scritto per Compattare tutti i VDI in un albero di cartelle

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

Ho lasciato i link nei commenti in modo da poter (più o meno) dire come funziona.

edit

Bene, dopo tutto questo, ho provato il CloneVDI tool e ha fatto un buon lavoro in molto meno tempo e in un click.

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

Per MacOS Guest fare questo:

    1. Annullare lo spazio libero nel sistema ospite:
    1. Spegnere il sistema ospite VM
  1. Eseguire questo comando per ridurre la dimensione dell'immagine del disco VDI

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

Lo uso per la mia immagine VDI montata su Debian virtuale in Windows VirtualBox. Non è una soluzione generale, ma dovrebbe almeno darvi un'idea di quello che faccio.

Comandi 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

Comandi in Windows:

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


Spero che aiuti :)
1
1
1
2017-09-15 07:17:05 +0000

Non voglio abilitare il supporto TRIM nel sistema operativo, perché ogni cancellazione di dati costringerà la compattazione dei dati nel file VDI, rendendo il sistema ospite inutilizzabile quando il file VDI è sul classico disco rotante. Per me è meglio eseguire la compattazione a mano, ad esempio una volta al mese.

Durante la normale compattazione, il contenuto del file VDI viene copiato in un nuovo file. Questo richiede un po’ di spazio libero (a volte grande) sul disco ospite.

Ho una soluzione simile a quella indicata da Andrew Domaszek. Funziona molto bene anche con NTFS (Windows10).

Per fare questo:

  • creare una nuova macchina virtuale che si avvia con GParted Live CD (potete usare la vostra distro Linux preferita).
  • Modificare le impostazioni della macchina e impostare il controller del disco SATA
  • Aggiungere i file VDI esistenti che si desidera compattare
  • Cambiare i dischi basati su VDI per essere visibili come SSD con il supporto TRIM:

  • avviare la macchina

  • Nella root shell di Linux, montare la partizione NTFS mount /dev/sda2 /mnt

  • zero spazio libero dd if=/dev/zero of=/mnt/bigfile

  • rm /mnt/bigfile

  • forzare la compattazione VDI senza creare un nuovo file: fstrim -v /mnt

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

NOTA IMPORTANTE PER I SISTEMI OPERATIVI DI LEGACY (~1997-2007)

In generale, le tecniche nelle risposte date in precedenza sono valide; COME TUTTO, c'è un caso speciale molto importante.

Per un periodo di alcuni anni - forse 1997-2007 o così - i sistemi operativi a 32 bit erano ancora la norma, ma i dischi rigidi più grandi di 2GB erano già in uso. Di conseguenza, quando si cerca di consumare tutto lo spazio libero scrivendo un file di zero (che dovrebbe sempre essere fatto come root, per includere lo spazio libero privilegiato di root, che nessun altro può toccare), si può vedere:

File troppo grande

invece di quello che ci si aspetta:

Non c'è più spazio sul dispositivo.

Se questo accade, molto probabilmente si è raggiunto un limite di 2GB di dimensione del file. Questo era comune all'epoca perché molte operazioni di file restituiti risultano in numeri interi a 32 bit firmati, in modo che i valori negativi possano riportare codici di errore. Questo significava effettivamente che i risultati di offset erano limitati a 2^31 byte senza misure speciali.

La soluzione è semplice: continuare a creare file di azzeramento separati e con nomi diversi fino a quando il disco non esaurisce lo spazio.

Se sei un istruttore che vuole dimostrare questa situazione per una classe, è sufficiente un'immagine disco da 4GB con una vecchia copia di Red Hat Linux 7.0 di Red Hat.

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

Un trucco molto pulito per integrare la risposta accettata è che si può uscire senza fare alcuna compattazione dopo l'azzeramento dello spazio ospite, utilizzando un file system compresso sull'host (ad esempio, selezionando di comprimere la cartella delle unità virtuali sulle proprietà NTFS su un host Windows). Questo infatti ha il vantaggio di risparmiare molto più spazio perché i sistemi operativi tendono a contenere molti file di testo o file binari ripetitivi (ad esempio un drive ospite da 30GB che aveva 15GB di spazio azzerato può passare a 4GB sul drive host).

Caveats includono che l'accesso al drive sull'hardware reale può aumentare e c'è un leggero aumento nell'utilizzo della CPU.