Je ne parlerai que du style d'initialisation ``System V'' que les systèmes
Linux utilisent le plus souvent. Il existe des alternatives. En fait, vous
pouvez mettre n'importe quel programme dans /sbin/init
, que le noyau
exécutera lorsqu'il aura fini de se charger.
Le travail d'init
est de faire en sorte que tout se lance comme
il faut. Il vérifie que les systèmes de fichier sont en bon état et les
monte. Il démarre les démons (``daemons'') qui enregistrent les messages
système, gèrent le réseau, distribuent les pages web, écoutent les
signaux de la souris, etc. Init démarre aussi les processus getty
qui vous donnent l'invite de login sur vos terminaux virtuels.
Il y a un processus compliqué concernant le changement de niveau d'exécution ("run-levels"), mais je vais sauter tout ça, et ne parler que du démarrage du système.
Init lit le fichier /etc/inittab
, qui lui dit quoi faire.
Typiquement, la première chose demandée est l'exécution d'un script
d'initialisation. Le programme qui exécute (ou interprète) ce script est
bash
, le même programme qui vous donne la ligne de commande.
Sur les systèmes Debian, le script d'initialisation est /etc/init.d/rcS
,
sur Red Hat, /etc/rc.d/rc.sysinit
.
C'est là que les systèmes de fichiers sont vérifiés puis montés, l'horloge
mise à l'heure, le fichier ou la partition d'échange (swap) activés,
les noms de machines définis, etc.
Ensuite, un autre script est invoqué pour nous placer dans le niveau
d'exécution par défaut. Cela implique simplement le démarrage d'un ensemble
de sous-systèmes. Il existe un ensemble de sous-répertoires
/etc/rc.d/rc0.d
,
/etc/rc.d/rc1.d
, ..., /etc/rc.d/rc6.d
sous Red Hat, ou
/etc/rc0.d
,
/etc/rc1.d
, ..., /etc/rc6.d
sous Debian, correspondant aux
run-levels. Si nous entrons dans le niveau d'exécution 3 sur un système
Debian, le script exécute tous les scripts de /etc/rc3.d
commençant
par `S' (pour Start). Ces scripts sont en réalité des liens vers un autre
répertoire appelé généralement init.d
.
Donc, le script de notre niveau d'exécution est appelé par init
, et
recherche dans un répertoire des scripts dont le nom débute par la lettre
`S'. Il se peut qu'il tombe sur S10syslog
en premier. Les chiffres
indiquent au script du niveau l'ordre dans lequel il doit les lancer. En
l'occurence, S10syslog
est lancé en premier parce qu'il n'y pas de
script commençant par S00 ... S09. Mais S10syslog est en fait un lien vers
/etc/init.d/syslog
qui est un script chargé du démarrage et de
l'arrêt du system logger (enregistreur de messages systèmes). Parce que le
lien commence par un `S', le script du run-level sait qu'il doit exécuter
le script syslog
avec le paramètre "start". Il y a aussi des liens
dont le nom débute par `K' (pour Kill), qui spécifient ce qu'il faut
arrêter, et dans quel ordre, lorsque l'on entre dans le niveau d'exécution.
Pour changer ce que le sous-système lance par défaut, vous devez configurer
ces liens dans le répertoire rcN.d
, ou N est le niveau d'exécution
par défaut défini dans votre fichier inittab
.
La dernière chose importante qu'effectue init est de démarrer les
getty
s [NdRel :en pratique, souvent des mingetty
s)].
Ceux-ci sont ressuscités (``respawned''), ce qui signifie
qu'ils sont automatiquement relancés par init
s'ils viennent à se
terminer. La plupart des distributions fournissent six terminaux virtuels.
Il se peut que vous souhaitiez en enlever pour économiser de la mémoire,
ou en ajouter pour pouvoir lancer beaucoup de choses à la fois, et passer
rapidement de l'un à l'autre. Vous pourriez aussi avoir besoin de lancer un
getty
vers un terminal texte ou vers un modem. Vous devez alors
éditer inittab
.
/etc/inittab
, qui est le fichier de configuration au sommet de
la "hiérarchie" des fichiers de configuration.
Les répertoires rcN.d
, où N = 0, 1,..., 6 détermine les
sous-systèmes à lancer.
Quelque part dans les scripts invoqués par init, se trouve la commande
mount -a
.
Cela signifie : "Monte tous les systèmes de fichiers censés être montés".
Le fichier /etc/fstab
définit ce qui est censé être monté. Si vous
souhaitez changer ce qui est monté par défaut au démarrage, c'est le fichier
que vous devez modifier. Il existe une page de manuel pour fstab
.
Trouvez le répertoire rcN.d
du niveau d'exécution par défaut de votre
système puis faites un ls -l
pour voir les fichiers pointés par les
liens.
Changez le nombre de gettys tournant sur votre système.
Retirez tous les sous-systèmes dont vous n'avez pas besoin de votre niveau d'exécution par défaut.
Essayez de déterminer le minimum nécessaire pour démarrer.
Fabriquez une disquette avec Lilo, un noyau et un programme statique
affichant "Bonjour tout le monde !" nommé
/sbin/init
, puis regardez-la démarrer et dire bonjour.
Regardez attentivement votre système démarrer, et notez les événements
signalés. Ou imprimez une section de votre journal système
/var/log/messages
à partir du moment où votre système a
démarré. Ensuite, en partant d'inittab
, explorez tous les
scripts et essayez de voir quel code fait quoi. Vous pouvez également
ajouter des messages, comme
echo "Hello, moi c'est rc.sysinit"
C'est aussi un bon exercice pour apprendre le langage de script de Bash, certains scripts étant assez compliqués. Ayez un bon guide de bash à portée de main (NDT : "man bash" devrait suffire, faute de mieux).
inittab
et fstab
.
Tapez (par exemple) man inittab
dans un shell pour l'afficher.