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 correctement. 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, et cætera. Init démarre aussi les processus getty qui vous donnent l'invite de connexion 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. En général, 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, et cætera.
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 niveaux d'exécution (runlevels). 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 les 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 de gestion des niveaux d'exécution l'ordre dans lequel il doit les lancer. En l'occurrence, 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 démon de gestion du journal système. Parce que le nom du lien commence par un « S », le script de gestion des niveaux d'exécution 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 qui doit être arrêter, et dans quel ordre, lorsque l'on entre dans ce 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, où 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. 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 faire tourner plus de choses à la fois, et passer rapidement de l'une à l'autre. Vous pourriez aussi avoir besoin de lancer un getty vers un terminal texte ou vers un modem. Vous devrez alors éditer inittab.
/etc/inittab est le fichier de configuration principale d'init.
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 ce 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 getty 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 "Bonjour, 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 document de référence sur Bash à portée de la main.
Il y a des pages de manuel pour les fichiers inittab et fstab. Tapez (par exemple) man inittab dans un shell pour l'afficher.
Le guide Linux de l'administrateur système du projet de documentation Linux (LDP) contient une section intéressante sur init.
Pour le code source, suivre les liens du Construire un système Linux minimum à partir du code source