Il laboratorio virtuale VLAB Vlab è un sistema che permette di creare delle macchine virtuali connesse tra loro mediante hub virtuali. Poiché le macchine virtuali non sono altro che dei pc Linux virtuali esse possono far girare tutto il software disponibile per Linux e quindi possono essere configurate in modo da funzionare, ad esempio, da bridge, da Web server, da ftp server, da router (rip, ospf e bgp), sniffer, ecc, vlab è quindi un laboratorio virtuale per la sperimentazione di configurazioni di rete dalle grandi potenzialità, accessibile agli studenti attraverso la macchina giga.dia.uniroma3.it. (le modalità di accesso vengono descritte nel seguito). L architettura può essere schematizzata come segue: real host virtual network intrfaces virtual machine 1 screen multiplexer real host network interface virtual hub 1 virtual machine 2 real host virtual machine 3 virtual hub n virtual machine n real host disk Ciascuna macchina è composta da disco, una e un certo numero di interfacce di rete. Il real host ha un disco ed una interfaccia di rete fisiche. L utente di vlab ha la possibilità di far partire un certo numero di macchine virtuali. Ciascuna di tali macchine ha a disposizione un suo disco virtuale, un certo numero di interfacce di rete virtuali connesse a degli hub virtuali. Sia le macchine virtuali che gli hub virtuali vengono creati dall utente secondo le sue necessità. Poiché l utente di vlab deve poter accedere sia alla delle macchine virtuali sia a quella del real host le non sono collegate direttamente alla rete ma ad uno screen multiplexer che permette di passare dall una all altra in ogni momento. Sia il real host che le macchine virtuali sono Linux. Per poter utilizzare il sistema è necessaria una conoscenza almeno superficiale dei comandi Unix. Tutto ciò che è necessario sapere su Unix Unix è una famiglia di sistemi operativi molto simili tra di loro. Noi ci occupiamo della variante denominata GNU/Linux o semplicemente Linux poiché questa è installata sia su giga che su ciascuna delle macchine virtuali anche se molto di quanto diremo è valido per tutti i sistemi unix. Inoltre in questa sezione non c è differenza tra macchine reali o virtuali, esse si comportano infatti allo stesso modo.
Documentazione in linea L interazione con un sistema unix avviene principalmente in maniera testuale dando dei comandi. Ciascun comando ha normalmente un gran numero di possibilità. Uno strumento prezioso per l utente unix è la documentazione installata nel sistema stesso accessibile tramite il comando man nomecomando Quando l output di un comando è troppo lungo per entrare nello schermo si utilizza un pager che permette di consultare agevolmente l output (scroll up/down, ricerca nel testo ecc.). Il pager più usato si chiama less. L output di man viene automaticamente visualizzato tramite less (per uscire da less premere q, less ha un help interno accessibile tramite h ) Utenti Tutti i sistemi unix sono multiutente cioè forniscono meccanismi di protezione e autenticazione in modo che utenti distinti non possano disturbarsi a vicenda. Ciascun file o processo (vedi dopo) appartiene ad un utente. Ciascun utente può solo operare sui suoi file o processi. Per questo quando si accede ad un sistema unix si procede ad una fase di login, cioè l utente inserisce username e password, da quel momento ha la possibilità di gestire i suoi file o processi, si dice che ha iniziato una sessione di lavoro. Per concludere la sessione si deve eseguire il comando exit, questa operazione è anche detta logout. Un utente particolare denominato root può gestire file o processi anche altri utenti. Poiché root può creare danni considerevoli al sistema solo l amministratore di sistema normalmente conosce la password di root. Comandi relativi al file system ls visualizza la directory, normalmente utilizzato con l opzione -l (cioè scrivere ls -l ) cp srcfile destfile copia un file rm nomefile cancella un file mv srcfile destfile sposta o rinomina un file cd nomedirectory cambia la direcory corrente mkdir nomedirectory crea una directory rmdir nomedirectory cancella una direcory Consulta man nomecomando per ulteriori dettagli. Processi Un concetto fondamentale nei sistemi unix è quello di processo. Un processo è un programma in esecuzione. E possibile ispezionare i processi attivi tramite il comando ps, spesso usato con le opzioni aux (cioé ps aux ). Ciascun processo ha un process id (PID). Ciascun processo è creato da un altro processo, che è detto processo padre, identificato dal parent process id (PPID). L unico processo che non ha padre è init. Un modo molto conveniente per vedere i processi attivi è il comando pstree spesso utilizzato con l opzione -pu che fornisce un output come il seguente: init-+-apmd -crond -gpm -inetd---in.telnetd---login---screen -kswapd -kupdate -login---tcsh---startx---xinit-+-.xclients---kwm-+-kbgndwm `-kfm-+-kvt---tcsh---telnet -kvt---tcsh---pstree `-win95.cfg---3*[win95.cfg] `-X -5*[mingetty] -screen-+-2*[bash] `-linux-2.4.16-pz---10*[linux-2.4.16-pz] -smbd---smbd `-xfs Notare come pstree riporta esso stesso come processo. Poiché l output di ps o pstree può essere molto lungo è consigliabile visualizzare tale output con less. Ciò è possibile con qualsiasi comando aggiungendo less alla fine del comando. Processi attivi che non richiedono interazione con un utente vengono chiamati demoni. In un sistema unix le funzionalità più a basso livello vengono implementate nel kernel (es: i-i/o, gestione processi, file, tcp/ip), tutto il resto viene implementato in qualche forma tramite demoni. Esempio di funzionalità normalmente implementate come
demoni sono web servers (demone apache o httpd), ftp e telnet (demone inetd), email (demone sendmail), router (demone gated o zebra), ecc. Comandi utili per la gestione dei processi oltre a ps e pstree sono: kill process_id kill 9 process_id top chiede al processo di chiudersi chiude il processo forzosamente (da usare quando il semplice kill non funziona). mostra interattivamente i processi attivi aggirnandoli in real-time. Un processo interattivo (come ad esempio top) può spesso essere chiuso premendo ctrl-c, altri comandi possono richiedere altre sequenze di tasti (vedi i relativi man, less ad esempio si chiude con q ). Servizi, file di configurazione ed editor di testi In ambito unix usualmente si chiamano servizi le funzionalità potenziali di una macchina (servizi di rete, servizio di web server, ecc.). Supposto che il software necessario sia installato, l attivazione di un servizio richiede spesso l attivazione di demoni o l esecuzione di comandi che modificano il comportamento del kernel che possono essere complessi. Analogamente la sua disattivazione può essere ugualmente complessa. Spesso l attivazione/disattivazione di un servizio viene fatta tramite l esecuzione di un programma che si occupa di effettuare tutte le operazioni necessarie. Tali programmi (detti script) risiedono normalmente nella directory /etc/init.d oppure in /etc/rc.d/init.d. Così per attivare un web server è possibile dare il comando /etc/init.d/apache start mentre per disattivarlo /etc/init.d/apache stop Un servizio, prima della sua attivazione, va configurato. Sui sistemi unix la configurazione dei vari servizi avviene modificando dei file ascii che normalmente risiedono nella directory /etc. La sintassi con cui bisogna scrivere tali file è normalmente molto semplice (il più delle volte si tratta di tabelle) ma varia con il servizio ed è necessario consultare la documentazione relativa. Per modificare tali file la cosa migliore è utilizzare un editor visuale. Per i sistemi unix esistono un gran numero di editor, i più famosi sono probabilmente i seguenti vi nomefile emacs nomefile tuttavia il loro utilizzo richiede l apprendimento di sequenze di tasti che possono risultare difficili. Un editor più intuitivo è mcedit nomefile Molte delle funzionalità di mcedit sono raggiungibili premendo esc seguito da un numero: esc 1 Help help esc 2 Save salva il file esc 3 Mark inzia la selezione o finisce la selezione di una parte di testo esc 4 Replace sostituzioni stringhe nel testo esc 5 Copy copia il testo selezionato con esc 3 nel punto indicato dal cursore esc 6 Move sposta il testo selezionato con esc 3 nel punto indicato dal cursore esc 7 Search cerca nel testo esc 8 Delete elimina il testo selezionato con esc 3 esc 9 PullDn accede ai menù a tendina nei quali ci si può muovere con i tasti cursore e selezionare le voci con enter (invio) esc 0 Quit esce da mcedit esc esc Quit esce da mcedit (equivalente a esc 0)
Spegnimento e riavvio di una macchina unix I seguenti comandi permettono di spegnere o riavviare una macchina: halt spegne la macchina reboot riavvia la macchina Solo root può eseguire tali comandi. E importante spegnere la macchina tramite questi comandi e non spegnendo l hardware, infatti questo permette di non perdere i dati nei buffer che potrebbero non essere stati ancora scritti su disco al momento dello spegnimento dell hardware. A seguito di uno spegnimento forzato (crash) la procedura di avvio (boot) prevede un controllo del filesystem che può durare da qualche secondo a qualche minuto (dipende dalla velocità dell hardware e dalla grandezza del filesystem). Lavorare con le macchine virtuali I comandi relativi alle macchine virtuali sono i seguenti: vstart nomemacchina [opzioni] avvia una macchina virtuale vlist visualizza la lista delle macchine virtuali attualmente attive vhalt nomemacchina o pid spegne una macchina virtuale (equivale ad halt dall interno della macchina) vcrash nomemacchina o pid spegne una macchina virtuale (equivale a togliere la corrente alla macchina virtuale) vstart vstart nomemacchina [ opzioni ] Fa partire una macchina virtuale su una nuova. La macchina ha nome nomemacchina, tale nome viene comunicato alla macchina virtuale così che essa si possa configurare con tale nome (ed aggiornare ad esempio il prompt di login). Il filesystem della macchina virtuale appena creata viene memorizzato nel file nomemacchina.disk nella directory corrente. Tale file è un file sparso, è cioè lungo quanto il filesystem preso a modello ($VLAB_HOME/fs/default) ma contiene solo le differenze rispetto ad esso e quindi ha una occupazione molto minore (verificabile con ls --ls). I file sparsi sono gestibili come normali file tramite i comandi cp, rm, ls, mv ecc. Un filesystem sparso funziona solo se il corrispondente filesystem modello è disponibile e non è stato modificato dal momento in cui il filesystem sparso è stato creato. ATTENZIONE: non mantenete dati importanti nei filesystem delle macchine virtuali. Ciascuna macchina virtuale lanciata con vstart ha informazioni sul pathname della home dell utente che l ha lanciata. Essa quindi si configura in modo rendere visibile la home dell utente nel path /hosthome del filesystem virtuale. E possibile trasferire file tra macchina virtuale e host reale tramite tale directory. Opzioni disponibili: --new --eth0=nomehub --eth1=nomehub --eth2=nomehub --eth3=nomehub --mem=megabytes quando una macchina viene lanciata per la prima volta si deve creare il suo filesystem. Per rendere possibile tale creazione deve essere specificata l opzione --new. Se il filesystem già esiste l opzione non deve essere presente. la macchina che partirà avrà l interfaccia eth0..eth3 collegata all hub virtuale (dominio di collisione virtuale) di nome hubname. ciascuna macchina virtuale ha una memoria centrale di 8 MB. Tale quantità è sufficiente per quasi tutte le attività. Se si ha bisogno di più memoria si può specificare l opzione --mem= X dove X può essere solo 8,16 o 24 vstart produce come output sulla da cui è invocato i comandi che esegue per lanciare la macchina virtuale, tali comandi possono essere eseguiti manualmente anche senza l aiuto di vstart. vstart tuttavia semplifica molto questo processo.
vlist vlist fornisce la lista delle macchine virtuali attualmente attive ed informazioni sulla memoria occupata da esse. E importante notare come le macchine visualizzate sono quelle attive. L unica traccia lasciata da una macchina che è stata già spenta è il suo filesystem (i file che terminano con.disk ). Tali file sono visualizzabili semplicemente con ls -l Le colonne della tabella hanno i seguenti significati: PID numero identificativo del processo principale associato alla macchina SIZE spazio i Kb occupato dalla macchina virtuale UPTIME tempo trascorso dall avvio della macchina virtuale NAME nome della macchina OPTIONS opzioni (rete, memoria, ecc) Ciascuna macchina è identificata dal PID, tuttavia i comandi vhalt e vcrash accettano sia PID (perché univoco) che nome (perché comodo). vlist --all permette di visualizzare l elenco di tutte le macchine virtuali attualmente attive sull host reale. vhalt vhalt nomemacchina o pid Avvia la procedura di spegnimento della macchina virtuale identificata per nome o pid, tale operazione è equivalente a digitare halt sulla della macchina virtuale. Il comando controlla, per un certo numero di volte, che la macchina si sia spenta, poi abbandona. Nel caso che la macchina non si riesca a spegnere con vhalt utilizzare vcrash vcrash vcrash nomemacchina o pid vcrash uccide i processi associati alla macchina virtuale ed equivale ad un crash della macchina. Se nella directory corrente è presente il file nomemacchina.disk allora vcrash non fa altro che uccidere tutti i prcessi che stanno utilizzando tale file. Altri riferimenti Vlab è una originale integrazione di pacchetti software già disponibili. Ulteriore documentazione sull utilizzo di linux come macchina virtuale è dispnibile a: http://user-mode-linux.sourceforge.net/ Inoltre per unix e linux si possono trovare degli eccellenti tutorial on-line a partire da qualsiasi motore di ricerca. Per informazioni specifiche sui vari software utilizzati ecco una lista di siti: www.linux.org per il sistema GNU/linux in genere www.debian.org per la distribuzione debian di linux www.gnu.org per gran parte del software open source normalmente utilizzato sotto linux