Avanti Indietro Indice

6. Init

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.

6.1 Configurazione

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.

6.2 Esercizi

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.

6.3 Maggiori Informazioni


Avanti Indietro Indice