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.


[16] Per maggiori informazionisui dispositivi tty consultare la Red Hat Enterprise Linux Deployment Guide.
[17] Consultare la Red Hat Enterprise Linux Deployment Guide per maggiori informazioni sui display manager.