Le démarrage sous Linux.



1. Introduction
2. Configuration de "inittab"
3. La pratique par l'éxemple


1. Introduction :

"Init" est le père de tous les processus. Il est le seul processus lancé par le noyau après son chargement. Son rôle principal est de créer des processus fils à partir du script "inittab" (/etc/inittab).

Un "runlevel" est une configuration système qui autorise seulement un certain groupe de processus à éxister. Les processus engendrés pas "init" pour chacun de ces runlevels sont définis dans le fichier /etc/inittab. "init" peut être dans un des huit "runlevels" suivant: 0-6 et S ou s.

remarque : Un utilisateur ayant les droits, peut changer de "runlevel" en cours d'utilisation en faisant appel à la commande "telinit" qui envoie un signal à "init". Quand le "runlevel" est changé, tout les processus en cours qui ne sont pas specifiés dans le nouveau "runlevel", sont tués.

Par convention, les "runlevels" 0, 1 et 6 sont reservés :

Juste après que "init" est été invoqué par le noyau, l'entrée de type "initdefault" (dans le fichier "/etc/inittab") détermine le "runlevel" qui doit être exécuté. Si cette entrée ne figure pas dans inittab, un "runlevel" doit être entré dans la console.

Puis, le script "inittab" est chargé de lancer les processus définient pour le "runlevel" qui a été choisit.



2. Configuration de "inittab" :


Le fichier "inittab" définit quels processus sont lancés au démarrage. Comme dit précedemment, "init" distingue plusieurs "runlevels", chacun ayant une fonction particulière.

Une entrée dans le fichier "inittab" à le format suivant : id : runlevels : action : process

id : séquence unique de 1 à 4 caractère qui identifie (de manière unique donc..) une entrée dans "inittab".
runlevels : liste des "runlevels" pour lesquels l'action specifiée doit être exécutée.
action : le type d'action qui doit être accomplit.
process : spécifie le processus à exécuter.


actions :
respawn Le processus serat relancé chaque fois qu'il se terminerat (e.g. getty).
wait
Le processus serat lancé une seule fois; quand le runlevel est entré. "init" attend qu'il se termine pour continuer.
once
Le processus serat lancé une seule fois; quand le runlevel choisit aurat été entré.
boot
Le processus serat exécuté pendant le démarrage du système. La valeur du "runlevel" est ignoré (= marche qq soit le "runlevel").
bootwait
Le processus serat exécuté pendant le démarrage du système; "init" attend qu'il se termine pour continuer (e.g. /etc/rc). La valeur du "runlevel" est ignoré (= marche qq soit le "runlevel").
off
Ca ne fait rien.
ondemand
Le processus est exécuté chaque fois que le "runlevel" "ondemand" est appellé. Cependant, il n'en découle pas un changement de "runlevel".(les "runlevels" "ondemand" sont `a', `b', et `c').
initdefault
L'entrée "initdefault" spécifie quel "runlevel" doit être lancé après le chargement du noyau. Si cette entrée n'est pas présente, "init" demanderat, dans une console, quel "runlevel" doit être lancé. La valeur du "runlevel" est ignoré (= marche qq soit le "runlevel").
sysinit
Le processus serat exécuté pendant le démarrage du système. Il serat exécuté avant même l'entrée 'boot' ou 'bootwait'. La valeur du "runlevel" est ignoré (= marche qq soit le "runlevel").
ctrlaltdel
Le processus serat exécuté quand "init" aurat reçut le signal SIGINT. C'est à dire que quelqu'un a pressé la combinaison CTRL-ALT-DEL dans la console. En règle général, le processus specifié par l'utilisateur a pour but de redémarrer la machine.
kbrequest
Le processus est exécuté quand "init" reçoit un signal du gestionnaire de clavier, lui indiquant ainsi qu'une certaine combinaison de touches ont été pressés dans la console.
Pour plus d'informations à ce sujet, allez regarder la documentation de 'kbd'.


3. La pratique par l'éxemple :


Nous allons éssayer d'analyser un exemple de fichier /etc/inittab, que l'on peut retrouver sur une machine tournant sous Debian Woody :

# Definit le runlevel utilisé au démarrage. C'est à dire 3 dans le cas présent.
id:3:initdefault:

# Cette ligne lance, avant tout les autres, le script 'rcS' dans le répertoire '/etc/init.d/'.
si::sysinit:/etc/init.d/rcS

# Exécuter la commande '/sbin/sulogin' en mode single-user.
~~:S:wait:/sbin/sulogin

# Selon le "runlevel" qui a été déterminé, cela lance le script '/etc/init.d/rc' avec cette valeur pour argument.
# Ce script a pour but dans lancer tout les processus contenus dans /etc/rcX.d ( X= valeur du "runlevel" ).
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

# La commande est relancé automatiquement à chaque fois qu'elle se termine.
z6:6:respawn:/sbin/sulogin

# La combinaison CTRL-ALT-DEL entraine l'arret du système ('/sbin/shutdown -t1 -a -r now').
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# On ouvre un certain nombre de terminaux ('/sbin/getty') selon le "runlevel".
# Remarque: sur la plupart des systèmes, tty7 est utilisé par 'X'.
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6


Pour s'assurer que vous avez tout compris, nous allons prendre un éxemple en particulier :

id runlevels action process
l2 2 wait /etc/init.d/rc 2
la séquence de caractères (unique) identifiant cette entrée dans le fichier inittab. cette entrée serat interprété si et seulement si le "runlevel" est 2. Le processus serat lancé une seule fois; quand le runlevel est entré. "init" attend qu'il se termine pour continuer. cette entrée lance le script '/etc/init.d/rc' avec l'argument '2'

Et voilà, vous devez maintenant être capable de modifier à souhait la configuration de démarrage de votre machine pour y ajouter des processus ou, au contraire, en supprimer pour rendre le démarrage plus rapide.