Les niveaux d'exécution

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 ...

Linux Magazine France n° 4 - Mars 99