Sont passés en revue ici :
Seul et unique process lancé par le kernel, init a pour tâche de lancer chacun des process, y compris les différents daemons et les sessions de login sur les consoles texte, pour aboutir à un système configuré. Il doit aussi collecter les zombies (process orphelins) et gérer l'arrêt du système. Quand le kernel est exécuté, au boot, il charge les drivers de périphériques pour lesquels il a été configuré puis il lance /sbin/init , lequel prend en charge la suite des opérations, les path /bin/init et /etc/init sont aussi compilés dans le noyau). Par la suite le kernel n'interviendra plus que pour répondre aux appels système. La plupart des distributions procurent un init écrit par Miquel van Smoorenburg, lequel est similaire dans son approche à l'init d'Unix System V.
Ainsi init est le premier process lancé, il est le père de tous les autres process. Si pour une raison indéterminée le kernel ne pouvait exécuter init , il exécuterait /bin/sh et lancerait un shell, lequel vous donnerais accès en qualité de root et en mode mono-utilisateur à un système non configuré. Cela peut permettre un dépannage après avoir monté manuellement les systèmes de fichiers. Ne pas perdre de vue que dans ce cas de figure, l'arrêt du système et Ctrl-Alt-Del ne sont pas gérés.
On notera que si init était inexistant ou défectueux, ou encore que vous souhaitiez utiliser un autre programme init, le kernel accepte, sous forme interactive au boot, la directive :
init=
Ainsi que la directive, dans /etc/lilo.conf :
append=
init se charge des opérations suivantes :
C'est le script /etc/inittab qui définit le mode dans lequel sera démarré le système. Il s'agit des runlevels ou niveaux d'exécution. Les runlevels peuvent être spécifiés différemment d'une distribution à une autre. On notera cependant que les runlevels 0, 1 et 6 sont codés en dur dans init ou dans shutdown et ne peuvent être changés.
Le système est démarré dans le mode indiqué par la ligne
id:.:initdefault:
La syntaxe de inittab est la suivante :
id:runlevel:action:process
La consultation de la page man inittab 5 est particulièrement instructive. Le système étant lancé, on peut à tout moment changer de runlevel aux moyen des commandes init ou telinit suivies du runlevel souhaité. Voir à ce sujet les pages man init 8 et telinit 8.
Red Hat et Mandrake | SuSE | Debian | Slackware |
---|---|---|---|
0 Arrêt système | 0 Arrêt système | 0 Arrêt système | 0 Arrêt système |
1 Mono-utilisateur | 1 Multi user sans réseau | 1 Mono-utilisateur | 1 Mono-utilisateur |
2 Multi user sans réseau | 2 Multi user avec réseau | 2 Multi user sans réseau | 2,3 et 5 Multi user |
3 Multi user avec réseau | 3 Multi user, réseau, Xwindow | 3 Multi user avec réseau | . |
4 Non utilisé | 4 Non utilisé | 4 Non utilisé | 4 Multi user, Xwindow |
5 Multi user,réseau,Xwindow | 5 Non utilisé | 5 Multi user,réseau,Xwindow | . |
6 Arrêt et reboot | 6 Arrêt et reboot | 6 Arrêt et reboot | 6 Arrêt et reboot |
. | S Mono-utilisateur | . | S Generic start |
# inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, miquels@drinkel.nl.mugnet.org # Modified for RHS Linux by Marc Ewing and Donnie Barnes # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Things to run in every runlevel. ud::once:/sbin/update # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 # xdm is now a separate service x:5:respawn:/etc/X11/prefdm -nodaemon
/dev/sda3 / ext2 defaults 1 1 /dev/sda1 /mnt/dosc vfat defaults 0 0 /dev/sdb1 /mnt/dosd vfat defaults,noauto 0 0 /dev/sdb3 /mnt/disk ext2 defaults,noauto 1 2 /dev/sda2 swap swap defaults 0 0 /dev/sdb2 swap swap defaults 0 0 /dev/fd0 /mnt/floppy auto sync,user,noauto,nodev,unhide 0 0 /dev/cdrom /mnt/cdrom auto user,noauto,noexec,nodev,unhide,nosuid,ro 0 0 /dev/sr1 /mnt/graveur auto defaults,noauto 0 0 none /proc proc defaults 0 0
/etc/inittab
Premier script lancé par init, il définit les niveaux d'exécution et conditionne par là les scripts qui seront lancés par la suite.
/etc/rc.d/rc.sysinit
Chargé par inittab, ce script active le swap, monte les filesystems, configure le PATH, lance fsck s'il y a lieu, active les modules, ...
/etc/rc.d/rc.
Il existe un certain nombre de scripts rc, celui qui sera lancé sera celui qui est spécifié dans la ligne initdefault de inittab. Par exemple si le runlevel par défaut est 3, c'est /etc/rc.d/rc.3 qui sera exécuté; rc signifie 'run command'.
/etc/rc.d/rc.local
C'est le dernier script lancé au démarrage. C'est l'endroit idéal pour ajouter des commandes que l'on souhaite voir s'exécuter au démarrage, avant le login.
Toutes les distributions Linux n'utilisent pas forcément les mêmes scripts et ne les installent pas toujours dans /etc , cependant le résultat final sera dans tous les cas un système configuré et opérationnel. Simplement, si l'on change de distribution, il faudra se familiariser avec une nouvelle structure et voir exactement ce que fait chaque script.
Ainsi avec SuSE on aura les scripts suivants :
/sbin/init.d/boot /sbin/init.d/boot.local /etc/init.d/boot.d /etc/rc.d/rc.config
Avec Debian :
/etc/initscript /etc/rc.d/rc.S /etc/init.d/rc. /etc/rc.boot
Avec Slackware :
/etc/rc.d/rc.M /etc/rc.d/rc.S /etc/rc.d/rc.K