F.2.4. Il programma /sbin/init
Il programma
/sbin/init
(chiamato anche init
) coordina la fase restante del processo di avvio e configura l'ambiente per l'utente.
Quando il comando
init
viene eseguito, diventa il genitore di tutti i processi che si avviano automaticamente sul sistema. Innanzitutto esegue lo script /etc/rc.d/rc.sysinit
che imposta il percorso dell'ambiente, attiva lo swap, controlla i filesystem e si occupa di tutti i processi che vanno eseguiti per l'inizializzazione del sistema. Per esempio, la maggior parte dei sistemi utilizza un orologio, così rc.sysinit
legge il file di configurazione /etc/sysconfig/clock
per inizializzare l'orologio dell'hardware. Un altro esempio potrebbe essere quello con il quale è necessario inizializzare processi speciali per le porte seriali, rc.sysinit
può eseguire anche il file /etc/rc.serial
.
Il comando
init
esegue a sua volta i lavori nella directory /etc/event.d
, i quali descrivono come impostare il sistema in ogni SysV init runlevel. I runlevel sono uno stato, o una modalità, definiti dai servizi elencati nella directory SysV /etc/rc.d/rc<x>.d/
, dove <x> rappresenta il numero del runlevel. Per maggiori informazioni sui runlevel SysV init, consultare la Sezione F.4, «SysV Init Runlevels».
Successivamente il comando
init
imposta la libreria di funzione del sorgente, /etc/rc.d/init.d/functions
, per il sistema il quale a sua volta configura il modo di avvio o come eliminare e determinare il PID di un programma.
A questo punto il programma
init
avvia tutti i processi di background cercando nella relativa directory rc
, il runlevel specificato come predefinito in /etc/inittab
. Le directory rc
sono numerate in modo da corrispondere ai runlevel che rappresentano. Per esempio /etc/rc.d/rc5.d/
è la directory per il runlevel 5.
Quando si esegue l'avvio dal runlevel 5, il programma
init
và alla ricerca nella directory /etc/rc.d/rc5.d/
per determinare quali processi iniziare e quali arrestare.
Di seguito è riportato un esempio che illustra la directory
/etc/rc.d/rc5.d/
:
K05innd -> ../init.d/innd K05saslauthd -> ../init.d/saslauthd K10dc_server -> ../init.d/dc_server K10psacct -> ../init.d/psacct K10radiusd -> ../init.d/radiusd K12dc_client -> ../init.d/dc_client K12FreeWnn -> ../init.d/FreeWnn K12mailman -> ../init.d/mailman K12mysqld -> ../init.d/mysqld K15httpd -> ../init.d/httpd K20netdump-server -> ../init.d/netdump-server K20rstatd -> ../init.d/rstatd K20rusersd -> ../init.d/rusersd K20rwhod -> ../init.d/rwhod K24irda -> ../init.d/irda K25squid -> ../init.d/squid K28amd -> ../init.d/amd K30spamassassin -> ../init.d/spamassassin K34dhcrelay -> ../init.d/dhcrelay K34yppasswdd -> ../init.d/yppasswdd K35dhcpd -> ../init.d/dhcpd K35smb -> ../init.d/smb K35vncserver -> ../init.d/vncserver K36lisa -> ../init.d/lisa K45arpwatch -> ../init.d/arpwatch K45named -> ../init.d/named K46radvd -> ../init.d/radvd K50netdump -> ../init.d/netdump K50snmpd -> ../init.d/snmpd K50snmptrapd -> ../init.d/snmptrapd K50tux -> ../init.d/tux K50vsftpd -> ../init.d/vsftpd K54dovecot -> ../init.d/dovecot K61ldap -> ../init.d/ldap K65kadmin -> ../init.d/kadmin K65kprop -> ../init.d/kprop K65krb524 -> ../init.d/krb524 K65krb5kdc -> ../init.d/krb5kdc K70aep1000 -> ../init.d/aep1000 K70bcm5820 -> ../init.d/bcm5820 K74ypserv -> ../init.d/ypserv K74ypxfrd -> ../init.d/ypxfrd K85mdmpd -> ../init.d/mdmpd K89netplugd -> ../init.d/netplugd K99microcode_ctl -> ../init.d/microcode_ctl S04readahead_early -> ../init.d/readahead_early S05kudzu -> ../init.d/kudzu S06cpuspeed -> ../init.d/cpuspeed S08ip6tables -> ../init.d/ip6tables S08iptables -> ../init.d/iptables S09isdn -> ../init.d/isdn S10network -> ../init.d/network S12syslog -> ../init.d/syslog S13irqbalance -> ../init.d/irqbalance S13portmap -> ../init.d/portmap S15mdmonitor -> ../init.d/mdmonitor S15zebra -> ../init.d/zebra S16bgpd -> ../init.d/bgpd S16ospf6d -> ../init.d/ospf6d S16ospfd -> ../init.d/ospfd S16ripd -> ../init.d/ripd S16ripngd -> ../init.d/ripngd S20random -> ../init.d/random S24pcmcia -> ../init.d/pcmcia S25netfs -> ../init.d/netfs S26apmd -> ../init.d/apmd S27ypbind -> ../init.d/ypbind S28autofs -> ../init.d/autofs S40smartd -> ../init.d/smartd S44acpid -> ../init.d/acpid S54hpoj -> ../init.d/hpoj S55cups -> ../init.d/cups S55sshd -> ../init.d/sshd S56rawdevices -> ../init.d/rawdevices S56xinetd -> ../init.d/xinetd S58ntpd -> ../init.d/ntpd S75postgresql -> ../init.d/postgresql S80sendmail -> ../init.d/sendmail S85gpm -> ../init.d/gpm S87iiim -> ../init.d/iiim S90canna -> ../init.d/canna S90crond -> ../init.d/crond S90xfs -> ../init.d/xfs S95atd -> ../init.d/atd S96readahead -> ../init.d/readahead S97messagebus -> ../init.d/messagebus S97rhnsd -> ../init.d/rhnsd S99local -> ../rc.local
Come illustrato in questa lista, nessuno degli script che avviano e arrestano realmente i servizi si trova nella directory
/etc/rc.d/rc5.d/
. Tutti i file in /etc/rc.d/rc5.d/
sono link simbolici diretti a script che si trovano nella directory /etc/rc.d/init.d/
. I link simbolici sono utilizzati in ciascuna delle directory rc
per fare in modo che i runlevel possano essere riconfigurati creando, modificando ed eliminando i link simbolici senza influire sugli script a cui fanno riferimento.
Il nome di ciascun link simbolico inizia con
K
o S
. I link K
sono processi che vengono terminati, mentre quelli che iniziano con S
vengono avviati.
Il comando
init
arresta innanzitutto i link simbolici K
della directory eseguendo il comando /etc/rc.d/init.d/<command> stop
, in cui <command> è il processo da terminare. Avvia quindi tutti i link simbolici S
eseguendo il comando /etc/rc.d/init.d/<command> start
.
Nota
Una volta terminato il processo d'avvio del sistema, sarà possibile eseguire il login come utente root ed eseguire gli stessi script per avviare ed arrestare i servizi. Per esempio, il comando
/etc/rc.d/init.d/httpd stop
arresta il server HTTP di Apache.
Ciascuno dei link simbolici è numerato in modo da stabilire l'ordine di avvio. Potete modificare l'ordine in cui i servizi vengono avviati o interrotti cambiando questo numero. Più il numero è basso, prima il servizio corrispondente viene avviato. I link simbolici che presentano lo stesso numero, vengono avviati in base ad un ordine alfabetico.
Nota
Una delle ultime cose che il programma
init
esegue è il file /etc/rc.d/rc.local
. Il suddetto file è molto utile durante il processo di personalizzazione del sistema. Per maggiori informazioni su come utilizzare il file rc.local
, consultare la Sezione F.3, «Esecuzione di programmi aggiuntivi durante l'avvio».
Dopo che il comando
init
è passato attraverso la directory appropriata rc
del runlevel, Upstart dirama un processo /sbin/mingetty
per ogni console virtuale (prompt di login) assegnata al runlevel dalla definizione del lavoro nella directory /etc/event.d
. Dal runlevel 2 fino al 5 sono presenti tutte e sei le console virtuali, mentre il runlevel 1 (modalità utente singolo) ne ha solo una, ed i runlevel 0 e 6 non presentano alcuna console virtuale. Il processo /sbin/mingetty
apre alcuni percorsi di comunicazione per i dispositivi tty [16], imposta le rispettive modalità, stampa il prompt di login, accetta la password ed il nome utente ed inizializza il processo di login.
Nel runlevel 5, Upstart esegue uno script chiamato
/etc/X11/prefdm
. Lo script prefdm
esegue un X display manager preferito[17] — gdm
, kdm
, o xdm
, in base al contenuto del file /etc/sysconfig/desktop
.
Una volta terminato il sistema è operativo sul runlevel 5, e mostra anche una schermata di login.