Capitolo successivo Capitolo precedente Indice

76. nanoRouter

L'inoltro dei pacchetti da una interfaccia di rete a un altra, in un router, è compito del kernel: è sufficiente che gli venga fornita la configurazione delle interfaccie e la tabella di instradamento.

Teoricamente dovrebbe essere possibile compilare un kernel con questi valori già registrati al suo interno, in pratica conviene utilizzare il modo tradizionale attraverso i programmi ifconfig e route.

Un dischetto di emergenza, in grado di accedere alle interfaccie di rete, con un kernel adatto e con questi due programmi, è in grado di funzionare come router. Ciò vale quindi sia per nanoLinux che per i dischetti di emergenza della distribuzione Slackware.

In questo capitolo si descrive in che modo ottenere un sistema estremamente ridotto in grado di eseguire l'inoltro di pacchetti da una interfaccia di rete a un'altra.

76.1 Kernel

Come già accennato, il kernel deve consentire l'inoltro dei pacchetti. Si tratta di attivare in particolare la voce ``IP: forwarding/gatewaying'' (CONFIG_IP_FORWARD `IP: forwarding/gatewaying'). Per le altre caratteristiche valgono tutte le considerazioni già fatte al riguardo dei dischetti di emergenza.

76.2 Cos'è veramente necessario?

La funzione di inoltro è svolta dal kernel, ma a meno di non essere abili programmatori, è necessario utilizzare ifconfig e route per configurare le interfaccie e definire gli instradamenti. Questi programmi, a loro volta, hanno bisogno di librerie. I programmi, per essere avviati hanno bisogno di init, oppure, in alternativa di una shell che possa eseguire uno script.

Nell'esempio proposto non si fa uso di init ma, con un piccolo trucco si avvia direttamente la shell ash in modo interattivo, così da leggere ed eseguire il file /etc/profile contenente le istruzioni per la configurazione delle interfaccie e la definizione degli instradamenti.

Ma, rispetto ai dischetti di emergenza normali si pone un nuovo problema: l'identificazione delle interfaccie di rete quando queste sono più d'una. Infatti, il kernel smette di cercare altre interfaccie dopo che ne ha trovata una. Ciò costringe in pratica ad utilizzare LILO, attraverso il quale si possono definire le istruzioni che il kernel deve ricevere all'avvio (attraverso queste istruzioni può essere informato della presenza di altre schede di rete).

Struttura di nanoRouter

Il dischetto nanoRouter si ottiene facilmente da nanoLinux eliminando molte cose e aggiungendone poche altre. In particolare, si nota subito l'utilizzo di ash al posto di bash e la totale assenza della procedura di inizializzazione.

Il programma /sbin/init è scomparso, al suo posto c'è uno speciale link simbolico che avvia ash con l'opzione -i: in questo modo, quando il kernel tenta di avviare init, avvia invece una shell interattiva che, come tale, esegue il contenuto di /etc/profile.

Anche /sbin/ldconfig è un link simbolico: avvia uno script che restituisce semplicemente il valore vero. Questo programma viene avviato automaticamente e non può mancare (anche se di fatto non serve).

I file di dispositivo contenuti all'interno di /boot/ sono ridotti al minimo, in pratica ci sono i dispositivi di gestione della console e poco altro.

L'ultima cosa da notare è la presenza della directory /boot/ contenente il kernel e i file di avvio di LILO.

|
|-- bin
|   |-- ash
|   |-- ping
|   |-- sh -> ash
|   `-- sync
|-- boot
|   |-- .config
|   |-- boot.0200
|   |-- boot.b
|   |-- map
|   `-- vmlinuz
|-- dev
|   |-- log
|   |-- null
|   |-- systty
|   |-- tty
|   |-- tty0
|   |-- tty1
|   |-- tty2
|   |-- tty3
|   |-- tty4
|   `-- zero
|-- etc
|   |-- ld.so.cache
|   |-- lilo.conf
|   |-- profile
|   `-- protocols
|-- lib
|   |-- ld-linux.so -> ld-linux.so.1
|   |-- ld-linux.so.1 -> ld-linux.so.1.8.2
|   |-- ld-linux.so.1.8.2
|   |-- libc.so.5 -> libc.so.5.3.12
|   |-- libc.so.5.3.12
|   |-- libcom_err.so.2 -> libcom_err.so.2.0
|   |-- libcom_err.so.2.0
|   |-- libtermcap.so.2 -> libtermcap.so.2.0.8
|   `-- libtermcap.so.2.0.8
|-- mnt
|-- proc
|-- sbin
|   |-- ifconfig
|   |-- init -> ../bin/ash -i
|   |-- ldconfig -> true
|   |-- route
|   |-- true
|   `-- update
|-- tmp
|-- usr
`-- var

Link con argomento

Creare un link simbolico con un argomento non è possibile attraverso il solito programma ln. Se non si riesce, si può creare un link simbolico normale, ma poi, occorre avviare manualmente l'esecuzione del file profile.

Attraverso mc (Midnight Commander) è possibile modificare un link simbolico scrivendoci quello che si vuole. Basta richiamare la voce edit sYmlink dal menu File, oppure utilizzare la sequenza [Ctrl+x][Ctrl+s].

/etc/profile

Il file /etc/profile è, in questo tipo di impostazione, l'unico mezzo di configurazione. La configurazione delle interfaccie di rete e la definizione degli instradamenti avvengono all'interno di questo file.

PATH="/sbin:/bin:."
TERM=linux
PS1='# '
PS2='> '
ignoreeof=10
export PATH TERM PS1 PS2 ignoreeof
umask 022

/sbin/ifconfig eth0 192.168.1.254 netmask 255.255.255.0
/sbin/ifconfig plip1 192.168.2.254 pointopoint 192.168.2.1

/sbin/route add -net 192.168.1.0 netmask 255.255.255.0
/sbin/route add -host 192.168.2.1

ifconfig

/boot/

Come già accennato, esiste l'esigenza di comunicare al kernel l'esistenza di diverse schede di rete (altrimenti si può forse usare solo la porta parallela come seconda interfaccia di rete). Serve quindi il sistema di avvio LILO. Il modo con cui è possibile ottenere un dischetto contenente LILO è descritto nella sezione `LILO su un dischetto'.

Il contenuto del file di esempio si riferisce in particolare ai parametri delle schede NE2000.

# /etc/lilo.conf

boot=/dev/fd0
map=/boot/map
install=/boot/boot.b
image=/boot/vmlinuz
        label=router
        root=/dev/fd0
        read-only
        append="ether=0,0x300,eth0 ether=0,0x320,eth1 ether=0,0x340,eth2"

Vale la pena di notare che il filesystem root viene attivato in sola lettura, e poi, non viene mai riportato in lettura-scrittura. Infatti, il sistema che si crea non ha la necessità di fare alcuna operazione di scrittura nel disco.

76.3 Dimensioni

Tutto quanto, compreso il kernel dovrebbe essere contenibile all'interno di un dischetto da 1440KB, senza alcuna compressione. In questo modo non si ha la necessità di utilizzare un ramdisk, e anche un computer con poca memoria può svolgere degnamente questo compito (senza bisogno di una laboriosa configurazione).

76.4 Filesystem in sola lettura

Il fatto che si riesca a operare senza eseguire scritture sul disco, pur non utilizzando un ramdisk, permette di non dover temere cadute di tensione o errori umani: Quando non serve più, basta spegnere.

L'unico vero problema sta nel fatto che il kernel, una volta caricato in memoria, richiede la pressione del tasto [Invio] prima di attivare il filesystem root. Ciò impedisce un avvio automatico. La cosa si può risolvere utilizzando una piccolissima partizione di un disco fisso.

 

1997.10.26 - Scritto da Daniele Giacomini   daniele@calion.com   (vedi copyright: Appunti Linux).


Capitolo successivo Capitolo precedente Indice