Restringere i dischi VMware – How to shrink VMware disks
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).
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
Suggeriti dall'autore
Print This • Email this • Twit This! • Add to del.icio.us • Share on Facebook • Digg This! • Stumble It! • AddThis! • Share on Segnalo Alice • Share on OKNotizie
24 Giugno 2008 alle 16:23
Salve a tutti,
voi state parlando di ridurre lo spazio disco di una macchina virtuale..
Ma se io volessi aumentarlo?
Sapete darmi qualche dritta??
Grazie
24 Giugno 2008 alle 17:19
L'utilità vmware-vdiskmanager.exe permette anche di espandere i dischi virtuali tramite l'opzione -x.
vmware-vdiskmanager.exe -x 50Gb disco_virtuale.vmdk
E' chiaro che una volta riavviata la macchina virtuale il nuovo spazio disco risulterà non allocato e bisognerà quindi estendere la partizione esistente; questo è possibile farlo attraverso l'utilità diskpart eseguibile attraverso il prompt dei comandi di Windows. Diskpart non è però in grado di espandere una partizione di boot attiva percui, nel caso in cui quella da estendere sia proprio la partizione di sistema, si dovrà temporaneamente collegare il disco virtuale come secondario di un'altra macchina virtuale di appoggio. Vedi: http://walter.thyselius.org/data/howto/vmware-expand-windows-disk.html
24 Luglio 2008 alle 12:54
per Mirko:
ciao...sto proprio facendo questa cosa; mi puoi spiegare più in dettaglio come estendere la partizione iniziale con quella aggiunta dal vmware-vdiskmanager? mi son ritrovato i 7Gb in + da me aggiunti, ma in una partizione non usabile da Linux.
tra l'altro Diskpart dove lo trovo? Io ho vmware workstation ma non mi sembra sia presente.
24 Luglio 2008 alle 16:34
p.s.
premetto che uso windows e simulo linux-ubuntu con vmware.
leggendo dal link da te messo, sono arrivato al punto 3, ma poi non ho ben capito cosa devo fare dopo, ovvero :
4. Edit the cloned Virtual Machine. Add the just expanded original disk to the machine.
Come si fa????
5. Boot the clone VM. You will see the expanded drive on a new "drive letter". Open a command prompt and run diskpart.exe:
Run "list volume". Look for the volume number for the expanded drive.
Run "select volume x", where x is number for the expanded disk.
Run "extend". The volume will instantly be extended.
Exit from diskpart.
Questo direttamente dentro Linux-Virtual Machine o esternamente con vmware? Io vedo in linux partizione vuota da 7Gb non usabile...
6. Shut down the cloned machine and remove the expanded disk from the cloned machine.
??? sempre più in alto mare...???
7. Boot the original virtual machine. You should now have a larger volume.
You might want to run "chkdsk /f /r" and reboot to be sure the disk is ok. This Control take a long time to complete.
il chkdsk da windows o dentro linux?
GRAZIE!!!
24 Luglio 2008 alle 21:57
@ stefano
Penso che tu abbia fatto un po' di confusione, non riesci a seguire l'articolo che ho segnalato a Fabio poiché è riferito ad una macchina Guest Windows, il comando diskpart infatti è un comando di Windows.
Per fare un minimo di chiarezza occorre secondo me affrontare il problema in modo meno specifico, dunque: "vmware-vdiskmanager -x" (comando disponibile sia su sistemi "ospitanti" Windows che Linux) ti offre la possibilità di espandere un disco virtuale, questo significa che un disco virtuale creato per emulare una dimensione massima di 30 giga (per fare un esempio) può essere portato a 50... 60... 100 giga.. e così via.
Cosa succede però all'interno del sistema operativo "ospite" se aumentiamo la dimensione del disco quando la partizione allocata era di dimensioni inferiori? Si ottiene uno spazio libero non partizionato, ed è per questo motivo che nasce l'esigenza di espandere anche la partizione allocata nel sistema "ospite". Se il sistema "ospite" in questione è Windows allora lo strumento adatto è "diskpart" (lo si trova preinstallato in tutti i moderni sistemi Microsoft) mentre se si tratta di Linux gli strumenti sono diversi, nel caso specifico di Ubuntu si potrebbe utilizzare GParted (pacchetto che si può trovare nelle sorgenti software predefinite e che una volta installato può essere eseguito dal menu Sistema -> Amministrazione -> Editor di partizioni).
La cosa sembrerebbe piuttosto lineare fino a questo punto e non ci sarebbero problemi se la partizione da estendere fosse una partizione "secondaria" e non quella di avvio del sistema... infatti, se non vado errato, sia Linux che Windows non permettono di ridimensionare la partizione di avvio del sistema (il disco "C:" per Windows o il mountpoint "/" per Ubuntu Linux) mentre è attiva e sta svolgendo la sua funzione.
In quest'ultimo caso è quindi necessario spegnere l'"ospite" da ridimensionare e caricare il suo disco .vmdk come disco aggiuntivo di una seconda macchina virtuale "di appoggio" (la quale per comodità potrebbe anche essere un clone della stessa), in questo modo la partizione da espandere non risulterà più "di avvio" ma "secondaria" e sarà perciò possibile utilizzare le funzionalità di ridimensionamento offerte dai suddetti strumenti "diskpart" o "GParted". L'operazione di caricamento del disco .vmdk come aggiuntivo di una macchina virtuale è possibile farla in VMWare usufruendo del wizard di "aggiunta nuovo hardware -> hard disk".
Ho finito, commento un po' lungo... che sia il caso di farne un tutorial? ;-)
25 Luglio 2008 alle 20:36
grazie dell'ottima spiegazione...ora però ti devo chiedere qual'è il wizard di “aggiunta nuovo hardware -> hard disk”.
scusa se ti stresso la vita ma da solo veramente sarei perso!!!
GRAZIEEEEEEEE!!!!!!!!!
26 Luglio 2008 alle 0:11
@ stefano
Sicuramente avrai notato che quando una macchina virtuale è spenta puoi modificarla cliccando la voce "Edit virtual machine settings", la finestra che si apre successivamente alla pressione di tale voce presenta l'elenco dell'hardware virtuale; se osservi la parte bassa di questa finestra noterai un tasto denominato "ADD" (ovvero "Aggiungi")... tale tasto serve appunto ad avviare il wizard di "aggiunta nuovo hardware".
26 Luglio 2008 alle 10:26
ho fatto quanto hai detto...solo ke con il gestore partizioni sono riuscito a far sì che la partizione vuota diventasse una partizione attiva, ma non son poi riuscito a fonderla con quella primaria. Oltretutto avviato il sistema con la nuova partizione, la nuova parte era disabilitata e chiedeva un punto di mount( io gli ho dato / e subito si è mangiato tutto lo spazio ).
Come fondo le due partizioni?
Grazie
26 Luglio 2008 alle 12:11
@ stefano
Il nuovo spazio da fondere con la partizione già esistente deve risultare "Non allocato", non devi partizionarlo. A quel punto ti sarà possibile ridimensionare la partizione di boot inglobando appunto tutto lo spazio "non allocato".
26 Luglio 2008 alle 13:35
sai ke invece così non mi fa estendere la partizione di boot? posso solo rimpicciolirla. per farti capire la situazione grafica che mi presenta, ho:
primo rettangolo CONTENENTE la partizione di boot, poi un rettangolo CONTENENTE quella di swap, poi un rettangolo CONTANENTE la parte vuota non allocata, ma poichè i rettangoli non sono uniti, non mi fa fare cose assieme, sono come compartimenti stagni.
26 Luglio 2008 alle 13:38
p.s.
in windows uso partition magic e per dirti in un caso del genere io dovrei prima fondere i due rettangoli. su linux c'è solo resize/move, non altro.
26 Luglio 2008 alle 22:55
@ stefano
Ovviamente lo spazio non allocato deve essere adiacente alla partizione da espandere. Questo significa che devi: prima eliminare le due partizioni che costituiscono lo swap (la estesa e la logica al suo interno) e poi espandere la partizione di boot lasciando un po' di spazio non allocato nel quale andrai infine a ricreare lo swap. Ho voluto simulare la cosa sul mio pc per farti qualche screenshot ed ho notato che quando la partizione da espandere è formattata con filesystem EXT3 (con journaling) non si riesce a ridimensionarla... bisogna prima disattivare il journaling, ridimensionarla e poi riattivarlo... effettivamente è un po' complicato.
Facciamo così: dato che il sistema di utilizzare una macchina virtuale di appoggio per Linux sembra complicare un po' troppo le cose, sopratutto per chi non è molto pratico, dimenticati quel passaggio e scarica GParted in versione Live CD ed utilizzalo per fare boot della macchina che vuoi ridimensionare, ti ricordo che su VMware una immagine ISO può essere usata direttamente come CD.
Ecco qualche screen:
- ho esteso un disco da 8 giga fino a 10 giga... screen 1
- ho avviato GParted Live CD sulla macchina da espandere... screen 2
- ho eliminato le partizioni che costituiscono lo spazio di swap... screen 3
- ho esteso la partizione di root lasciando un po' di spazio libero per ricreare lo swap... screen 4 e screen 5
- ho ricreato le partizioni per lo swap... screen 6
- Fine... ho riavviato il sistema disconnettendo l'immagine ISO di GParted Live CD.
28 Luglio 2008 alle 9:07
GRAZIE MIRKO, è andato tutto a buon fine!!!!
A buon rendere!!!!!!
Stefano
14 Ottobre 2009 alle 16:11
Ho un S.O. virtuale windows di 50GB senza allocazione dello spazio disco.
Purtroppo non ho mai utilizzato la procedura di riduzione dello spazio, per cui, nonostante ci siano solo 16GB di dati caricati, è arrivato a 50 gb e quando lo lancio si presenta una videata nera e non carica il SO.
Ho provato ad aumentare la dimensione col comando:
vmware-vdiskmanager.exe -x 100Gb disco_virtuale.vmdk
ma mi dà errore:
An error occurred while writing a file; the disk is full. Data has not been saved. Free some space and try again (0xd00000008).
Anche 'riduci' del vmtools non funziona.
cosa devo fare per ripristinarlo?
Grazie
14 Ottobre 2009 alle 16:13
An error occurred while writing a file; the disk is full. Data has not been saved. Free some space and try again (0xd00000008).
Come si libera lo spazio?
15 Ottobre 2009 alle 18:41
@ livio
da quello che scrivi sembra quasi che il VMWare Server non trovi spazio sufficiente sul tuo sistema operativo HOST piuttosto che sul GUEST che vorresti ridimensionare.
Che sistema operativo è quello HOST? Quanto spazio libero hai nel datastore o sull'unità logica nella quale si trova la macchina virtuale?
20 Ottobre 2009 alle 11:11
Scusa se rispondo solo adesso...
avevi ragione, era un problema di spazio su s.o. Host.
Ho risolto il problema.
Grazie
ciao