giovedì 4 ottobre 2007

VirtualBox: compattare dischi virtuali ad espansione dinamica - guest Windows

Aggiornamento: il post resta validissimo per la comprensione tecnica del problema pertanto continuo a consigliarne la lettura, ma al momento di procedere è senz'altro più semplice usare CloneVDI.
_________________________________________________________________________

Nel prologo sull'argomento, abbiamo inquadrato 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.

In questo post, realizzato con il contributo di Michele Benvegnù, vediamo la soluzione a questo problema e la successiva compattazione del file vdi per guest Windows; nel prossimo post sull'argomento vedremo il tutto per guest Linux.

Si chiama SDelete ed è 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 web http://www.microsoft.com/technet/sysinternals/FileAndDisk/SDelete.mspx 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, un programma utilizzabile solo da linea di comando in quanto privo di front-end grafico.

Vediamo gli screenshot della situazione iniziale così da poter poi apprezzare anche visivamente le differenze. In fig. 1 vedete la situazione dello spazio sul guest.

Fig. 1 - Compattazione disco virtuale - spazio iniziale guest
fig. 1


Con un disco rigido di capacità massima di 20 GB, vi ho copiato sopra 4 GB di file tramite condivisione cartelle: ho copiato 6 volte con 6 nomi diversi la iso d'installazione di Ubuntu:

700 MB x 6 = ~ 4 GB

che sommati ai circa 1-1,2 GB dell'installazione di Windows, fanno circa 5,2 GB occupati di spazio disco occupato. Ed infatti lo spazio libero sul disco del guest è:

20 GB - 5,2 GB = 14,8 GB

Il file vdi sull'host (fig. 2) è appunto di circa 5,8 GB, quanto serve a contenere tutto il disco rigido virtuale.

Fig. 2 - Compattazione disco virtuale - spazio iniziale file vdi su host
fig. 2


Ora elimino (non cestino, ma elimino definitivamente, anche dal cestino) i sei file di Ubuntu nel guest, in fig. 3 la nuova situazione dello spazio sul guest.

Fig. 3 - Compattazione disco virtuale - spazio iniziale file vdi su host
fig. 3


Sono stati liberati i 4 GB e passa, quindi:

14,8 GB liberi + oltre 4 GB liberati = 18,9 GB liberi

Andate a controllare la situazione sull'host: come ci aspettavamo, non è cambiato nulla, il file vdi non si è ridimensionato di conseguenza e invece di scendere a soli 1-1,2 GB e rimasto di 5 e passa giga.


Ok, è il momento di far intervenire SDelete.

Aprite la finestra del DOS con: pulsante start --> Esegui --> scrivete cmd e date invio. Nella finestra DOS che si apre, date questo comando doppi apici compresi:

“C:\Documents and Settings\utente1\Desktop\sdelete.exe” -c C:

Nel frattempo il comando porta a termine il suo compito (fig. 4), potranno servire anche una decina di minuti a seconda del sistema che avete, vi spiego la sua sintassi:

- C:\Documents and Settings\utente1\Desktop\ è il percorso dove si trova SDelete, l'avevo messo sul Desktop del guest, sostituitelo con il percorso della cartella in cui avete messo SDelete sul vostro sistema guest;

- i doppi apici servono a causa dello spazio in Documents and Settings, se nel percorso della vostra cartella non vi sono spazi, potete ometterli;

- c è un flag che dice a SDelete di mettere tutti zero nei settori liberi del disco rigido virtuale;

- C: è il disco su cui agire.

Fig. 4 - Compattazione disco virtuale - comando SDelete
fig. 4


Se nel frattempo SDelete ha terminato, all'interno della finestra DOS sarà comparso un messaggio del tipo: Free space cleaned on C:. Spegnete la macchina guest.

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

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.

Nel frattempo la compattazione dovrebbe essere finita anche sul vostro sistema, in fig. 5 il risultato: come potete vedere, il file vdi è tornato all'incirca alle sue dimensioni iniziali.

Fig. 5 - Compattazione disco virtuale - dimensione file vdi dopo compattazione
fig 5


E se il sistema guest è Linux? I passi da fare sono i medesimi, lì vedremo nel prossimo post sull'argomento.

@:\> ... con il contributo di Michele Benvegnù (www.benvegnu.it)