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.
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.
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).
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
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
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
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
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.
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).
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
1997.10.26 - Scritto da Daniele Giacomini daniele@calion.com (vedi copyright: Appunti Linux).