lunedì 5 novembre 2007

VirtualBox: compattare dischi virtuali ad espansione dinamica - guest Linux (4a parte)

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.
_________________________________________________________________________

Nella 3a parte del post sull'argomento avevamo visto come compilare zerofree, il programma per mettere a zero i blocchi liberi del disco rigido della macchina virtuale Linux, cosa indispensabile per poter poi procedere alla sua compattazione con il comando modifyvdi di VirtualBox. Come esempio avevamo usato una distribuzione Ubuntu, ed il programma così ottenuto dalla compilazione è già pronto per essere usato in qualunque altra distribuzione.

E se non avete installata una Ubuntu come fare a compilare il programma? Proprio questo è l'argomento del post: come compilare zerofree in una generica distribuzione Linux, e quali sono le eventuali difficoltà che potete incontrare sia nella compilazione che nel suo uso. Distribuzione di esempio, una Mandriva. Accendete la vostra macchina virtuale e iniziamo.

Un'avvertenza: quando lavoreremo nella shell, questa volta al posto di immagini troverete direttamente il copia-incolla del testo, così se non avete voglia di digitarvelo a manina (cosa sempre consigliata per dare un taglio più concreto alle cose) potete semplicemente copiarlo dal post e incollarlo nella vosta shell. Inoltre il risultato del comando è preceduto sempre da "$".

Do per scontato che abbiate già scaricato sul vostro desktop il sorgente del programma (fate riferimento alla 3a parte del post per i particolari), ora aprite la finestra della shell (si chiama Konsole se state usando l'interfaccia grafica KDE, Terminale se usate Gnome). Date i seguenti comandi per portarvi nella directory del vostro Desktop (tradotto in Scrivania nelle distribuzioni più recenti) e visualizzarne il contenuto:

cd Scrivania
ls

$ Cartella condivisa host/ media.desktop trash.desktop zerofree-1.0.1.tgz Home.desktop register.desktop upgrade.desktop


Eccolo la il nostro sorgente: zerofree-1.0.1.tgz.

E' in formato tgz, detto più comunemente “tarball”, un formato tipico di Linux ottenuto in 2 fasi: raccogliendo più file in un unico file tramite il comando tar e poi sottoponendolo a compressione tramite gzip. Decomprimiamolo con il comando:

tar -xvzf zerofree-1.0.1.tgz

$ zerofree-1.0.1/
$ zerofree-1.0.1/zerofree.c
$ zerofree-1.0.1/COPYING
$ zerofree-1.0.1/Makefile


Come potete vedere, ha creato una directory zerofree-1.0.1 (la seconda riga) e dentro ha creato tre file: zerofree.c è il sorgente C del programma che poi compileremo, Makefile contiene le istruzione che vengono passate al compilatore quando daremo il comando make di compilazione. Portiamoci nella nuova directory e guardiamone il contenuto:

cd zerofree-1.0.1
ls

$ COPYING Makefile zerofree.c


Eccoli là i nostri tre file; diamo il comando make di compilazione:

make

$ bash: make: command not found


Come avevo preannunziato, questa volta non vi avrei risparmiato gli errori che si ottengono quando si prova a compilare zerofree, ed ecco il primo: il programma make (ricordate dal post sull'architettura di base di Linux? In Linux tutto è un programma, anche i comandi) non esiste (make: command not found), dobbiamo installarlo. In Mandriva si tratta di usare Installa e rimuovi software (fig. 1), ma ogni distribuzione Linux ha qualcosa di analogo, cercate e avviate questa funzione.

Fig. 1 - Compattazione disco virtuale Mandriva con zerofree - installa nuovo sofware
fig. 1


Usando il box Cerca (e l'analogo in altre distribuzioni) cerchiamo nei nomi la stringa "make": spuntate il relativo box e installatelo (fig. 2).

Fig. 2 - Compattazione disco virtuale Mandriva con zerofree - installa make
fig. 2


Lasciate aperta questa finestra e tornate alla shell, qui ridate il comando make:

make

$ gcc -o zerofree -lext2fs zerofree.c
$ make: gcc: Command not found
$ make: *** [all] Error 127


Ora make c'è ed infatti compaiono nuove righe. La terza riga in particolare, quella subito sotto al comando make, lancia il compilatore (gcc) con una serie di parametri, peccato che gcc manchi (make: gcc: Command not found): installiamolo. Tornate nuovamente alla finestra di Gestione software e questa volta cercate con la stringa “gcc”; spuntate ed installate il relativo pacchetto (fig. 3).

Fig. 3 - Compattazione disco virtuale Mandriva con zerofree - installazione gcc
fig. 3


Lasciate la finestra aperta e tornate alla shell, ridate nuovamente il comando make:


>>gcc -o zerofree -lext2fs zerofree.c
$ zerofree.c:15:27: error: ext2fs/ext2fs.h: No such file or directory
$ zerofree.c: In function ‘main’:
$ zerofree.c:24: error: ‘errcode_t’ undeclared (first use in this function)
$ zerofree.c:24: error: (Each undeclared identifier is reported only once
$ zerofree.c:24: error: for each function it appears in.)
$ zerofree.c:24: error: expected ‘;’ before ‘ret’
[...]


Niente, errore anche questa volta, ma guardate con attenzione la terza riga: l'errore è cambiato. Ora cerca qualcosa che si chiama ext2fs e ext2fs.h. Torniamo alla finestra di Gestione software e cerchiamo il termine "ext2fs" (fig. 4). Quando trovate più pacchetti che rispondono alla stessa stringa di ricerca, tenete presente che stiamo cercando di compilare un'applicazione: il pacchetto di supporto alla compilazione nel nome ha sempre qualcosa come "dev" oppure "devel" (development = sviluppo, ricordatelo perché è una convenzione usata in Linux). Spuntate il pacchetto giusto è installatelo.

Fig. 4 - Compattazione disco virtuale Mandriva con zerofree - installazione libext2fs
fig 4


Terminata l'installazione ritornate alla shell ridando il comando make:

make
$ gcc -o zerofree -lext2fs zerofree.c

ls
COPYING Makefile zerofree* zerofree.c



Bravissimi!! La compilazione è andata a buon fine, ed il comando ls per vedere il contenuto della directory in cui vi trovate ci dice che esiste un nuovo file (ora sono quattro in tutto), zerofree, dove l'asterisco indica si tratta di un file eseguibile e non fa parte del nome. Copiamo adesso il programma nella directory /root , la home dell'amministratore:

sudo cp zerofree /root
$ Parola d'ordine:

chiudete ogni finestra aperta e nella shell date il comando:

sudo telinit 1

In questo modo portate Linux al runlevel 1. I runlevel in Linux specificano cosa deve essere in funzione e cosa no per ognuno di essi; portarsi a runlevel 1 permette di rendere la macchina monoutente, tirar via tutto ciò che non serve per la sua amministrazione (interfaccia grafica, rete...) e lavorarci in tranquillità.

Se tutto è andato bene, vi ritroverete in una schermata simile a quella di fig. 5, dove ho dato un invio fra un comando e l'altro per aumentare la leggibilità. Cominciate con il notare che in questo momento siete amministratori della macchina (indicato dall'ultima lettera del prompt, # per l'amministratore e $ per l'utente normale), perciò attenti a quello che fate, potreste segarvi via l'intera distribuzione (non è un'esagerazione, può accadere con il comando giusto nel posto sbagliato).

Fig. 5 - Compattazione disco virtuale Mandriva con zerofree - comandi per azzerare spazio libero
fig. 5


Ora, sempre guardando fig. 5, date il comando:

df

df permette di visualizzare dimensioni, spazio libero ed utilizzato di una data partizione, dato senza nessun argomento come sopra, ci mostra i dati di tutte le partizioni. In fig. 5 potete vedere come in Mandriva (e in tante altre distribuzioni) le cose siano un po' diverse da Ubuntu (fig. 8 della 3a parte del post per un confronto): le partizioni qui sono 2 e non una sola.

Nella prima riga della prima colonna infatti leggiamo che esiste un dispositivo (/dev = device) che corrisponde alla prima partizione del vostro disco rigido virtuale (/hda1), dopo un po' di dati sullo spazio occupato o meno, ci dice che è montato all'inizio del filesystem (estrema destra, la colonna “Mounted on” e sotto “/”).

Ma nella seconda riga della prima colonna leggiamo che esiste un altro dispositivo (/dev = device) che corrisponde all'altra partizione del vostro disco rigido virtuale (/hda6, perchè salti da a1 ad a6 lo si capirà in successivi post dedicati a Linux), e sempre dopo un po' di dati sullo spazio occupato o meno, ci dice che è montato su /home (estrema destra, la colonna “Mounted on” e sotto “/home”). In altre parole questa partizione contiene la vostra home.

La maggior parte delle distribuzioni, di default fanno proprio così: mettono su una partizione il sistema operativo, e su un'altra le home degli utenti. E' un po' come se sotto Windows sul disco C: installassimo solo Windows ed i programmi, e su D: invece la cartella Documenti (una prassi molto seguita in ambito aziendale). Che sia Windows o Linux, questa separazione è di grandissima utilità: potete in qualunque momento procedere ad una reinstallazione del sistema operativo senza la preoccupazione di perdere tutti i documenti che sono su una partizione separata (un salvataggio comunque è sempre consigliabile).

Torniamo a noi. Quello che ora faremo è rimontare le 2 partizioni in sola lettura, operazione indispensabile per procedere successivamente senza far danni. Date i comandi:

mount -n -o remount,ro -t ext2 /dev/hda1 /
mount -n -o remount,ro -t ext2 /dev/hda6 /home


che tradotto significa: fai il mount, senza aggiornare il file mstab (-n), facendo il remount in sola lettura (remount,ro) come se fosse un filesystem di tipo EXT2 (-t ext2), del dispositivo /dev/hda1, rimontandolo in /; analogamente per il dispositivo /dev/hda6 rimontandolo in /home. Ora date il comando:

fsck -f /dev/hda1

farete così un bel FileSystemChecK sulla prima partizione, un controllo approfondito per assicurarvi che tutto sia a posto prima di iniziare. Se riscontrasse dei problemi e vi propone dei rimedi, accettateli; a meno di essere dei “filesystem guru” non riuscireste a fare meglio di quanto propone. Quando ha terminato ed è tutto ok, date un bel

cd /root

per portarvi nella home dell'amministratore. Ricordate? E' lì che abbiamo messo zerofree: è arrivato il momento di usarlo. Prima però verifichiamo se tutto è posto sui permessi di esecuzione del file. Date il comando

ls -l

Se il risultato è qualcosa del tipo

-rw-r--r-- 1 root root

le cose NON sono a posto. Le lettere vanno lette a gruppi di tre a partire dal secondo carattere e significano che il file:

- ha attivi i permessi di lettura/scrittura (rw, read write) per l'utente root;
- ha attivo il permesso di lettura (r) per il gruppo root;
- ha attivo il permesso di lettura (r) per tutti gli altri.

Per tutti manca il permesso di esecuzione del file (sarebbe una x alla terza lettera di ogni gruppo di tre, invece c'è - che significa la sua assenza), aggiungetelo per tutti con il comando:

chmod +x zerofree

poi verificate che adesso sia tutto a posto con

ls -l

e dovreste avere qualcosa del tipo

-rwxr-xr-x 1 root root ...

con le x ad ogni terza lettera del gruppetto di tre. Ora potete finalmente eseguirlo con il comando:

./zerofree /dev/hda1

Il comando dice a Linux di eseguire il programma zerofree cercandolo nella directory corrente (./) e di passare al programma la partizione su cui agire (/dev/hda1). Sembrerà che non accada nulla ma in realtà il programma sta lavorando intensamente; guardate l'icona di attività dei dischi rigidi virtuali, in basso a destra sulla barra di stato della finestra di VirtualBox che contiene il guest, e ve ne accorgerete. Quando zerofree avrà terminato il suo lavoro ricomparirà semplicemente il prompt: ridate il comando

fsck -f /dev/hda1

per essere sicuri dell'integrità della partizione, e se tutto è ok abbiamo terminato con la prima partizione.

Ripetiamo gli stessi passi per l'altra partizione:

fsck -f /dev/hda6

Qui fate attenzione: fsck si potrebbe lamentare come in fig. 6. In realtà il filesystem è montato in sola lettura proprio per evitare danni, per cui date y e proseguite.

Fig. 6 - Compattazione disco virtuale Mandriva con zerofree - avviso fsck
fig. 6


Quando ha terminato:

./zerofree /dev/hda6

e poi ancora

fsck -f /dev/hda6

per essere sicuri che tutto sia a posto, infine spegnete la macchina virtuale con il comando:

halt

Sul guest è tutto.


Ora che le zone libere del disco rigido virtuale sono state riempite di valori zero, sull'host non vi resta che dare il solito comando

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

ed avete terminato del tutto (per maggiori informazioni sul comando, leggete la parte finale della 1a parte del post). Ricordate solo che i doppi apici che racchiudono nomefile servono solo se nomefile contiene degli spazi, altrimenti potete ometterli.

Beh, direi proprio che potete fermarvi qui soddisfatti di quello che avete fatto. Intanto non avrete più problemi con dischi rigidi ad espansione dinamica che sanno solo espandersi: anche sotto Linux potrete comprimerli quando vi pare e con la massima efficacia. Non solo: avete imparato anche qualcosa in più sul funzionamento di Linux; ma qui, siamo solo all'inizio. ;-)

@:\>