Parlerò solamente dello stile ``System V'' di init, utilizzato dalla
maggior parte dei sistemi Linux. Esistono anche altre alternative.
Infatti, potete mettere qualsiasi programma vogliate in
/sbin/init
, e il kernel lo eseguirà non appena avrà terminato la
sua fase di caricamento.
È compito di init
mandare in esecuzione qualsiasi cosa nel
modo corretto. init
verifica che i filesystem siano a posto e li
monta. Avvia i "demoni" per registrare i messaggi di sistema, gestisce
le funzionalità di rete, rende disponibili le pagine web, gestisce il
vostro mouse, e così via. Avvia anche i processi getty che fanno
comparire il prompt di login sui vostri terminali virtuali.
Dovrei anche parlare di una faccenda piuttosto complessa riguardo al passaggio tra i vari ``run-levels'', ma la salterò quasi del tutto e vi parlerò piuttosto di come si avvia il sistema.
Init legge il file /etc/inittab
che gli dice cosa fare.
La prima cosa che di solito viene richiesta è quella di eseguire uno
script di inizializzazione. Il programma che esegue (o interpreta)
questo script è bash
, lo stesso programma che vi fornisce un
prompt dei comandi.
Nei sistemi Debian, lo script di inizializzazione è
/etc/init.d/rcS
, mentre in Red Hat, è
/etc/rc.d/rc.sysinit
.
In questo script vengono verificati e montati i filesystem, viene
impostato l'orologio di sistema, abilitato lo spazio di swap, il nome
dell'host, ecc.
Successivamente, viene chiamato un altro script che ci porta al
run-level predefinito. Questo significa un gruppo di sottosistemi da
avviare.
Esistono una serie di directory /etc/rc.d/rc0.d
,
/etc/rc.d/rc1.d
, ..., /etc/rc.d/rc6.d
in Red Hat, o
/etc/rc0.d
, /etc/rc1.d
, ..., /etc/rc6.d
in
Debian, che corrispondono ai vari run-level. Se stiamo entrando nel
run-level 3 di un sistema Debian, allora lo script eseguirà tutti gli
script presenti nella directory /etc/rc3.d
i cui nomi inizino
per `S' (S sta per start). Questi script in realtà sono soltanto dei
link simbolici a degli script che si trovano in un'altra directory,
generalmente chiamata init.d
.
Quindi, il nostro script di run-level è stato chiamato da init
e ora sta cercando all'interno di una directory tutti gli script che
cominciano per `S'. Potrebbe trovare S10syslog
per primo. Il
numero dice allo script di run-level in quale ordine questi devono
venire eseguiti. Perciò in questo caso, dal momento che non ci sono
altri script che cominciano per S00 ... S09, S10syslog
viene
eseguito per primo. Ma S10syslog
è in realtà un link a
/etc/init.d/syslog
, uno script per avviare o fermare il logger
di sistema. Dato che il link comincia per `S', lo script di run-level
sa che dovrà eseguire lo script syslog
con il parametro
``start''. Esistono anche i corrispettivi link che cominciano per `K' (K
sta per kill), che specificano quali servizi fermare e in quale ordine,
quando viene lasciato un certo run-level.
Per scegliere quali sottosistemi (servizi) far partire in modo
predefinito, dovrete impostare questi collegamenti nella directory
rcN.d
, dove per N si intende il runlevel predefinito,
configurato nel vostro inittab
.
L'ultima cosa importante che fa init è far partire alcune sessioni del
programma getty
. Questi sono di tipo ``respawned'', che
significa che se si fermano, init
li fa partire nuovamente. La
maggior parte delle distribuzioni vengono configurate con sei terminali
virtuali. Potreste volerne di meno per risparmiare memoria, o di più in
modo da mandare in esecuzione più cose, e passare rapidamente da una
all'altra a seconda delle vostre necessità.
Potreste anche voler eseguire getty
per un terminale testuale o
per un modem. In tal caso dovrete modificare il file inittab
.
Il file /etc/inittab
rappresenta il vertice della configurazione
di init.
Le directory rcN.d
, dove N = 0, 1, ..., 6 determinano quali
sottosistemi vengono avviati.
Da qualche parte, in uno degli script richiamati da init, verrà dato il
comando mount -a
. Questo significa montare tutti i filesystem
che si suppone debbano venire montati. Il file /etc/fstab
definisce quali filesystem il sistema deve montare. Se volete modificare
quello che viene montato quando il il sistema viene avviato, questo è il
file che dovrete editare. Esiste anche una pagina di manuale per
fstab
.
Individuate la directory rcN.d
del run-level predefinito del
vostro sistema ed eseguite un ls -l
per vedere a cosa puntano
link in essa presenti.
Cambiate il numero di sessioni getty che vengono eseguite sul vostro sistema.
Eliminate ogni servizio di cui non avete bisogno dal vostro run-level predefinito.
Provate a verificare il numero minimo di servizi con cui riuscite a partire.
Create un dischetto con lilo, un kernel e un programma "ciao mondo!"
compilato staticamente, chiamato /sbin/init
e osservate se si
avvia ed emette il messaggio di saluto.
Osservate attentamente l'avvio del vostro sistema, e prendete nota di
tutto ciò che si sta verificando. Oppure stampate una porzione del file
di log di sistema /var/log/messages
dal momento dell'avvio. A
questo punto, partendo da inittab
, seguite tutti gli script e
cercate di capire ogni parte del codice, e che cosa fa. Potete anche
inserire dei messaggi extra, come ad esempio
echo "Ciao, io sono il file rc.sysinit"
Questo è un buon esercizio per imparare anche il linguaggio di scripting della shell Bash, visto che alcuni di questi script sono piuttosto complicati. Procuratevi una buona guida di Bash da tenere sottomano.
inittab
e fstab
.
Digitate ad esempio man inittab
in una shell per vederlo.