|
INIT(8) manual page
Table of Contents
init, telinit - inizializzatore del controllore dei processi
/sbin/init [ -t sec ] [ 0123456SsQq ]
/sbin/telinit [ -t sec ] [ 0123456sSQqabc
]
Init è il padre di tutti i processi. Il suo compito
principale è di creare processi da uno script immagazzinato nel file /etc/inittab
(si veda inittab (5)
). Questo file ha, di solito, delle voci che fanno
sì che init avvii getty su ogni riga nella quale possono loggarsi gli
utenti. Controlla anche processi autonomi richiesti da qualsiasi sistema.
Un runlevel è una configurazione software del sistema che permette
l'esistenza solo di un gruppo selezionato di processi. I processi avviati
da init per ognuno di questi runlevel sono definiti nel file /etc/inittab
. Init può essere in uno degli otto runlevel , 0en6 e S o s . Il runlevel
è cambiato da un utente privilegiato lanciando /sbin/telinit , il quale
invia un segnale appropriato a init , indicandogli a quale runlevel passare.
I runlevel 0, 1 e 6 sono riservati. Il runlevel 0 è usato per fermare
(halt) il sistema, il runlevel 6 è usato per riavviare (reboot) il sistema
e il runlevel 1 è usato per portare il sistema in single user mode. Il
runlevel S non è in realtà pensato per essere usato direttamente, ma
più che altro per gli script che sono eseguiti quando si entra nel runlevel
1 . Per maggiori informazioni su questo, si vedano le pagine di manuale
di shutdown (1)
e inittab (5)
.
Sono validi anche i runlevel 7-9, sebbene
non realmente documentati. Ciò perché le varianti di Unix "tradizionali"
non li usano. Nel caso lo si voglia sapere, i runlevel S e s sono di
fatto lo stesso. Internamente sono un alias per lo stesso runlevel - ciò
è solo un rimasuglio del modo che l'autore usò quando scrisse sysvinit.
Dopo che init è lanciato come ultimo passo dell'avvio (boot)
del kernel, cerca se nel file /etc/inittab c'è una voce del tipo initdefault
(si veda inittab (5)
). initdefault specifica il runlevel iniziale del
sistema. Se non c'è tale voce o non c'è il file /etc/inittab , un runlevel
deve essere immesso nella console del sistema.
Il runlevel S o s porta
il sistema in modalità utente singolo (single user mode) e non necessita
del file /etc/inittab . In modalità single user, è lanciato /bin/sh in
/dev/console .
Quando si entra in single user mode, init legge lo stato
ioctl (2)
della console da /etc/ioctl.save . Se questo file non esiste,
init inizializza la linea a 9600 baud e con i settaggi CLOCAL . Quando
init lascia il single user mode, salva i settaggi ioctl della console
in questo file cosicché possa riusarli nella successiva sessione in single-user.
Quando si entra per la prima volta in modalità multiutente, init esegue
le voci boot e bootwait che permettono al filesystem di essere montato
prima che un utente possa loggarsi. Poi sono eseguite tutte le voci corrispondenti
al runlevel .
Quando avvia un nuovo processo, init per prima cosa guarda
se esiste il file /etc/initscript . Se c'è, usa questo script per far partire
il processo.
Ogni volta che un processo figlio termina, init salva questo
fatto e la ragione per la quale è morto nei file /var/run/utmp e /var/log/wtmp
(se esistono).
Dopo aver avviato tutti i processi
specificati, init aspetta che uno dei suoi processi figlio muoia, un
segnale di powerfail, o fino a che non riceve un segnale da /sbin/telinit
per cambiare il runlevel del sistema. Quando avviene una delle tre condizioni
suddette, riesamina il file /etc/inittab . A questo file possono essere
aggiunte nuove voci quando si vuole. Comunque, init aspetta sempre che
avvenga una delle tre condizioni suddette. Per ottenere una risposta istantanea,
si possono usare i comandi Q o q per risvegliare init e fargli riesaminare
il file /etc/inittab .
Se init non è in single user mode e riceve un
segnale di powerfail, saranno invocate apposite voci per il powerfail.
Quando a init è richiesto di cambiare il runlevel , invia il segnale
di avviso SIGTERM
a tutti i processi che non sono definiti nel nuovo
runlevel . Poi aspetta 5 secondi prima di terminare forzatamente questi
processi tramite il segnale di kill SIGKILL
. Si noti che init assume
che tutti questi processi (e i loro discendenti) rimangano nello stesso
gruppo di processi nel quale init li ha creati in origine. Se un qualsiasi
processo cambia il suo process group non riceverà questi segnali. Questi
processi devono essere terminati a parte.
/sbin/telinit è linkato
a /sbin/init . Accetta un carattere singolo come argomento e segnala a
init di effettuare le azioni appropriate. I seguenti argomenti servono
come direttive a /sbin/telinit :
- 0 ,1 ,2 ,3 ,4 ,5 o 6
- dicono a /sbin/init
di passare al runlevel specificato.
- a ,b ,c
- dicono a /sbin/init di processare
solo quelle voci del file /etc/inittab che hanno runlevel a ,b o c
.
- Q o q
- dice a /sbin/init di riesaminare il file /etc/inittab .
- S o
s
- dice a /sbin/init di passare in single user mode.
/sbin/telinit può
dire a init anche quanto tempo dovrebbe attendere tra l'invio ai processi
del TERM signal e l'invio del KILL signal; di default è 5 secondi, ma può
essere cambiato con l'opzione -t sec .
/sbin/telinit può essere invocato
solo da utenti con i privilegi appositi.
/etc/inittab
/etc/initscript
/dev/console
/etc/ioctl.save
/var/run/utmp
/var/log/wtmp
/dev/initctl
Init setta le seguenti variabili d'ambiente per tutti i suoi
figli:
- PATH
- Di default a /bin:/usr/bin:
- INIT_VERSION
- A quel che dice
il nome. Utile per determinare se uno script è stato lanciato direttamente
da init.
- RUNLEVEL
- Il runlevel attuale del sistema.
- PREVLEVEL
- Il runlevel
precedente (utile dopo un cambio di runlevel).
È possibile passare
diverse opzioni a init dal bootmonitor (p.es. LILO). Init accetta i flag
seguenti:
- S, single
- Boot in single user mode. In questa modalità è esaminato
/etc/inittab e lo script rc bootp è di solito eseguito prima di avviare
la shell del single user mode.
- 1-5
- Runlevel nei quali fare il boot.
- -b, emergency
- Fa il boot direttamente nella single user shell senza lanciare nessun
altro script di startup.
Init è compatibile con il System
V init. Lavora in stretto ``contatto'' con gli script nelle directory /etc/init.d
e /etc/rc{runlevel}.d . Se il proprio sistema usa queste convenzioni, ci
dovrebbe essere un file README nella directory /etc/init.d che spiega
come funzionano questi script.
Init assume che i processi
e i loro discendenti rimangano nello stesso process group che è stato
originariamente creato per loro. Se i processi cambiano il loro gruppo,
init non può killarli e si potrebbe finire con due processi che leggono
da una linea del terminale.
Se /sbin/init si accorge che
sta eseguendo una voce per più di 10 volte in 2 minuti, assumerà che ci
sia un errore nella stringa di comando, e genererà un messaggio d'errore
nella console del sistema, e si rifiuterà di rieseguire questa voce finché
non siano passati 5 minuti o riceva un signal. Ciò per evitare che init
si ``mangi'' tutte le risorse del sistema quando qualcuno fa un errore tipografico
nel file /etc/inittab o è rimosso il programma che deve essere lanciato
nella voce.
Miquel van Smoorenburg (miquels@cistron.nl), pagina
di manuale iniziale di Michael Haardt (u31b3hs@pool.informatik.rwth-aachen.de).
Traduzione di Giovanni Bortolozzo <borto@dei.unipd.it>
getty(1)
,
login(1)
, sh(1)
, who(1)
, shutdown(1)
, kill(2)
, inittab(5)
, initscript(5)
,
utmp(5)
Table of Contents
|