In questo articolo spiegherò come utilizzare alcuni strumenti inclusi nel pacchetto VMware Server al fine di diminuire lo spazio disco occupato dai files .vmdk delle macchine virtuali, proporrò inoltre alcune soluzioni applicabili nei casi in cui l'utilizzo degli stessi non sia supportato.
Introduzione
In fase di creazione di una macchina virtuale possiamo scegliere tra due diverse metodologie di generazione degli hard disk virtuali: con allocazione immediata dello spazio disco oppure senza allocazione dello spazio disco.
La differenza sostanziale tra le due modalità è che nel primo caso (con allocazione immediata) l’hard disk virtuale occuperà sul disco fisico della macchina ospitante una quantità di spazio pari alle dimensioni massime stabilite, mentre nel secondo caso (senza allocazione dello spazio disco) le dimensioni dell’hard disk virtuale saranno inizialmente minime ma andranno in crescendo di pari passo alla mole dei dati che vi verranno memorizzati. Quest'ultima opzione, pur non essendo la scelta ideale se desideriamo ottenere le migliori performance, offre comunque enormi vantaggi poiché le macchine virtuali risultano normalmente molto più "snelle" e quindi facili da spostare, replicare, copiare/backuppare. Va detto fin da subito però che le dimensioni di un disco di questo tipo non resteranno ottimizzate per sempre, una volta cresciute non diminuiranno nemmeno in seguito alla cancellazione di dati, per questo motivo nasce la necessità di restringerlo periodicamente in modo da trarre beneficio delle sue proprietà anche a lungo termine.
Prima di tutto vediamo i prerequisiti necessari per concludere lo "shrinking" di un disco
- Non devono esistere snapshot associati alla macchina virtuale interessata, nel caso in cui esistano vanno preventivamente eliminati (se non avete idea di cosa stia parlando vi invito ad approfondire l’argomento per mezzo di questo link [1]).
E' possibile eliminare uno snapshot sia usufruendo delle funzionalità messe a disposizione dall'interfaccia grafica VMware Client (per Linux o per Windows è indifferente) sia attraverso l'utilità a riga di comando vmrun. VMware Server nello specifico permette di effettuare un unico snapshot che fisicamente risulta facilmente identificabile poiché possiede lo stesso nome del disco primario della macchina virtuale (file .vmdk) seguito però da un numero seriale (ad esempio -000001 per il primo snapshot). - Con VMware Server l'operazione di shrink causerà un periodo più o meno lungo di indisponibilità della macchina virtuale, questo anche se viene eseguito in modalità online.
Cosa intendo con il termine modalità online?
Su entrambe le piattaforme Windows e Linux è possibile restringere il disco virtuale principalmente in due modi: utilizzando lo strumento vmware-vdiskmanager eseguibile da riga di comando quando la macchina virtuale è spenta (modalità offline) oppure tramite l'applicazione VMware Toolbox quando la macchina virtuale è avviata (modalità online).
In entrambi i casi sono necessari due diversi passaggi per concludere l'operazione con successo: dapprima la preparazione del disco virtuale (che si occupa di sovrascrivere e rendere contiguo tutto lo "spazio libero" esistente) e successivamente lo shrinking effettivo (che elimina dal file .vmdk tutto lo "spazio libero" precedentemente allocato).
Senza l'opportuna preparazione lo shrink non porterà a nessun risultato.
Shrink in modalità online e offline
Vediamo brevemente i passaggi necessari per eseguire lo shrink di un disco virtuale nella situazione più semplice e supportata: stiamo parlando di un sistema Host Windows che ospita un sistema Guest Windows oppure Linux con interfaccia grafica.
In modalità online è possibile preparare e restringere il disco tramite lo strumento VMware Toolbox, esso è incluso nel pacchetto VMware Tools che ovviamente andrebbe preventivamente installato in ogni sistema Guest.
Nel menù contestuale che si ottiene cliccando con il tasto destro del mouse sull'icona di VMware Tools (presente in systray) scegliete la voce Open VMware Tools.
Recatevi nella scheda shrink, assicuratevi che tutte le partizioni (Mount Points) da restringere siano selezionate, e premete il tasto Prepare to shrink. In questo frangente la macchina virtuale risulterà ancora perfettamente raggiungibile.
Una volta terminata la preparazione del disco vi verrà chiesto se desiderate o meno procedere con lo shrink effettivo, confermate. Per tutta la durata di questa operazione la macchina virtuale non sarà più raggiungibile.
Al termine della procedura verrete avvisati e la macchina virtuale diverrà nuovamente disponibile.
Quanto appena visto è attuabile anche su sistemi Linux Guest dotati di interfaccia grafica.
In modalità offline invece è possibile eseguire lo shrink utilizzando lo strumento vmware-vdiskmanager che potete trovare all'interno della cartella di installazione di VMWare Server.
vmware-vdiskmanager non deve necessariamente risiedere nella suddetta cartella ma può anche essere spostato e trasportato, si tratta di una applicazione di tipo stand-alone.
Soltanto dopo aver portato a termine la preparazione del disco tramite VMware Toolbox, potrete spegnere la macchina virtuale ed eseguire attraverso il prompt dei comandi
vmware-vdiskmanager -k nome_disco.vmdk
Quando gli strumenti VMware non possono essere di aiuto
I passaggi sopra descritti risultano estremamente semplici da mettere in pratica nel momento in cui ci troviamo ad utilizzare una combinazione di sistemi Host/Guest di tipo Windows, ma cosa succederebbe se non potessimo usufruire dello strumento VMware Toolbox? Questo potrebbe avvenire ad esempio se il sistema Guest fosse una distribuzione Linux priva di interfaccia grafica. In tal caso non potremmo più eseguire lo shrink in modalità online.
E se anche il sistema Host fosse una distribuzione Linux? La situazione risulterebbe ulteriormente complicata poiché vmware-vdiskmanager per Linux non supporta l'opzione -k per l'esecuzione dello shrink in modalità offline.
Purtroppo il prodotto VMware Server su piattaforma Linux sembra essere meno supportato percui al fine di restringere i dischi virtuali diventa assolutamente necessario ricorrere a qualche espediente.
Guest Linux - Metodo alternativo di preparazione allo shrink
In un sistema Linux Guest la preparazione allo shrink può essere sostituita da un particolare impiego del comando dd.
dd if=/dev/zero of=/empty_file; rm /empty_file
In questo caso verrà inserito all’interno di un file, denominato empty_file e situato in radice, uno stream di zeri fino ad occupare tutto lo spazio libero presente nella partizione, una volta che lo spazio disco sarà completamente esaurito il file verrà rimosso. Ovviamente questa operazione andrà eseguita per ogni mount point presente nel sistema in questione, per ottenere una lista di tutti i mount point unitamente alla loro dimensione è possibile utilizzare il seguente comando
df -Th
Per ottenere il miglior risultato possibile dall'operazione di shrink sarà quindi necessario eseguire un comando dd per ogni mount point utile.
Ad esempio, per un sistema che possiede i seguenti mount point
/ /home /tmp /usr /var
dovremo eseguire
dd if=/dev/zero of=/empty_file; rm /empty_file
dd if=/dev/zero of=/home/empty_file; rm /home/empty_file
dd if=/dev/zero of=/tmp/empty_file; rm /tmp/empty_file
dd if=/dev/zero of=/usr/empty_file; rm /usr/empty_file
dd if=/dev/zero of=/var/empty_file; rm /var/empty_file
Linux Host - Metodo alternativo per eseguire lo shrink
Abbiamo detto che la versione di vmware-vdiskmanager per sistemi Host Linux non supporta lo shrink. Una volta preparato il disco da restringere (passo assolutamente necessario) è comunque possibile ottenere il medesimo risultato effettuandone la conversione ad un disco dello stesso tipo. L'opzione -r di vmware-vdiskmanager permette di effettuare conversioni tra differenti tipologie di dischi virtuali, questa operazione però, se possibile, si preoccupa anche di restringerne automaticamente le dimensioni.
Operativamente i passi da eseguire sono i seguenti
Rinominare il disco virtuale da shrinkare
mv nome_disco.vmdk nome_disco-unshrinked.vmdk
Convertire il file .vmdk in un disco dello stesso tipo, ad esempio per un singolo disco non allocato si procederà come segue
vmware-vdiskmanager -r nome_disco-unshrinked.vmdk -t 0 nome_disco.vmdk
Se possibile il disco verrà così ridimensionato e potrete quindi eliminarne la copia unshrinked
rm nome_disco-unshrinked.vmdk
Vi invito a consultare l'help di vmware-vdiskmanager per maggiori dettagli.
Riepilogo operativo
Ecco uno schema riassuntivo di quanto dovreste aver appreso da questo articolo
Combinazione Windows Host - Windows Guest: in modalità offline è possibile utilizzare vmware-vdiskmanager, in modalità online il software VMware Toolbox.
Combinazione Windows Host - Linux Guest (con interfaccia grafica e VMware Tools): in modalità offline è possibile utilizzare vmware-vdiskmanager, in modalità online il software VMware Toolbox.
Combinazione Windows Host - Linux Guest (senza interfaccia grafica e/o VMware Tools): in modalità offline è possibile utilizzare vmware-vdiskmanager, in modalità online è possibile effettuare soltanto la preparazione allo shrink per mezzo del comando dd.
Combinazione Linux Host - Windows Guest: in modalità offline (con vmware-vdiskmanager) è possibile restringere il disco mediante conversione soltanto se precedentemente preparato, in modalità online è possibile effettuare tutte le operazioni per mezzo del software VMware Toolbox.
Combinazione Linux Host - Linux Guest (con interfaccia grafica e VMware Tools): in modalità offline (con vmware-vdiskmanager) è possibile restringere il disco mediante conversione soltanto se precedentemente preparato, in modalità online è possibile effettuare tutte le operazioni per mezzo del software VMware Toolbox.
Combinazione Linux Host - Linux Guest (senza interfaccia grafica e/o VMware Tools): in modalità offline (con vmware-vdiskmanager) è possibile restringere il disco mediante conversione soltanto se precedentemente preparato, in modalità online è possibile effettuare soltanto la preparazione allo shrink per mezzo del comando dd.
Autore
Mirko Iodice
mirko -at- notageek (.dot) it