initToute exécution sous Linux passe par un processus (schématisons, schématisons...), et tout processus est créé par un autre processus : on a donc une « généalogie » de processus et on parle alors de « processus pères » et de « processus fils ».
Le processus init est l'ancêtre de tous les processus, c'est le premier
lancé et c'est pour ça qu'il est identifié par le numéro 1. Tout processus est
connu du système par son PID (Processus ID), faites « ps aux --sort=pid »
pour voir la liste des processus en cours et leurs PID, triés selon
ces derniers. Voici ce que donne cette commande sur une Red Hat 5.1. :
$ ps aux --sort=pid
USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 780 416 ? S 11:34 0:04 init [3]
root 2 0.0 0.0 0 0 ? SW 11:34 0:00 (kflushd)
root 3 0.0 0.0 0 0 ? SW 11:34 0:00 (kswapd)
root 103 0.0 0.3 752 364 ? S 11:34 0:00 kerneld
root 192 0.0 0.4 812 460 ? S 11:34 0:00 syslogd
root 201 0.0 0.6 1008 640 ? S 11:34 0:00 klogd
daemon 212 0.0 0.4 792 408 ? S 11:34 0:00 /usr/sbin/atd
root 223 0.0 0.4 804 448 ? S 11:34 0:00 crond
root 234 0.0 0.4 788 424 ? S 11:34 0:00 inetd
root 245 0.0 0.4 836 420 ? S 11:34 0:00 lpd
root 261 0.0 0.8 1352 848 ? S 11:34 0:00 sendmail: accepting connections on port 25
root 273 0.0 0.3 760 352 ? S 11:34 0:00 gpm -t ms
news 296 0.0 2.2 2724 2148 ? S 11:34 0:08 /usr/lib/news/bin/actived
news 298 0.0 2.7 3256 2612 ? S 11:34 0:01 /usr/sbin/innd -p4 -i0 -L
jaco 313 0.0 0.9 1460 932 1 S 11:34 0:00 /bin/login -- jaco
root 314 0.0 0.3 744 320 2 S 11:34 0:00 /sbin/mingetty tty2
root 315 0.0 0.3 744 320 3 S 11:34 0:00 /sbin/mingetty tty3
root 316 0.0 0.3 744 320 4 S 11:34 0:00 /sbin/mingetty tty4
root 317 0.0 0.3 744 320 5 S 11:34 0:00 /sbin/mingetty tty5
root 318 0.0 0.3 744 320 6 S 11:34 0:00 /sbin/mingetty tty6
root 320 0.0 0.2 736 244 ? S 11:34 0:00 update (bdflush)
news 321 0.0 0.3 928 288 ? S 11:34 0:00 /usr/lib/news/bin/crosspost -s -
news 322 0.0 0.3 928 312 ? S 11:34 0:00 /usr/lib/news/bin/overchan
jaco 323 0.0 0.8 1168 772 1 S 11:35 0:00 -bash
jaco 334 0.0 0.6 1096 576 1 S 11:35 0:00 sh /usr/X11R6/bin/startx
jaco 335 0.0 0.7 1840 684 1 S 11:35 0:00 xinit /home/jaco/.xinitrc --
root 336 1.1 7.5 10984 7196 ? S 11:35 4:48 /usr/X11R6/bin/Xwrapper :0
jaco 339 0.1 2.4 3264 2308 1 S 11:36 0:40 wmaker
root 344 0.0 1.7 2960 1696 1 S 11:36 0:00 xterm -sb
root 345 0.0 2.2 2960 2156 1 S 11:36 0:02 xterm -sb
root 346 0.0 2.5 3208 2412 1 S 11:36 0:18 xterm -sb
(...)
jaco 2879 0.0 0.5 868 512 p1 R 18:50 0:00 ps aux --sort=pid
Si init, comme on a pu le vérifier par la commande précédente, est le
premier processus, qui le lance ? Le noyau, qui, après avoir été chargé en
mémoire, commence à s'exécuter et initialise tous les pilotes de périphériques
qu'il détecte, puis termine sa phase de démarrage en lançant
/sbin/init. Si le noyau ne trouve pas init, il tente de lancer
/bin/sh (qui est un lien symbolique vers /bin/bash) et, si
cela échoue encore, le démarrage s'interrompt.
Lorsqu'init est lancé, il prend en charge la fin de la procédure de
démarrage en réalisant certaines tâches d'administration système :
vérification du système de fichiers racine, montage des autres systèmes de
fichiers, activation du swap, initialisation des différents services
principaux, etc. et, enfin, autorisation des connexions des utilisateurs. À
partir de là, le système est soit en « mode mono-utilisateur », soit en
« mode multi-utilisateurs » (cas le plus fréquent).
Toutes ces tâches sont configurées et réalisées par des « scripts
d'initialisation », qui ne sont que de simples scripts shell
(équivalent des .BAT de MS-DOS). Sous Linux, ces scripts sont
regroupés sous /etc.
NB : Toutes les distributions Linux (à mon humble connaissance...)
utilisent le paquetage sysvinit, basé sur l'init de System V (lire «
System 5 », pas « System vé »...), et c'est donc celui-ci que nous
étudierons.
La principale caractéristique de l'init de System V est qu'il définit des
« niveaux d'exécution » (runlevels).