8.2. Processo di init

Il programma init è il processo con ID 1. Si occupa di inizializzare il sistema nel modo richiesto e svolge un ruolo speciale. Viene avviato direttamente dal kernel ed è in grado di sopravvivere al segnale 9, che in genere termina i processi. Tutti gli altri programmi vengono avviati direttamente da init oppure da uno dei relativi processi secondari.

init è configurato a livello centrale nel file /etc/inittab, dove vengono definiti i runlevel (vedere la Sezione 8.2.1, "Runlevel"). Questo file specifica inoltre i servizi e i daemon disponibili in ogni livello. In base alle voci presenti nel file /etc/inittab, init esegue svariati script. Per motivi di chiarezza, questi script, denominati script di init, risiedono tutti nella directory /etc/init.d (vedere la Sezione 8.2.2, "Script di init").

L'intero processo di avvio e arresto del sistema è gestito da init. Sotto questo punto di vista, il kernel può essere considerato un processo in background il cui task è gestire tutti gli altri processi e regolare sia il tempo di CPU sia l'accesso all'hardware in base alle richieste di altri programmi.

8.2.1. Runlevel

In Linux i runlevel definiscono la modalità di avvio del sistema e i servizi disponibili nel sistema in esecuzione. Dopo il processo di avvio, il sistema viene avviato come definito all'interno del file /etc/inittab in corrispondenza della riga initdefault. In genere, questa impostazione è 3 o 5. Vedere la Tabella 8.1, "Runlevel disponibili". In alternativa, il runlevel può essere specificato in fase di avvio, ad esempio nel prompt di avvio. Tutti i parametri non valutati direttamente dal kernel vengono passati a init.

Tabella 8.1. Runlevel disponibili

Runlevel

Descrizione

0

Arresto del sistema.

S

Modalità utente singolo. Dal prompt di avvio, solo con la mappatura della tastiera statunitense.

1

Modalità utente singolo.

2

Modalità multi-utente locale senza rete remota (NFS e così via).

3

Modalità multi-utente completa con rete.

4

Non utilizzato.

5

Modalità multi-utente completa con rete e gestore di visualizzazione X (KDM, GDM o XDM).

6

Riavvio del sistema.

[Important]non utilizzare il runlevel 2 con una partizione montata tramite NFS

Evitare di utilizzare il runlevel 2 quando nel sistema viene montata la partizione /usr tramite NFS. Nel caso file di programma o librerie fossero mancanti, poiché il servizio NFS non è disponibile nel runlevel 2 (modalità multi-utente locale senza rete remota), il sistema potrebbe comportarsi in modo imprevisto.

Per modificare i runlevel mentre il sistema è in esecuzione, immettere telinit e il numero corrispondente come argomento. Questa operazione può essere eseguita solo dall'amministratore di sistema. Di seguito vengono riepilogati i più importanti comandi per l'area dei runlevel.

telinit 1 o shutdown now

Nel sistema viene attivata la modalità utente singolo, che viene utilizzata per task di manutenzione e amministrazione del sistema.

telinit 3

Vengono avviati tutti i programmi e i servizi di fondamentale importanza, inclusa la rete, e gli utenti regolari possono eseguire il login e utilizzare il sistema senza un ambiente grafico.

telinit 5

Viene abilitato l'ambiente grafico; in genere viene avviato un gestore di visualizzazione quale XDM, GDM o KDM. Se autologin è abilitato, l'utente locale viene connesso al gestore delle finestre preselezionato (GNOME, KDE o un altro gestore delle finestre).

telinit 0 o shutdown -h now

Il sistema viene arrestato.

telinit 6 o shutdown -r now

Il sistema viene arrestato e quindi riavviato.

Il runlevel 5 è il runlevel di default in tutte le installazioni standard di SUSE Linux. Per visualizzare la richiesta di login agli utenti viene utilizzata un'interfaccia grafica oppure l'utente predefinito viene connesso automaticamente. Se il runlevel di default è 3, prima di poter impostare il runlevel 5 è necessario che X Window System sia configurato in modo corretto, come descritto nel Capitolo 14, X Window System. Verificare quindi che il sistema funzioni nel modo desiderato immettendo telinit 5. Se tutto funziona come previsto, è possibile utilizzare YaST per impostare il runlevel di default su 5.

La modifica dei runlevel in genere ha due conseguenze. Innanzitutto, vengono avviati gli script di arresto del runlevel corrente, che chiudono alcuni programmi di fondamentale importanza per il runlevel corrente. Dopo di che, vengono avviati gli script di avvio del nuovo runlevel. Durante questa seconda fase nella maggior parte dei casi vengono avviati vari programmi. Ad esempio, quando il runlevel viene modificato da 3 a 5, si verificano le seguenti operazioni:

  1. L'amministratore (utente root) richiede a init di impostare un runlevel diverso immettendo telinit 5.

  2. Il programma init analizza il relativo file di configurazione (/etc/inittab) e determina che deve avviare /etc/init.d/rc con il nuovo runlevel come parametro.

  3. A questo punto, rc chiama gli script di arresto del runlevel corrente per cui non esiste uno script di avvio nel nuovo runlevel. In questo esempio, si tratta di tutti gli script residenti in /etc/init.d/rc3.d (il runlevel precedente era 3) e che iniziano con la lettera K. Il numero indicato dopo la K specifica l'ordine di avvio in quanto è necessario tenere presenti alcune dipendenze.

  4. Gli ultimi a essere avviati sono gli script di avvio del nuovo runlevel, che in questo esempio si trovano in /etc/init.d/rc5.d e iniziano con la lettera S. Anche in questo caso viene applicata la stessa procedura riguardante l'ordine di avvio.

Quando il nuovo runlevel coincide con quello corrente, init verifica semplicemente le modifiche in /etc/inittab ed esegue i passaggi appropriati, ad esempio per l'avvio di un comando getty su un'altra interfaccia. È possibile ottenere la stessa funzionalità con il comando telinit q.

8.2.2. Script di init

In /etc/init.d sono presenti due tipi di script:

Script eseguiti direttamente da init

Questi script vengono utilizzati solo durante il processo di avvio oppure qualora venga inizializzato un arresto immediato del sistema a causa di un'interruzione dell'alimentazione oppure in seguito alla pressione della combinazione di tasti Ctrl-Alt-Canc da parte dell'utente. Le modalità di esecuzione di questi script sono definite in /etc/inittab.

Script eseguiti indirettamente da init

Questi script vengono eseguiti in caso di modifica del runlevel e chiamano sempre lo script master /etc/init.d/rc, che garantisce l'ordine corretto degli script rilevanti.

Tutti gli script si trovano in /etc/init.d. Gli script eseguiti all'avvio del sistema sono richiamati per mezzo di collegamenti simbolici da /etc/init.d/boot.d. Gli script per la modifica del runlevel vengono chiamati tramite collegamenti simbolici da una delle sottodirectory (da /etc/init.d/rc0.d a /etc/init.d/rc6.d). Questo solo per motivi di chiarezza e per evitare script duplicati nel caso in cui vengano utilizzati in più runlevel. Poiché ogni script può essere eseguito sia come script di avvio che come script di arresto, deve essere in grado di interpretare i parametri start e stop nonché le opzioni restart, reload, force-reload e status. Per informazioni su queste opzioni, vedere la Tabella 8.2, "Opzioni degli script di init". Gli script eseguiti direttamente da init non dispongono di questi collegamenti e possono essere eseguiti in modo indipendente dal runlevel quando necessario.

Tabella 8.2. Opzioni degli script di init

Opzione

Descrizione

start

Avvia il servizio.

stop

Interrompe il servizio.

restart

Se il servizio è in esecuzione, lo interrompe e quindi lo riavvia. Se il servizio non è in esecuzione, lo avvia.

reload

Ricarica la configurazione senza interrompere e riavviare il servizio.

force-reload

Ricarica la configurazione se il servizio supporta questa operazione. In caso contrario, esegue le stesse operazioni dell'opzione restart.

status

Visualizza lo stato corrente del servizio.

I collegamenti in ogni sottodirectory specifica del runlevel consentono di associare script a runlevel diversi. Quando si installano o disinstallano pacchetti, questi collegamenti vengono aggiunti e rimossi tramite il programma insserv oppure tramite /usr/lib/lsb/install_initd, uno script che chiama questo programma. Per informazioni, vedere la documentazione di insserv(8).

Di seguito vengono riportate una breve introduzione agli script di avvio e di arresto, avviati rispettivamente per primo e per ultimo, e una descrizione dello script di manutenzione.

boot

Viene eseguito durante l'avvio del sistema direttamente da init. È indipendente dal runlevel scelto e viene eseguito una sola volta. Consente di montare i file system proc e pts e di attivare blogd (il daemon di registrazione del processo di avvio). Quando il sistema viene avviato per la prima volta dopo un aggiornamento o un'installazione, viene avviata la configurazione del sistema iniziale.

Il daemon blogd è un servizio avviato dagli script boot e rc prima di qualsiasi altro. Viene interrotto al termine delle azioni generate dagli script sopra indicati, ad esempio l'esecuzione di una serie di script secondari. Il daemon blogd scrive l'output a video nel file di log /var/log/boot.msg, ma solo se e quando /var è montato in modalità di lettura/scrittura. In caso contrario, blogd memorizza nel buffer tutti i dati a video fino a quando /var non diventa disponibile. Per ulteriori informazioni su blogd, vedere la documentazione di blogd(8).

Lo script boot si occupa inoltre di avviare tutti gli script in /etc/init.d/boot.d il cui nome inizia con la lettera S. Questi script consentono di controllare i file system e di configurare se necessario i dispositivi con loop nonché di impostare l'ora di sistema. Se si verifica un errore durante la verifica e la riparazione automatica del file system, l'amministratore di sistema può intervenire dopo avere immesso la password root. L'ultimo a essere eseguito è lo script boot.local.

boot.local

Consente di immettere ulteriori comandi da eseguire in fase di avvio prima di impostare un altro runlevel. Corrisponde a AUTOEXEC.BAT nei sistemi DOS.

boot.setup

Questo script viene eseguito quando si passa dalla modalità utente singolo a qualsiasi altro runlevel ed esegue una serie di impostazioni di base, quali il layout di tastiera e l'inizializzazione di console virtuali.

halt

Questo script viene eseguito solo quando viene impostato il runlevel 0 o 6 e può essere eseguito come halt o reboot. L'arresto o il riavvio del sistema dipende dalla modalità di chiamata di halt.

rc

Questo script chiama gli script di arresto appropriati del runlevel corrente e gli script di avvio del nuovo runlevel scelto.

È possibile creare script personalizzati e integrarli senza difficoltà nello schema sopra descritto. Per istruzioni sulla formattazione, la denominazione e l'organizzazione di script personalizzati, fare riferimento alle specifiche di LSB e alla documentazione di init, init.d e insserv. Vedere inoltre la documentazione di startproc e killproc.

[Warning]eventuali errori negli script di init possono causare un arresto del sistema

Gli errori presenti negli script di init possono causare un arresto del computer. Prestare particolare attenzione quando si modificano questi script e, se possibile, sottoporli ad accurati test nell'ambiente multi-utente. Per informazioni sugli script di init, vedere la Sezione 8.2.1, "Runlevel".

Per creare uno script di init personalizzato per un determinato programma o servizio, utilizzare il file /etc/init.d/skeleton come modello. Salvare una copia di questo file con un nuovo nome e modificare i nomi di file e programma rilevanti, i percorsi e altri dettagli in base alle esigenze. Potrebbe inoltre essere necessario aggiungere sezioni personalizzate allo script in modo che durante la procedura di init vengano avviate le azioni corrette.

Il blocco INIT INFO all'inizio è una sezione necessaria dello script e deve essere modificata. Vedere l'Esempio 8.1, "Blocco INIT INFO minimo".

Esempio 8.1. Blocco INIT INFO minimo

### BEGIN INIT INFO
# Provides:          FOO
# Required-Start:    $syslog $remote_fs
# Required-Stop:     $syslog $remote_fs
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Description:       Start FOO to allow XY and provide YZ
### END INIT INFO
    

Nella prima riga del blocco INFO, dopo Provides, specificare il nome del programma o del servizio controllato da questo script di init. Nelle righe Required-Start e Required-Stop specificare tutti i servizi da avviare o interrompere prima dell'avvio o dell'interruzione del servizio stesso. Queste informazioni verranno utilizzate successivamente per generare la numerazione dei nomi degli script, indicata nelle directory dei runlevel. Dopo Default-Start e Default-Stop specificare i runlevel in cui il servizio deve essere avviato o interrotto automaticamente. Infine, per Description specificare una breve descrizione del servizio in questione.

Per creare i collegamenti dalle directory dei runlevel (/etc/init.d/rc?.d/) agli script corrispondenti in /etc/init.d/, immettere il comando insserv nome-nuovo-script. Il programma insserv valuta l'intestazione INIT INFO per creare i collegamenti necessari per gli script di avvio e arresto nelle directory dei runlevel (/etc/init.d/rc?.d/). Questo programma gestisce inoltre il corretto ordine di avvio e di arresto per ogni runlevel tramite l'inserimento dei numeri necessari nei nomi di questi collegamenti. Se si preferisce utilizzare uno strumento con interfaccia grafica per creare questi collegamenti, eseguire l'editor dei runlevel fornito da YaST, come descritto nella Sezione 8.2.3, "Configurazione dei servizi di sistema (runlevel) con YaST".

Se uno script già presente in /etc/init.d/ deve essere integrato in uno schema di runlevel esistente, creare i collegamenti nelle directory dei runlevel direttamente con insserv oppure abilitando il servizio corrispondente nell'editor dei runlevel di YaST. Le modifiche apportate vengono applicate durante il successivo riavvio. Il nuovo servizio viene avviato automaticamente.

Non impostare questi collegamenti manualmente. Se nel blocco INFO è presente un errore, si verificheranno problemi durante la successiva esecuzione di insserv per un altro servizio. Il servizio aggiunto manualmente verrà rimosso alla successiva esecuzione di insserv.

8.2.3. Configurazione dei servizi di sistema (runlevel) con YaST

Dopo avere avviato questo modulo di YaST scegliendo YaST+Sistema+Editor dei runlevel, viene visualizzata una panoramica in cui sono elencati tutti i servizi disponibili e lo stato corrente di ognuno di essi (disabilitato o abilitato). Scegliere se utilizzare il modulo in Modo semplice o Modo per esperti. L'impostazione di default Modo semplice dovrebbe essere sufficiente nella maggior parte dei casi. Nella colonna di sinistra è indicato il nome del servizio, nella colonna centrale è indicato lo stato corrente e nella colonna di destra è disponibile una breve descrizione. Nella parte inferiore della finestra viene visualizzata una descrizione dettagliata del servizio selezionato. Per abilitare un servizio, selezionarlo nella tabella e quindi fare clic su Abilita. Per disabilitare un servizio, seguire questa stessa procedura.

Figura 8.1. Servizi di sistema (runlevel)

Servizi di sistema (runlevel)

Per un controllo avanzato sui runlevel in cui viene avviato o arrestato un servizio oppure per modificare il runlevel di default, selezionare prima Modo semplice. Il runlevel di default corrente o "initdefault", ovvero il runlevel nel quale viene avviato il sistema per default, è visualizzato nella parte superiore della finestra. In genere, il runlevel di default di un sistema SUSE Linux è il runlevel 5 (modalità multi-utente completa con rete e X). Una valida alternativa potrebbe essere il runlevel 3 (modalità multi-utente completa con rete).

In questa finestra di dialogo di YaST è possibile selezionare uno dei runlevel elencati nella Tabella 8.1, "Runlevel disponibili" come nuova impostazione di default. È inoltre possibile utilizzare la tabella di questa finestra per abilitare o disabilitare singoli servizi e daemon. In questa tabella sono elencati i servizi e i daemon disponibili ed è indicato se e per quali runlevel sono attualmente abilitati nel sistema. Dopo avere selezionato una delle righe con il mouse, fare clic sulle caselle di controllo rappresentanti i runlevel (B, 0, 1, 2, 3, 5, 6 e S) per definire i runlevel in cui deve essere eseguito il servizio o il daemon selezionato. Il runlevel 4 inizialmente non è definito per consentire la creazione di un runlevel personalizzato. Sotto la tabella è disponibile una breve descrizione del servizio o del daemon attualmente selezionato.

Scegliere se attivare un servizio utilizzando il comando Avvia/Arresta/Aggiorna. Aggiorna stato consente di verificare lo stato corrente. Imposta/Ripristina consente di scegliere se applicare le modifiche al sistema o ripristinare le impostazioni esistenti prima dell'avvio dell'editor dei runlevel. Selezionare Concludi per salvare le impostazioni modificate su disco.

[Warning]eventuali errori nelle impostazioni dei runlevel possono danneggiare il sistema

Impostazioni dei runlevel errate possono compromettere l'uso del sistema. Prima di applicare le modifiche, è estremamente importante conoscere tutti gli effetti provocati.