Init reprezintă primul proces user-space care este rulat de către kernel. Rolul lui este de a porni restul proceselor user-space (este strămoșul tutror proceselor de pe sistem). De asemenea, el rămâne activ până la oprirea sistemului și adoptă automat toate procesele orfane (al căror părinte direct s-a terminat). Kernelul va căuta executabilul pentru procesul init pe partiția root confrom priorităților:
init=/bin/init
)/sbin/init
/etc/init
/bin/init
/bin/sh
Dacă nici unul dintre executabile nu este prezent bootarea sistemului se va termina cu kernel panic.
Există mai multe implementări pentru procesul init, cum ar fi System V, Upstart, systemd etc. În continuare ne vom concentra asupra System V, care poate fi întâlnit în majoritatea sistemelor embedded. Acest sistem de inițializare folosește conceptul de runlevel, care definește ce servicii (programe) trebuie pornite la trecerea în acel runlevel. Exemple de runlevel-ul în Linux sunt:
Configuările pentru System V sunt stocate în fișierul /etc/inittab
. Pentru RaspberryPi, liniile relevante din inittab sunt:
id:2:initdefault:
- specifică runlevel-ul inițial (2).si::sysinit:/etc/init.d/rcS
- specifică scriptul (/etc/init.d/rcS) care va fi rulat la pornirea sistemului, înainte de intrarea în runlevel-ul inițial.ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
- specifică acțiunea (/sbin/shutdown ...) apelată la apăsarea tastelor Ctrl+Alt+Del în runlevel-urile 1, 2, 3, 4 și 5.1:2345:respawn:/sbin/getty –noclear 38400 tty1
- pornește programul de login getty pentru terminalul 1 (tty1); procesul va fi repornit automat (respawn) dacă este terminat.T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
- pornește programul de login pentru interfața serială (ttyAMA0).
Se observă o oarecare asemnănare între liniile din fișierul de configurare. Acestea au formatul <id>:<runlevel>:<action>:<process>
, unde id
reprezintă un identificator ales de noi, runlevel
specifică runlevel-urile în care va fi rulat programul, action
specifică circumstanțele în care va fi rulat programul, iar process
specifică linia de comandă.
Configurarea serviciilor care vor fi rulate în fiecare runlevel se face printr-o serie de link-uri simbolice din directoarele /etc/rcN.d/
(unde N este numărul runlevel-ului). Link-urile care încep cu S vor fi rulate la intrarea în acel runlevel, iar cele care încep cu K vor fi rulate la părăsirea runlevel-ului respectiv. În cadrul unui runlevel serviciile sunt rulate în ordinea alfabetică a link-urilor. De aceea imediat dupa litera S sau K urmează un număr din 2 cifre care specifică prioritatea serviciului respectiv. Dependețele între servicii sunt rezolvate prin specificarea unei priorități mai mari pentru serviciile de bază, pentru a fi rulate înaintea serviciilor dependente.
Script-urile care realizează efectiv pornirea și oprirea serviciilor se găsesc în directorul /etc/init.d
(acestea sunt de fapt target-ul link-urilor simbolice din directoarele runlevel-urilor). Fiecare script corespunde unui serviciu (are același nume cu serviciul) și este apelat de către System V cu unul dintre parametrii start
sau stop
. Script-urile trebuie să respecte un anumit format (prezentat în rândurile următoare), iar link-urile simbolice sunt create automat de către System V după rularea comenzii:
update-rc.d <numele serviciului> defaults
#! /bin/sh ### BEGIN INIT INFO # Provides: schelet # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Schelet serviciu # Description: Schelet serviciu ### END INIT INFO case "$1" in start) echo "Starting schelet" ;; stop) echo "Stopping schelet" ;; status) echo "Schelet is running (or not)" ;; *) echo "Usage: /etc/init.d/schelet {start|stop|status}" exit 1 ;; esac exit 0