Il programma init è il primo processo eseguito. 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 28.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 28.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.
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 28.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 28.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 gestione visualizzazione X (KDM, GDM o XDM). |
|
6 |
Riavvio del sistema. |
![]() | non utilizzare il runlevel 2 con una partizione /usr montata tramite NFS |
|---|---|
Evitare di utilizzare il runlevel 2 quando nel sistema viene montata la partizione | |
Per modificare i runlevel mentre il sistema è in esecuzione, immettere init 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.
Nel sistema viene attivata la modalità utente singolo, che viene utilizzata per task di manutenzione e amministrazione del sistema.
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.
Viene abilitato l'ambiente grafico, che può essere uno dei desktop (GNOME o KDE) oppure qualsiasi gestore delle finestre.
Il sistema viene arrestato.
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. 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 35, X Window System. Verificare quindi che il sistema funzioni nel modo desiderato immettendo init 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:
L'amministratore (utente root) richiede a init di impostare un runlevel diverso immettendo init 5
.
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.
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.
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.
In /etc/init.d sono presenti due tipi di script:
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.
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 per la modifica del runlevel sono anch'essi disponibili in questo percorso, ma 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 28.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 28.2. Opzioni degli script di init
|
Opzione |
Descrizione |
|---|---|
|
|
Avvia il servizio. |
|
|
Interrompe il servizio. |
|
|
Se il servizio è in esecuzione, lo interrompe e quindi lo riavvia. Se il servizio non è in esecuzione, lo avvia. |
|
|
Ricarica la configurazione senza interrompere e riavviare il servizio. |
|
|
Ricarica la configurazione se il servizio supporta questa operazione. In caso contrario, esegue le stesse operazioni dell'opzione |
|
|
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.
![]() | 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 28.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 28.1, «Blocco INIT INFO minimo».
Esempio 28.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 28.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.
Dopo avere avviato questo modulo di YaST scegliendo ++, 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 o . L'impostazione di default 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 . Per disabilitare un servizio, seguire questa stessa procedura.
Per un controllo avanzato sui runlevel in cui viene avviato o arrestato un servizio oppure per modificare il runlevel di default, selezionare prima . 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 28.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 (, , , , , , e ) 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 . consente di verificare lo stato corrente. consente di scegliere se applicare le modifiche al sistema o ripristinare le impostazioni esistenti prima dell'avvio dell'editor dei runlevel. Selezionare per salvare le impostazioni modificate su disco.
![]() | 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. | |