Debian System V Init

Il programma init, avviato dal kernel, si occupa di gestire le fasi di avvio del sistema operativo dopo l'accensione del computer. Se non avete installato un'immagine da mostrare a schermo all'avvio (splash screen) Linux vi informa di quello che sta accadendo facendo scorrere velocemente del testo sullo schermo; lo scorrimento è veloce, tanto veloce che può essere difficile riuscire a leggere tutto quello che scrive. Niente paura! Dopo che avete fatto il login, se all'invito della shell inserite29:

$ dmesg | less
potrete, mediante i tasti cursore, comodamente scorrere la lista dei messaggi stampati. In questo modo Linux consente all'utente di avere una maggiore padronanza del sistema, poichè egli può controllare istante per istante cosa è accaduto all'avvio della macchina. Ciò è molto comodo qualora si verificassero dei problemi, dei quali si potrà facilmente identificare la causa (per esempio un demone che non è partito).

Un tempo c'erano due modalità d'avvio tra loro incompatibili: il modello System V Init e il modello BSD Init. Bisognava scegliere e il mondo Unix scelse System V che è poi divenuto lo standard anche di Linux30.

In Debian, che segue il modello System V, tutti gli script che avviano programmi all'accensione sono ubicati nella cartella /etc/init.d mentre le cartelle:

/etc/rcS.d
 
/etc/rc0.d
 
/etc/rc1.d
 
/etc/rc2.d
 
/etc/rc3.d
 
/etc/rc4.d
 
/etc/rc5.d
 
/etc/rc6.d
 
contengono ciascuna dei collegamenti simbolici ai file in /etc/init.d/. Il nome del collegamento comincia per ``S'' (Start) seguito da un numero di due cifre seguito dal nome del file presente in /etc/init.d se il programma è da avviare; oppure per ``K'' (Kill) seguito da un numero di due cifre seguito dal nome del file presente in /etc/init.d se il programma è da arrestare (evidentemente ci si riferisce alla fase si spegnimento o di riavvio della macchina). Esempio:

Se abbiamo installato il web server Apache, in /etc/rc2.d troveremo un collegamento del tipo S91apache che punta allo script chiamato apache in /etc/init.d che avvierà il programma Apache; in /etc/rc2.d troveremo allora anche un collegamento del tipo K20apache che punta al medesimo script apache in /etc/init.d che però arresterà il programma Apache. Gli script vengono invocati passando il parametro ``start'' se il nome comincia per ``S'' o passando il parametro ``stop'' se il nome comincia per ``K''.

La cartella del tipo /etc/rc?.d viene selezionata in base al valore di una variabile detta runlevel, che prende il nome di initdefault in /etc/inittab, il file di configurazione del programma init. I possibili valori di runlevel sono31:


\begin{labeling}{00.00.0000}
\item [N]post-accensione
\item [S]modalità singolo ...
...odalità multi-utente
\item [6]riavvio del sistema (\emph{reboot})
\end{labeling}
Nella fase di avvio la sequenza di esecuzione di init è la seguente:

  1. esegue quanto presente in /etc/rcS.d in ordine alfabetico ed in subordine numerico. Il valore di runlevel è posto pari a ``N''.
  2. aggiorna il runlevel al valore specificato in /etc/inittab, di solito pari a due; pertanto eseguirà quanto presente nella cartella /etc/rc2.d/.

Come si vede in Debian il valore predefinito di runlevel è pari a due; gli altri valori fino a cinque sono identici ed è lasciato all'amministratore il compito di personalizzarli, se così desidera. La conoscenza della sequenza di avvio può servire per automatizzare l'avvio di processi che debbano essere eseguiti all'accensione della macchina. E' superfluo ricordare che intervenire su questi file richiede i privilegi di amministratore e cura particolare deve essere posta per evitare di inficiare seriamente la procedura di avvio del sistema. Esempio:

Supponiamo di aver preparato lo script misc_custom come spiegato nel paragrafo 2.2. E' evidente che sarebbe molto scomodo dover digitare a mano il comando per attivare il DMA del disco fisso ogni volta che accendiamo il computer; sarebbe molto più comodo che lo facesse il computer all'accensione al posto nostro! Piazziamo allora lo script nella cartella /etc/init.d; per fare eseguire lo script all'accensione della macchina dovremmo come minimo creare un collegamento in /etc/rc2.d. Per essere sicuri, però, di eseguire lo script all'avvio qualunque sia il runlevel dovremmo piazzare il medesimo collegamento simbolico in ciascuna delle cartelle /etc/rc?.d sopra elencate. Esiste in Debian un comodo script; basterà infatti inserire:

# update-rc.d misc_custom defaults
per avere il medesimo risultato, anzi meglio: ciò lancerà lo script /etc/init.d/misc_custom eseguendo hdparm nel runlevel 2,3,4 o 5 ed ``arrestandolo'' nel runlevel 0,1,6 con una priorità di sequenza predefinita pari a venti.

Per cancellare i collegamenti testé creati, qualora non ci servissero più, digitare invece:

# update-rc.d -f misc_custom remove
Bisogna sottolineare che sono solo i collegamenti a venire cancellati; lo script /etc/init.d/misc_custom rimane intatto. In verità lo script in questione ha solo valore didattico, in quanto si può attivare il DMA del disco fisso direttamente nel menu di configurazione del kernel (vedasi paragrafo 7.1).

Mauro Darida 2006-07-25