[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


270. nanoRouter

nanoRouter è un lavoro che riguarda la prima edizione di nanoLinux, e non è più mantenuto. Questo capitolo è obsoleto, e viene lasciato per documentare il funzionamento di questo dischetto che viene ancora distribuito con Appunti Linux.

L'inoltro dei pacchetti da un'interfaccia di rete a un altra, in un router, è compito del kernel: è sufficiente che gli venga fornita la configurazione delle interfacce 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 interfacce 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 un'interfaccia di rete a un'altra.

270.1 Kernel

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

270.2 Lo stretto indispensabile

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

Nell'esempio proposto non si fa uso di `init': 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 interfacce e la definizione degli instradamenti.

Rispetto ai dischetti di emergenza normali si pone un nuovo problema: l'identificazione delle interfacce di rete quando queste sono più di una. Infatti, il kernel smette di cercare altre interfacce dopo che ne ha trovata una. Ciò costringe in pratica a 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).

L'esempio mostrato è stato realizzato con file binari e librerie di una vecchia distribuzione Slackware 3.1. Le restrizioni che si impongono allo scopo di realizzare un dischetto unico, non compresso, in sola lettura, rendono praticamente impossibile l'utilizzo di programmi e librerie più recenti.

270.2.1 Struttura di nanoRouter

Il dischetto nanoRouter si ottiene partendo 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 del sistema.

Il programma `/sbin/init' è scomparso, al suo posto c'è uno speciale collegamento 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 collegamento 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 `/dev/' 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

270.2.2 Collegamento con argomento

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

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

270.2.3 /etc/profile

Il file `/etc/profile', in questo tipo di impostazione, è l'unico mezzo di configurazione. La configurazione delle interfacce 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

270.2.4 /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 10.2.6.

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 principale viene attivato in sola lettura, e poi, non viene mai riportato in lettura-scrittura.

270.3 Dimensioni

Tutto quanto, compreso il kernel, dovrebbe essere contenibile all'interno di un dischetto da 1440 Kbyte, senza alcuna compressione. In questo modo non avrebbe la necessità di utilizzare un disco RAM, e anche un elaboratore con poca memoria potrebbe svolgere degnamente questo compito (senza bisogno di una laboriosa configurazione).

270.4 Filesystem in sola lettura

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

Resta un problema dovuto al fatto che il kernel, una volta caricato in memoria, richiede la pressione del tasto [Invio] prima di attivare il filesystem principale. Ciò impedisce un avvio automatico. Utilizzando una piccola partizione di un disco fisso, la richiesta di scambiare i dischetti non viene più fatta.

270.4.1 Filesystem /proc

Il fatto di utilizzare il dischetto in sola lettura impedisce il montaggio del filesystem `/proc/', e di conseguenza i programmi ne risentono. Questo è il motivo principale per cui non si riesce a realizzare questo dischetto con programmi derivanti da distribuzioni GNU/Linux recenti.

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]