2.3 Avvio del sistema

Una volta che il boot loader è stato avviato, questo carica il kernel20, lo decomprime (negli elaboratori X386 questa operazione avviene in protected mode21), e lo avvia passandogli eventuali parametri. Il kernel si preoccupa di compiere le operazioni necessarie all’avvio dell’intero sistema operativo, ovvero dei processi fondamentali per il suo utilizzo.

L’unico processo che viene avviato dal kernel è init tramite l’esecuzione del file /sbin/init (man page init(8)), il quale poi si preoccupa di avviare gli altri.22

____________________________________________________________________

Comando: init
Path: /sbin/init

SINTASSI  
# init [option] [runlevel]  
DESCRIZIONE

____________________________________________________________________

Il processo init imposta le seguenti variabili di ambiente per i processi figli (tutti i processi da esso lanciati)

La sequenza di avvio dei processi iniziali utilizza un meccanismo derivato da Unix System V 24, secondo il quale init legge il contenuto del file /etc/inittab (man page inittab(5)) che contiene le direttive per l’avvio degli altri processi necessari al funzionamento del sistema. Tale file, come la quasi totalità dei file di configurazione dei sistemi Unix-like, è in formato testo (ASCII).

La sintassi delle righe contenute nel file /etc/inittab è la seguente:

 
id:runlevel:action:file  
dove

Al suo avvio, init cerca nel file /etc/inittab una riga contenente la stringa initdefault, che imposta il runlevel di avvio del sistema. Se tale indicazione non viene trovata (o addirittura il file /etc/inittab non esiste), init ne richiede l’inserimento da tasiera.

Dopo che init ha lanciato tutti i processi indicati in /etc/inittab, attende che si verifichi una delle seguenti condizioni:

Quando si verifica una delle condizioni sopra elencate init riesamina il file /etc/inittab. Si può anche forzare init a riesaminare il file /etc/inittab con il comando

 
# telinit q  
Se il sistema non è in single-user mode e init riceve il segnale SIGPWR, quest’ultimo tenta di leggere il contenuto del file /etc/powerstatus che riporta i dettagli relativi al segnale in questione

Nel caso in cui il file /etc/powerstatus non esista o contenga qualcosa di diverso dalle lettere sopra riportate, init esegue le operazioni relative al caso in cui il file /etc/powerstatus esista e contenga la lettera F.

La gestione del segnale SIGPWR è comunque obsoleta ed è consigliabile interagire con init per mezzo del dispositivo /dev/initctl.

Quando init riceve la richiesta di cambiamento di runlevel, invia il segnale SIGTERM a tutti i processi (che appartengono allo stesso process group che init aveva creato inizialmente - gli altri processi devono essere terminati manualmente) che non sono definiti nel nuovo runlevel. Quindi attende 5 secondi prima di inviare ad essi il segnale SIGKILL che ne forza la terminazione immediata.

Il segnale SIGTERM richiede ad un processo quella che viene definita graceful termination, cioè la sua terminazione “dolce”. Questo significa che il processo stesso deve gestire la propria terminazione quando riceve tale segnale, poiché soltanto esso sa se deve compiere delle operazioni in corso, prima di terminare effettivamente (es. chiudere i file aperti, ...). Il segnale SIGKILL invece indica al kernel stesso di terminare un processo all’istante (immediate termination). Questo segnale è da considerarsi l’ultima spiaggia per la terminazione di un processo poiché non ha nessun controllo sulle operazioni ancora non concluse da parte del processo che deve essere terminato (si può rischiare di perdere dei dati).

Quando un processo lanciato da init termina, init memorizza l’evento nel system status file (/var/run/utmp e /var/log/wtmp).

Un esempio del contenuto del file /etc/inittab è riportato di seguito.

#
# inittab     This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
                                                                        
                                                                        
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# Things to run in every runlevel.
ud::once:/sbin/update
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runlevels
1:2345: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
# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon
Quando init deve lanciare in esecuzione un file filename, tenta di eseguirlo per mezzo del file /etc/initscript (man page initscript(5)), passandogli anche le indicazioni relative alla riga di /etc/inittab che in quel momento init sta considerando. Il file /etc/initscript potrebbe essere uno script che serve per definire delle variabili di ambiente e altre impostazioni che riguardano l’interpretazione degli script della procedura di inizializzazione del sistema. Nel caso in cui /etc/initscript non esista (situazione standard), i file sono lanciati in esecuzione direttamente da init.

In genere, il primo file lanciato in esecuzione da init è /etc/rc.d/rc.sysinit (v. riga che si riferisce alla direttiva sysinit nel file /etc/inittab) che si occupa di eseguire le seguenti operazioni:

Quindi vengono avviati i servizi (daemon) necessari per l’utilizzo del sistema e vengono aperti i terminali per far accedere gli utenti al sistema, generalmente per mezzo di un apposito script come /etc/rc.d/rc (v. sez. 2.7).

Alla fine dell’elaborazione di /etc/inittab, init lancia in esecuzione il file /etc/ rc.d/rc.local (se esiste) che può essere quindi creato o modificato dall’amministratore del sistema per personalizzare la procedura di avvio.