La séquence init

Avant propos

Sont passés en revue ici :

Init et les scripts de configuration

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.

 

Les runlevels (niveaux d'exécution)

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


Exemple inittab Red Hat

# 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

 

Exemple fstab

/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

 

Scripts (Red Hat et Mandrake)

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

 

Variantes selon les distributions

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