Il software è come il sesso, è meglio quando è libero. (Software is like sex, it's better when it's free).

— Linus Torvalds

Compattare un VDI di Virtualbox

http://www.stenoweb.it/files/blog/virtualbox.png Io per lavoro ho bisogno anche di Windows, e siccome il dual boot mi pare molto scomodo da usare, come molti altri ho deciso di virtualizzare il sistema made in Redmond in una bellissima VM con Virtualbox. Tutto ok, il VDI è comodissimo pure da trasportare e backuppare (altrimenti mi ci vuole una giornata a reinstallare tutti i tools di sviluppo in Windows...), non fosse che aumenta giorno per giorno di dimensioni: A fronte di 10GB circa "reali" il file VDI è arrivato oramai a quasi 30GB. VMWare ha un tool molto efficente per "comprimere" il file VMDK, Virtualbox và un po' aiutato. Grazie a Giornaledi Sistema per le preziose informazioni. Riporto qui il suo lavoro.

Il problema

Quando liberiamo spazio sul disco rigido virtuale, il corrispondente file vdi che lo contiene sull'host non si ridimensiona di conseguenza: occorre forzarne il ridimensionamento con un apposito comando, modifyvdi, disponibile solamente dalla console a linea di comando dell'host attraverso il gestore di comandi di VirtualBox, VboxManage.

Purtroppo però ciò non è sufficiente, occorre che sia soddisfatto un pre-requisito: lo spazio libero sul guest deve essere marcato a zero (il valore, non la cifra) prima che il comando possa agire su di esso compattandolo. Questo perché quando cancellate un file, questi non viene realmente cancellato: semplicemente lo spazio che occupa viene dichiarato libero in una apposita tabella, in questo modo lo si può riutilizzare per scriverci nuovi file.

I settori del disco rigido quindi, contengono ancora i dati, ed è per questo che il comando modifyvdi non riesce a fare il suo lavoro: può infatti agire solo su spazio realmente vuoto e non su quello dichiarato semplicemente come tale. Occorre un programma che svuoti per davvero lo spazio dichiarato libero. Innotek a dire il vero qui è stata un po' latitante, tant'è che VirtualBox a differenza di prodotti analoghi, non ha uno strumento per marcare a zero i settori liberi del disco rigido virtuale.

Per ora vediamo la soluzione a questo problema e la successiva compattazione del file vdi per guest Windows.

Compattare il disco : defrag

Come prima operazione bisogna eseguire un bel defrag sul disco del guest: in questo modo i dati saranno "compattati" e lo spazio libero reso contiguo. Non servono utility speciali, quella predefinita di Windows può bastare.

Pulire lo spazio vuoto : sdelete

Risolviamo il problema zero: in aiuto ci viene SDelete, un programma di Mark Russinovich di Sysinternals. La sua funzione (tra le altre) è proprio quella di scrivere a zero i settori non utilizzati di un qualunque disco, compresi quelli virtuali di VirtualBox. Scaricate lo zip dall'indirizzo linkato direttamente dal guest, oppure dall'host in una cartella condivisa, così da renderla immediatamente disponibile anche al guest.

Scompattate il file nel guest, è lì che lo dovremo usare: quello che ci interessa è l'eseguibile sdelete.exe, utilizzabile solo da linea di comando in quanto privo di front-end grafico.
Io ho scompattato il file in c:\windows così è eseguibile direttamente da linea di comando senza specificare il path. Aprite la finestra del DOS con: pulsante start --> Esegui --> scrivete cmd e date invio. Nella finestra DOS che si apre, date questo comando:

sdelete.exe -c C:

Vediamo la sintassi :

  • c è un flag che dice a SDelete di mettere tutti zero nei settori liberi del disco rigido virtuale;
  • C: è il disco su cui agire.

Quando SDelete termina il suo lavoro, all'interno della finestra DOS sarà comparso un messaggio del tipo: Free space cleaned on C: .

Ora spegnete la macchina guest.

Compattare il file VDI : VBoxManage

E' arrivato finalmente il momento di compattare il file vdi sull'host: ora è possibile perché la precondizione che lo spazio libero sul disco rigido virtuale fosse marcata a zero è soddisfatta. Seguendo gli stessi passi fatti nella macchina guest, aprite una finestra DOS anche sull'host. Al suo interno date questo comando, doppi apici compresi:

"C:\Programmi\innotek VirtualBox\VBoxManage" modifyvdi “nomefile”.vdi compact

oppure se l'host è Linux aprite una shell e digitate :
/usr/bin/VBoxManage modifyvdi “nomefile”.vdi compact

Mentre il comando fa il suo lavoro vi spiego anche qui la sintassi:

  • intanto i doppi apici anche qui servono ove ci siano spazi vuoti. Normalmente la linea di comando interpreta gli spazi vuoti come la fine di qualcosa; se non mettiamo i doppi apici, C:\Programmi\innotek VirtualBox\VBoxManage non viene interpretata come una cosa unica ma viene presa solo la prima parte, cioè C:\Programmi\innotek e li si ferma dando errore.
  • stessa cosa con il nome del file vdi (e mi raccomando, solo il nome, l'estensione .vdi NON deve essere compresa nei doppi apici). I doppi apici vanno messi solo se il nome del file vdi presenta spazi al suo interno;
  • VBoxManage è il comando che lancia il manager a linea di comando di VirtualBox, serve a dare da linea di comando tutti i comandi che normalmente date dall'interfaccia grafica, e altri che l'interfaccia grafica non implementa ancora ma sono comunque disponibili da linea di comando;
  • modifyvdi è il comando impartito a VBoxManage, gli dice che volete modificare il file nomefile.vdi;
  • compact dice che la modifica che volete effettuare sul file vdi è la sua compattazione.

Terminata la fase dovreste vedere il vostro VDI diminuito di dimensione, in linea con la quantità di spazio occupato che vedete dall'interno del guest Windows.

Byez ;)

E perché l'estensione .vdi NON deve essere compresa nei doppi apici? Sicuro che non funzioni lo stesso?

I doppi apici non servono.
AH.. attenzione che su linux dovete dare il comando dallo stesso utente che ha installato quella VM e dovete mettere il percorso completo e non solo il nome del file perché deve essere uguale a come memorizzato sul file .xml presente in ~/.VirtualBox

salve ho provato a compattare un file *.vdi ma quando uso il comando "C:\Programmi\innotek VirtualBox\VBoxManage" modifyvdi “nomefile”.vdi compact sul sistema host nel cmd mi dice accesso negato.
Ho anche provato ad avviare cmd da admin ma dice sempre accesso negato, come faccio??
saluti e grazie

Ottimo post!

Il comando corretto per linux è:
/usr/bin/VBoxManage modifyvdi “nomefile”.vdi --compact

Ti eri dimenticato i "--" ;)

Grazie mille,
mi hai letteralmente salvato il culo, ovvero ore di lavoro!
Spiego la mia situazione, magari potrebbe tornare utile ad altri.
Lavorando su una macchina host GNU/Linux avevo creato il disco virtuale dinamico nella home, come di default. Tutto bene fino a quando non decido di eseguire un defrag nella macchina guest (WinXP). Questo ha si compattato i file ma, contestualmente, ha portato il disco virtuale ad occupare tutto lo spazio previsto.
Fin qui poco male; il punto è che, per questioni di spazio limitato in home, avevo creato il disco dinamico in modo tale da farlo coincidere con lo spazio rimasto libero in home, convinto che in ogni caso una installazione quasi pulita di Xp non avrebbe dovuto superare i 5GB. Quindi il raggiungimento della grandezza massima del file .vdi è coinciso con l'esaurimento dello spazio in home con le conseguenze che vi lascio immaginare.
A poco sono valsi l'eliminazione dei punti di ripristino, di paging e successive deframmentazioni.
Grazie alla tua cura ho però ristabilito l'ordine e la previsione di spazio originaria con un bel WinXP.vdi di 5.2GB!
Grazie ancora,

rol

sdelete -z c
(non sdelete -c C:)

Se sei in C basta ance sdelete -z
:P

nella versione 1.51 il flag è -c. Nella versione 1.6 (corrente al gen 2013) il flag è -z

Intanto, anche se tremendamente in ritardo, grazie a steno per la citazione. :)

Nel frattempo le cose sono andate avanti e ora con CloneVDI, un programma Windows funzionante anche su Linux tramite l'uso di Wine, con una comodissima interfaccia grafica si può sia compattare un file VDI, sia modificarlo in numerosi altri modi.

Per i particolari: http://giornaledisistema.blogspot.it/2011/12/clonevdi-modificare-dischi-rigidi.html

GdS

Maintain the excellent job mate. This web blog publish shows how well you comprehend and know this subject. dfbdkgegdfdf