Differences between revisions 4 and 5
Revision 4 as of 2009-09-29 15:25:50
Size: 4846
Editor: lukisi
Comment:
Revision 5 as of 2009-09-30 15:48:27
Size: 9351
Editor: lukisi
Comment:
Deletions are marked like this. Additions are marked like this.
Line 27: Line 27:
Di solito ogni macchina virtuale si avvia specificando uno script da eseguire al suo interno come "''boot''". Lo script può risiedere anche all'esterno della macchina virtuale, ad esempio si può accedere tramite la pseudo-directory {{{/hosthome/}}}. Di solito ogni macchina virtuale si avvia specificando uno script da eseguire al suo interno come "''boot''". Lo script può risiedere anche all'esterno della macchina virtuale, ad esempio si può accedere tramite la pseudo-directory {{{/hosthome/}}}. Di norma si mette lo script di ''boot'' della macchina virtuale nella stessa directory in cui si è messo lo script di avvio del laboratorio a cui appartiene.
Line 31: Line 31:
== Avvio delle macchine virtuali di un lab == == Creazione di un lab ==
Line 33: Line 33:
Esempio di script per avviare un lab. Dimostriamo l'uso delle funzioni presenti negli scripts {{{host_utils.bash}}} e {{{service.bash}}} con un esempio.

Creiamo in una directory vuota all'interno della nostra home, il file {{{launchlab.bash}}} contenente:
Line 60: Line 62:
Nella stessa directory creiamo i files {{{service1.bash}}}, {{{service2.bash}}}, {{{service3.bash}}} e {{{service4.bash}}}. Il primo contiene:
{{{
#!/bin/bash

# Call base script to define functions.
. /hosthome/netsukuku/scripts-netkit/service.bash

# Find the directory where this script resides.
find_dir_script $0
SCRIPT_IS_HERE=$RET

launch_ntkd $SCRIPT_IS_HERE 0

echo "Virtual Machine 1: services started."
echo "logs to " $NTKD_OUTPUT
}}}
Negli altri cambiamo nella penultima riga il numero della VM e nella riga precedente il numero di secondi da attendere prima di avviare il demone.

Per una prima prova di laboratorio possiamo mettere 0 secondi per la prima macchina, 30 per la seconda, 60 per la terza e 90 per la quarta.

Ora avviamo, dalla directory in cui abbiamo salvato, lo script {{{launchlab.bash}}}
{{{
luca@luca-laptop:~/test-ntk/lab_1$ ./launchlab.bash
Lab launched.
}}}
Appaiono le console delle macchine virtuali. Al loro interno possiamo vedere (ad esempio in guest01)
{{{
--- Starting Netkit phase 2 init script ---
Executing /hosthome/test-ntk/lab_1/service1.bash ...
Virtual Machine 1: services started.
logs to /hosthome/test-ntk/lab_1/guest01/ntkd.log
--- Netkit phase 2 initialization terminated ---
}}}
e dopo un po' di tempo compare alla console anche la dicitura:
{{{
ntkd daemon launched.
}}}
Questa dicitura compare quando viene avviato il demone, quindi la vedremo apparire nella prima console immediatamente, nella seconda dopo 30 secondi, e così via.

Quando saranno passati circa 3 minuti, possiamo dare all'interno delle macchine virtuali il comando '{{{ip route}}}' per vedere se le rotte sono state impostate, e poi arrestarle con il comando '{{{halt}}}'.

Vediamo ora nel dettaglio il significato delle script che abbiamo creato.

== Avvio del laboratorio ==

Nella script {{{launchlab.bash}}} abbiamo fatto uso delle funzioni {{{find_dir_script}}} e {{{make_hosthome_path}}} (presenti in {{{host_utils.bash}}}) per recuperare la path delle directory in cui si trova la script, nel modo in cui si può raggiungere dell'interno della macchina virtuale.

Poi abbiamo avviato (con un sleep di 1 secondo tra l'una e l'altra) 4 macchine virtuali, dando ad ognuna come script di ''boot'' le script create in questa directory.

Dopo aver avviato le macchine virtuali la script termina.
Line 62: Line 115:
L'avvio del demone {{{ntkd}}} sarà gestito dallo script di ''boot'' della macchina virtuale, che importa lo script {{{service.bash}}}. Per ogni macchina virtuale, l'avvio del demone {{{ntkd}}} sarà gestito dal suo script di ''boot'', che importa lo script {{{service.bash}}}.

Per avviare il demone ad un determinato istante è sufficiente richiamare la funzione {{{launch_ntkd}}} (presente in {{{service.bash}}}) specificando la directory su cui salvare i logs e i secondi da attendere.

Per salvare i logs nella stessa directory in cui si trovano gli script del laboratorio si può usare la funzione {{{find_dir_script}}} (presente in {{{service.bash}}})

La funzione {{{launch_ntkd}}} ritorna subito, anche se ad esempio si richiedesse un delay di 30 secondi. E alla sua uscita sono valorizzate le variabili:
 . ''{{{NTKD_OUTPUT}}}'': path del file in cui vengono salvati i log del demone ntkd;
 . ''{{{NTKD_PID}}}'': identificativo del processo del demone.
Il PID del demone può essere usato con la funzione {{{kill_generation}}} (presente in {{{service.bash}}}) per terminare il processo.

Siccome la funzione {{{launch_ntkd}}} ritorna subito, la script prosegue e noi vediamo immediatamente la dicitura {{{Virtual Machine 1: services started}}} e solo dopo un po' di tempo la dicitura {{{ntkd daemon launched}}}.
Line 64: Line 128:
Per avviare il demone ad un determinato istante è sufficiente richiamare la funzione {{{launch_ntkd}}} specificando la directory su cui salvare i logs e i secondi da attendere. Inoltre questo è necessario per avere immediatamente il prompt dei comandi nella console della macchina virtuale.

=== Altre possibili operazioni programmate ===

Nello script abbiamo specificato dopo quanto tempo avviare il demone {{{ntkd}}}. Prima di terminare lo script, possiamo "schedulare" altre operazioni.

Ad esempio questo script:
{{{
#!/bin/bash

# Call base script to define functions.
. /hosthome/netsukuku/scripts-netkit/service.bash

delay_then_kill()
{
 DELAY=$1
 NTKD_PID=$2
 sleep $DELAY
 kill_generation $NTKD_PID
 echo "launch_ntkd killed."
}

# Find the directory where this script resides.
find_dir_script $0
SCRIPT_IS_HERE=$RET

launch_ntkd $SCRIPT_IS_HERE 0

delay_then_kill 180 $NTKD_PID &

echo "Virtual Machine 1: services started."
echo "logs to " $NTKD_OUTPUT
}}}
avvia immediatamente il demone; di seguito avvia in background una funzione che interromperà

Uso delle script di automazione dei test ntkd su netkit

Alcune scripts sono state create (e con il tempo sono state e saranno corrette e migliorate) per facilitare le operazioni di test e debug di Netsukuku all'interno di un ambiente Netkit.

Queste scripts vengono testate ed usate con le macchine virtuali di Netkit che montano il filesystem descritto in TestWithNetkit e con una macchina host con sistema Ubuntu.
Presumibilmente, dovrebbero funzionare in modo analogo con una qualsiasi distribuzione GNU/Linux moderna come sistema host.

L'obiettivo di queste script è quello di facilitare le seguenti operazioni:

  • Creazione di uno scenario (chiamato anche lab), anche complesso, che possa essere avviato con un solo comando.

  • Salvataggio e successiva visualizzazione dei logs prodotti dalle istanze di ntkd che girano sulle diverse macchine del lab.

  • Avvio in tempi prestabiliti sia del demone ntkd, sia di comandi utili a testare la connettività della rete.

  • ...

Funzioni helper

Alcune operazioni sono state implementate come funzioni bash, negli script host_utils.bash e service.bash.

Il primo è utile per programmare le operazioni che deve svolgere il laboratorio nel suo insieme.
Per implementare un laboratorio si crea una script (di norma in una directory vuota) il cui compito è quello di avviare un certo numero di macchine virtuali.
In tale script si può importare (con il comando source o .) lo script host_utils.bash che definisce alcune funzioni utili alla macchina host.

Il secondo è utile per programmare le operazioni che deve svolgere una singola macchina virtuale.
Di solito ogni macchina virtuale si avvia specificando uno script da eseguire al suo interno come "boot". Lo script può risiedere anche all'esterno della macchina virtuale, ad esempio si può accedere tramite la pseudo-directory /hosthome/. Di norma si mette lo script di boot della macchina virtuale nella stessa directory in cui si è messo lo script di avvio del laboratorio a cui appartiene.
In tale script si può importare (con il comando source o .) lo script service.bash che definisce alcune funzioni utili alla macchina virtuale.

Creazione di un lab

Dimostriamo l'uso delle funzioni presenti negli scripts host_utils.bash e service.bash con un esempio.

Creiamo in una directory vuota all'interno della nostra home, il file launchlab.bash contenente:

# Call base script to define functions.
. ~/netsukuku/scripts-netkit/host_utils.bash

# Find the directory where this script resides...
find_dir_script $0
SCRIPT_IS_HERE=$RET

# ... the way it is accessible from guest.
make_hosthome_path $SCRIPT_IS_HERE
DIRPATH=$RET

vstart -e ${DIRPATH}/service1.bash guest01 --eth0=A --eth1=B --mem=64 &>/dev/null
sleep 1
vstart -e ${DIRPATH}/service2.bash guest02 --eth0=B --eth1=C --mem=64 &>/dev/null
sleep 1
vstart -e ${DIRPATH}/service3.bash guest03 --eth0=C --eth1=D --mem=64 &>/dev/null
sleep 1
vstart -e ${DIRPATH}/service4.bash guest04 --eth0=D --eth1=E --mem=64 &>/dev/null
sleep 1

echo 'Lab launched.'

Nella stessa directory creiamo i files service1.bash, service2.bash, service3.bash e service4.bash. Il primo contiene:

# Call base script to define functions.
. /hosthome/netsukuku/scripts-netkit/service.bash

# Find the directory where this script resides.
find_dir_script $0
SCRIPT_IS_HERE=$RET

launch_ntkd $SCRIPT_IS_HERE 0

echo "Virtual Machine 1: services started."
echo "logs to " $NTKD_OUTPUT

Negli altri cambiamo nella penultima riga il numero della VM e nella riga precedente il numero di secondi da attendere prima di avviare il demone.

Per una prima prova di laboratorio possiamo mettere 0 secondi per la prima macchina, 30 per la seconda, 60 per la terza e 90 per la quarta.

Ora avviamo, dalla directory in cui abbiamo salvato, lo script launchlab.bash

luca@luca-laptop:~/test-ntk/lab_1$ ./launchlab.bash
Lab launched.

Appaiono le console delle macchine virtuali. Al loro interno possiamo vedere (ad esempio in guest01)

--- Starting Netkit phase 2 init script ---
Executing /hosthome/test-ntk/lab_1/service1.bash ...
Virtual Machine 1: services started.
logs to  /hosthome/test-ntk/lab_1/guest01/ntkd.log
--- Netkit phase 2 initialization terminated ---

e dopo un po' di tempo compare alla console anche la dicitura:

ntkd daemon launched.

Questa dicitura compare quando viene avviato il demone, quindi la vedremo apparire nella prima console immediatamente, nella seconda dopo 30 secondi, e così via.

Quando saranno passati circa 3 minuti, possiamo dare all'interno delle macchine virtuali il comando 'ip route' per vedere se le rotte sono state impostate, e poi arrestarle con il comando 'halt'.

Vediamo ora nel dettaglio il significato delle script che abbiamo creato.

Avvio del laboratorio

Nella script launchlab.bash abbiamo fatto uso delle funzioni find_dir_script e make_hosthome_path (presenti in host_utils.bash) per recuperare la path delle directory in cui si trova la script, nel modo in cui si può raggiungere dell'interno della macchina virtuale.

Poi abbiamo avviato (con un sleep di 1 secondo tra l'una e l'altra) 4 macchine virtuali, dando ad ognuna come script di boot le script create in questa directory.

Dopo aver avviato le macchine virtuali la script termina.

Avvio del demone

Per ogni macchina virtuale, l'avvio del demone ntkd sarà gestito dal suo script di boot, che importa lo script service.bash.

Per avviare il demone ad un determinato istante è sufficiente richiamare la funzione launch_ntkd (presente in service.bash) specificando la directory su cui salvare i logs e i secondi da attendere.

Per salvare i logs nella stessa directory in cui si trovano gli script del laboratorio si può usare la funzione find_dir_script (presente in service.bash)

La funzione launch_ntkd ritorna subito, anche se ad esempio si richiedesse un delay di 30 secondi. E alla sua uscita sono valorizzate le variabili:

  • NTKD_OUTPUT: path del file in cui vengono salvati i log del demone ntkd;

  • NTKD_PID: identificativo del processo del demone.

Il PID del demone può essere usato con la funzione kill_generation (presente in service.bash) per terminare il processo.

Siccome la funzione launch_ntkd ritorna subito, la script prosegue e noi vediamo immediatamente la dicitura Virtual Machine 1: services started e solo dopo un po' di tempo la dicitura ntkd daemon launched.
Inoltre questo è necessario per avere immediatamente il prompt dei comandi nella console della macchina virtuale.

Altre possibili operazioni programmate

Nello script abbiamo specificato dopo quanto tempo avviare il demone ntkd. Prima di terminare lo script, possiamo "schedulare" altre operazioni.

Ad esempio questo script:

# Call base script to define functions.
. /hosthome/netsukuku/scripts-netkit/service.bash

delay_then_kill()
{
 DELAY=$1
 NTKD_PID=$2
 sleep $DELAY
 kill_generation $NTKD_PID
 echo "launch_ntkd killed."
}

# Find the directory where this script resides.
find_dir_script $0
SCRIPT_IS_HERE=$RET

launch_ntkd $SCRIPT_IS_HERE 0

delay_then_kill 180 $NTKD_PID &

echo "Virtual Machine 1: services started."
echo "logs to " $NTKD_OUTPUT

avvia immediatamente il demone; di seguito avvia in background una funzione che interromperà

Raccolta informazioni

Lo script net_info.bash va eseguito all'interno della macchina virtuale.
Produce sullo standard output informazioni su:

  • le interfacce di rete presenti nel sistema (una riga che inizia con "nic" per ogni interfaccia)

  • l'indirizzo IP proprio del sistema
    • una unica riga che inizia con "addr";

    • si presume che il sistema usi netsukuku, quindi abbia un solo indirizzo;
    • si presume anche che il sistema abbia l'interfaccia eth0.
  • i vicini noti al sistema (una riga che inizia con "neighbour" per ogni vicino)

  • gli altri nodi e gnodi della rete verso i quali il sistema ha una rotta;
    • una riga che inizia con "gnode_1" per ogni nodo appartenente al nostro stesso gnodo di livello 1.

    • una riga che inizia con "gnode_2" per ogni gnodo di livello 1 appartenente al nostro stesso gnodo di livello 2.

    • una riga che inizia con "gnode_3" per ogni gnodo di livello 2 appartenente al nostro stesso gnodo di livello 3.

    • una riga che inizia con "gnode_4" per ogni gnodo di livello 3 appartenente al nostro stesso gnodo di livello 4.

Lo script collect_ips.bash va eseguito all'interno della macchina virtuale. Fa uso dello script net_info.bash.
Produce sullo standard output un elenco di indirizzi IP che riesce a raccogliere.

  • Il proprio IP
  • Quelli dei vicini
  • Quelli del primo nodo che incontra su ogni gnodo nella mappa

Netsukuku/ita/ScriptsWithNetkit (last edited 2009-10-02 08:43:11 by lukisi)