Capitolo successivo Capitolo precedente Indice

14. Procedura di inizializzazione del sistema (System V)

Quando Linux viene avviato, il kernel si prende cura di avviare il processo init, a partire dal quale vengono poi generati tutti gli altri. Di solito si utilizza un meccanismo di inizializzazione derivato dallo UNIX System V.

init determina quali siano i processi da avviare successivamente, in base al contenuto di /etc/inittab il quale a sua volta fa riferimento a una serie di script normalmente contenuti all'interno della directory /etc/rc.d/.

All'interno di /etc/inittab si distinguono azioni diverse in funzione del ``livello di esecuzione'', di solito un numero da 0 a 6. Per convenzione, il livello 0 identifica solitamente le azioni necessarie per fermare l'attività del sistema, in modo da permetterne lo spegnimento; il livello 6 normalmente riavvia il sistema; il livello 1 mette il sistema in condizione di funzionare in modalità monoutente.

<!>   Le distribuzioni Linux più sofisticate e confortevoli permettono di configurare il sistema attraverso dei programmi che guidano l'utente. Ciò significa che questi programmi sono in grado di produrre automaticamente script e file di configurazione tradizionali, ma per fare questo devono gestire un proprio sistema di file di configurazione che non appartiene allo standard generale.

14.1 init

init è il processo principale che genera tutti gli altri. All'avviamento del sistema legge il file /etc/inittab il quale contiene le informazioni per attivare gli altri processi necessari per il sistema compresa la gestione dei terminali. Per prima cosa viene determinato il livello iniziale di esecuzione (run level), ottenendo l'informazione dalla riga initdefault di /etc/inittab. Quindi vengono attivati i processi di attivazione del sistema ed infine i processi che combaciano con il livello di esecuzione attivato.

# init

init [<opzioni>]

Durante il funzionamento del sistema, init può essere invocato per cambiare il livello di esecuzione.

Opzioni

-t <secondi>

Stabilisce il numero di secondi di attesa prima di cambiare il livello di esecuzione. In mancanza si intende 20 secondi.

0 | 1 | 2 | 3 | 4 | 5 | 6

Un numero da 0 a 6 stabilisce il livello di esecuzione.

a | b | c

Una lettera a, b o c indica a init di eseguire soltanto i processi indicati all'interno di /etc/inittab che hanno un livello di esecuzione pari alla lettera specificata. In pratica, una lettera non indica un livello di esecuzione vero e proprio; si tratta di una possibilità di configurazione del file /etc/inittab per definire i cosiddetti livelli ``a richiesta'' (on demand).

Q | q

Indica a init di riesaminare il file /etc/inittab.

S | s

Indica a init di passare alla modalità monoutente (single user), ma non è pensato per essere utilizzato direttamente.

Esempi

# init 1

Pone il sistema al livello di esecuzione 1: monoutente.

# init 0

Pone il sistema al livello di esecuzione 0: system halt. Equivale (in linea di massima) all'esecuzione di shutdown -h now.

# init 6

Pone il sistema al livello di esecuzione 6: riavvio. Equivale (in linea di massima) all'esecuzione di shutdown -r now.

/etc/inittab

Il file inittab descrive quali processi vengono avviati al momento del boot del sistema e durante il funzionamento normale del sistema stesso. init, il processo principale, distingue diversi livelli di esecuzione (run level), per ognuno dei quali può essere stabilito un gruppo diverso di processi da avviare.

La struttura del record di questo file può essere schematizzata nel modo seguente.

<id>:<livelli-di-esecuzione>:<azione>:<processo>

Se il nome del processo inizia con un simbolo +, init non eseguirà l'aggiornamento di utmp e wtmp per quel processo; ciò è utile quando il processo stesso provvede da solo a questa operazione.

Azione

Il penultimo campo, identifica l'azione da compiere. Questa viene identificata da una parola chiave.

respan

Quando il processo termina, viene riavviato.

wait

Il processo viene avviato una volta (sempre che il livello di esecuzione lo consenta) e init attende che termini prima di eseguirne degli altri.

once

Il processo viene eseguito una volta quando il livello di esecuzione lo consente.

boot

Il processo viene eseguito al momento del boot del sistema. Il campo del livello di esecuzione viene ignorato.

bootwait

Il processo viene eseguito al momento del boot del sistema e init attende la fine del processo prima di proseguire. Il campo del livello di esecuzione viene ignorato.

off

Non fa alcunché.

ondemand

Si tratta dei record cosiddetti ``a richiesta'' che vengono presi in considerazione quando viene eseguito init seguito da una lettera a, b o c che rappresentano appunto tre livelli possibili di esecuzione on demand. a, b o c non sono livelli di esecuzione, ma solo un modo per selezionare una serie di processi on demand indicati all'interno del file inittab.

initdefault

Permette di definire il livello di esecuzione automaticamente definito all'avviamento del sistema. Se non viene specificato, init richiede l'inserimento di questo valore attraverso la console.

sysinit

Il processo viene eseguito al momento del boot del sistema, prima di quelli indicati come boot e bootwait. Il campo del livello di esecuzione viene ignorato.

powerwait

Il processo viene eseguito quando init riceve il segnale SIGPWR che indica un problema con l'alimentazione elettrica. init attende la fine del processo prima di proseguire.

powerfail

Il processo viene eseguito quando init riceve il segnale SIGPWR che indica un problema con l'alimentazione elettrica. init non attende la fine del processo.

powerokwait

Il processo viene eseguito quando init ha ricevuto il segnale SIGPWR che indica un problema con l'alimentazione elettrica, e, contemporaneamente, è presente il file /etc/powerstatus contenente la parola OK. Ciò significa che l'alimentazione elettrica è tornata allo stato di normalità.

ctrlaltdel

Il processo viene eseguito quando init riceve il segnale SIGINT. Ciò significa che è stata premuta la combinazione di tasti [Ctrl+Alt+Canc] ([Ctrl+Alt+Del] nelle tastiere inglesi).

kbrequest

Il processo viene eseguito quando init riceve un segnale dal gestore della tastiera che sta ad indicare la pressione di una combinazione speciale di tasti sulla tastiera della console.

Livelli di esecuzione

Il campo dei livelli di esecuzione può contenere diversi caratteri che stanno a indicare diversi possibili livelli di esecuzione. Per esempio, 123 indica che il processo specificato verrà eseguito indifferentemente per tutti i livelli di esecuzione da 1 a 3. Questo campo può contenere anche una lettera dell'alfabeto: a, b o c che sta a indicare un livello on demand. Nel caso di azioni del tipo sysint, boot e bootwait, il campo del livello di esecuzione viene ignorato.

Esempi

Negli esempi seguenti, si mostra prima un record del file /etc/inittab e quindi, sotto, la sua descrizione.

---------

id:5:initdefault:

Definisce il livello iniziale di esecuzione: 5.

si::sysinit:/etc/rc.d/rc.sysinit

Inizializzazione del sistema: è la prima cosa a essere eseguita dopo l'avvio del sistema stesso. In pratica viene avviato lo script /etc/rc.d/rc.sysinit (RedHat).

l1:1:wait:/etc/rc.d/rc 1

Indica di eseguire /etc/rc.d/rc 1 nel caso in cui il livello di esecuzione sia pari a 1: singolo utente (RedHat)

rc:123456:wait:/etc/rc.d/rc.M

Indica lo script (/etc/rc.d/rc.M) da eseguire per tutti i livelli di esecuzione da 1 a 6 (Slackware).

ca::ctrlaltdel:/sbin/shutdown -t5 -rfn now

Indica il programma da eseguire in caso di pressione della combinazione [Ctrl+Alt+Canc]. Il livello di esecuzione non viene indicato perché è indifferente (Slackware).

l0:0:wait:/etc/rc.d/rc 0

Indica di eseguire /etc/rc.d/rc 0 nel caso in cui il livello di esecuzione sia pari a 0: system halt (RedHat).

l6:6:wait:/etc/rc.d/rc 6

Indica di eseguire /etc/rc.d/rc 6 nel caso in cui il livello di esecuzione sia pari a 6: riavvio (RedHat).

pf::powerfail:/sbin/shutdown -f +5 "THE POWER IS FAILING"

Indica il programma da eseguire quando si verifica un problema con l'alimentazione elettrica (Slackware).

pg:0123456:powerokwait:/sbin/shutdown -c "THE POWER IS BACK"

Indica il programma da eseguire se l'alimentazione elettrica torna normale prima del completamento del processo avviato quando si era verificato il problema (Slackware).

1:12345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

Si tratta dell'elenco di console virtuali utilizzabili. La prime si attiva per tutti i livelli di esecuzione da 1 a 5, le altre solo per i livelli superiori ad 1. Responsabile dell'attivazione delle console, come della connessione di tutti i terminali, è, in questo caso, mingetty (RedHat).

s1:45:respawn:/sbin/agetty 19200 ttyS0 vt100

Indica l'attivazione di un terminale connesso sulla prima porta seriale. Si attiva solo con i livelli di esecuzione 4 o 5 (Slackware).

d2:45:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS1 vt100

Indica l'attivazione di un terminale remoto connesso via modem sulla seconda porta seriale. Si attiva solo con i livelli di esecuzione 4 o 5 (Slackware).

x:5:respawn:/usr/bin/X11/xdm -nodaemon

Nel caso il livello di esecuzione sia pari a 5, esegue /usr/bin/X11/xdm che si occupa di avviare un login all'interno dell'ambiente grafico X Window System (RedHat).

/etc/initscript

Quando lo script di shell /etc/initscript esiste, viene utilizzato da init per avviare i processi indicati all'interno del file /etc/inittab. Di solito questo script non è presente.

14.2 /etc/rc.d/rc*

Si tratta di una serie di script di shell eseguiti direttamente o indirettamente attraverso le indicazioni contenute nel file /etc/inittab. Questo gruppo di script può essere diverso da un sistema all'altro a seconda della distribuzione di Linux o a seconda della versione.

/etc/rc.d/rc.local

Una convenzione diffusa fa sì che questo script faccia parte della procedura di avvio della maggior parte delle distribuzioni Linux. Questo script viene eseguito alla fine della procedura stessa ed è per questo disponibile per le variazioni locali da apportare al sistema. Volendo fare un'associazione con il sistema Dos, si potrebbe paragonare questo script al file AUTOEXEC.BAT.

 

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


Capitolo successivo Capitolo precedente Indice