Après la première phase de démarrage d'un système Linux, le programme init est exécuté. Il a la charge de lancer les programmes et processus inscrits dans le fichier /etc/inittab. Init exécute les commandes en fonction du niveau d'exécution du système. On parle alors de runlevels.
Les différents niveaux
Les niveaux d'exécution "classiques" sont les niveaux : 0, 1, 2, 3, 4, 5, 6 et S. Il est également possible d'utiliser 7, 8, 9, a, b et c, mais ceux-ci ne sont quasiment jamais utilisés. A, b et c sont les niveaux appelés ondemand runlevels. Pour les niveaux classiques, il faut distinguer :
0 pour l'arrêt du système.
1 pour l'arrêt du système en mode mono-utilisateur.
S qui permet le passage en mode mono-utilisateur. Celui-ci n'est pas directement utilisé, il est appelé lors du passage en niveau 1.
6 pour le redémarrage du système.
Le niveau Q n'existe pas en tant que tel. Il s'agit plutôt d'un paramètre passé à la commande init pour forcer la relecture du fichier inittab. Il reste donc les niveaux 2, 3, 4 et 5 qui sont personnalisables selon votre convenance par l'intermédiaire du fichier inittab.
Le fichier /etc/inittab
Le contenu du fichier se présente sous forme de lignes avec la syntaxe suivante : code : niveau : action : commande. Code est le label de la ligne. Niveau correspond au(x) niveau(x) où doit être exécutée la commande. L'action peut être :
respawn 0 pour relancer automatiquement le processus une fois terminé.
wait pour qu'init attende la fin du processus avant de poursuivre.
once pour une exécution unique du processus à l'arrivée dans le niveau spécifié.
boot qui définit que le processus doit être lancé au moment du boot système (le champ niveau est ignoré).
bootwait reprend les actions de wait et de boot cumulées.
off ne fait rien du tout.
ondemand pour lancer les processus lors d'un pseudo passage en ondemand runlevel. En fait, il n'y a pas de changement de niveau,
les commandes processus sont simplement lancées.
initdefault pour définir le niveau par défaut après le démarrage. Si rien n'est spécifié, le niveau d'exécution sera demandé
sur la console (le champ commande est ignoré).
sysinit définit un processus à lancer pendant le démarrage. Il sera exécuté avant toutes les lignes boot ou bootwait
(le champ niveau est ignoré).
powerwait définit le processus à lancer quand init reçoit le signal SIGPWR qui indique un problème d'alimentation.
Init attendra que le processus soit terminé pour poursuivre.
powerfail idem que powerwait mais init n'attend pas que le processus soit terminé.
powerokwait définit le processus à lancer si un SIGPWR est reçu. Le fichier /etc/powerstatus est contrôlé. Si celui-ci contient
la chaîne OK, le problème d'alimentation est résolu.
ctrlaltdel définit le processus à lancer si la séquence de touches CTRL + ALT + SUPP est initiée. Habituellement
c'est la commande shutdown qui est appelée.
Exemple de fichier inittab
Voici un fichier /etc/inittab typique provenant d'une distribution Slackware 3.3
# On commence par la définition du niveau par défaut id:3:initdefault: # On lance le script /etc/rc.d/rc.S durant le boot (action sysinit) si:S:sysinit:/etc/rc.d/rc.S # On définit le script à lancer en passant en mode mono-utilisateur su:1S:wait:/etc/rc.d/rc.K # On définit le script à lancer en passant en mode multi-utilisateurs rc:2345:wait:/etc/rc.d/rc.M # On définit la commande à lancer lors d'un CTRL + ALT + SUPP ca::ctrlaltdel:/sbin/shutdown -t5 -rfn now # On définit le script à lancer pour l'arrêt du système (niveau 0) 10:0:wait:/etc/rc.d/rc.6 # On définit la commande pour un problème d'alimentation pf::powerfail:/sbin/shutdown -f +5 <<Oh, je perd ma vanille>> # Si l'alimentation revient avant l'extinction, on annule le shutdown pg:0123456:powerokwait:/sbin/shutdown -c <<Rhaaahhh lovely>> # Si l'alimentation revient en mode mono-utilisateur, on passe en mode multi-utilisateurs ps:S:powerokwait/sbin/init 5 # Lancement des 6 consoles virtuelles agetty en respawn c1:1235:respawn:/sbin/agetty 38400 tty1 linux c2:1235:respawn:/sbin/agetty 38400 tty2 linux c3:1235:respawn:/sbin/agetty 38400 tty3 linux c4:1235:respawn:/sbin/agetty 38400 tty4 linux c5:1235:respawn:/sbin/agetty 38400 tty5 linux c6:1245:respawn:/sbin/agetty 38400 tty6 linux # Définition du Runlevel 4 pour le système Xwindow # Ici 4 et sur une Red Hat c'est le niveau 5 # Habituellement on lance xdm, ici on préfère Login.app plus sympathique x1:4:respawn:/usr/local/bin/Login.app >& /dev/null
Dernier point, la commande runlevel vous permet de savoir dans quel niveau vous vous trouvez et quel était le niveau précédent.
Attention tout de même, avant de vous lancer dans le bidouillage nocturne : le fichier /etc/inittab est lu au démarrage, et, de ce fait, une erreur dans ce fichier peut paralyser votre système Linux pendant un bon bout de temps ...