Les niveaux d'exécution, au nombre de 7, indiquent au système de quelle façon il doit s'initialiser, ou plus précisément dans quel état de configuration il doit se trouver lors de son fonctionnement. On peut passer d'un niveau à l'autre avec la commande init :
init 5
fait passer au niveau d'exécution numéro 5.
Seuls les deux niveaux extrèmes sont normalisés dans Linux :
Parmis les niveaux d'exécution, l'un d'eux est défini comme niveau par défaut : c'est celui qui est sélectionné lors du démarrage du système. Le lecteur astucieux aura compris qu'il n'est pas conseillé de fixer le niveau par défaut à 0 ou à 6...
Pour chaque niveau d'exécution, il existe un ensemble de scripts (des fichiers
textes exécutables, en réalité des programmes en langage Shell - voir la section
2.7 page
pour plus de détails
concernant la programmation) qui réalisent l'initialisation des différents services
du système : configuration du clavier, du serveur mail, de la souris... Le niveau
d'exécution par défaut permet de déterminer quels seront les scripts à exécuter,
et ainsi de spécialiser le comportement du système selon ce que vous souhaitez
faire.
Par exemple, sur une distribution RedHat :
). Les scripts spécifiques à la gestion du réseau
ne sont pas exécutés.
à propos de X-Window, et la section
7.1.6 page
pour le démarrage en mode X).
Il s'agit d'un simple fichier texte, donc modifiable avec n'importe quel éditeur de texte. Toutefois, si tout le monde peut le consulter, il faut être root pour le modifier.
Ce fichier est une suite de lignes, ayant toutes la même forme générale, composées de quatre éléments (on dit <<champs2.30>>) :
<id>:<niveau(x)>:<action>:<programme>
où :
# 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:5: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:12345:respawn:/sbin/mingetty -noclear 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
## Plutot kdm, l'equivalent KDE
x1:5:respawn:/opt/kde/bin/kdm -nodaemon
# 4 : pour le LUG de Dijon : configuration speciale (IP-Masquerade, etc.)
x2:4:respawn:/opt/kde/bin/kdm -nodaemon
La première chose qui paraît manifeste, c'est que les lignes commençant par un dièse ('#') sont des commentaires : leur présence est purement informative, et elles ne sont absolument pas prises en compte par le système. Ne négligez pas ces lignes : elles apportent beaucoup à la clarté des fichiers de configuration et autres scripts ; il n'y en a jamais trop.
Considérons la première ligne <<significative>> :
id:5:initdefault:
Cette ligne précise quel niveau doit être choisi pour démarrer le système (ici, le niveau 5) : c'est le sens de l'action 'initdefault'. Pas de programme associé : cela ne présente pas d'intérêt ici. Si vous supprimez cette ligne (ou mieux, vous placez un dièse au début), durant le démarrage le système demandera dans quel niveau il doit se placer pour terminer son initialisation : cela peut être utile, pour tester différentes configurations. Consultez la documentation de votre distribution pour connaître l'utilisation des niveaux de 1 à 6, si ce n'est pas explicité comme ici dans un commentaire.
La ligne suivante :
si::sysinit:/etc/rc.d/rc.sysinit
... indique un programme à exécuter dans les premiers temps du démarrage (action 'sysinit'), juste après que le matériel physique ait été reconnu. A ce stade, la notion de niveaux n'existe pas encore réellement, c'est pourquoi aucun n'est présent.
Viennent ensuite un certains nombre de lignes utilisées pour effectuer des actions spécifiques à chaque niveau. L'action 'wait' indique que le processus d'initialisation ne se poursuivra pas tant que le programme spécifié ne sera pas terminé. Dans le cas présent c'est le même programme qui est appelé pour chaque niveau, mais avec un paramètre différent.
Le programme mentionné dans la ligne suivante, associé à l'action 'once', sera exécuté dès l'entrée dans un nouveau niveau : le vide de la liste des niveaux est ici interprété comme <<tous les niveaux>>.
La ligne qui suit réalise l'interception de la séquence de touches Ctrl+Alt+Suppr, qui normalement provoque un redémarrage de la machine. C'est effectivement ce qui se passe, mais de manière contrôlée par le système, donc <<proprement>>.
Les deux lignes suivantes ne sont utiles que si vous disposez d'un onduleur, et qu'il est correctement configuré : la première provoque un arrêt du sysème après un certain délai en cas de coupure de courant, la seconde arrête la procédure d'arrêt (si cela est possible) dans l'éventualité où le courant revienne.
Les six lignes suivantes effectuent la mise en place des consoles textes virtuelles
(voir 1.3.3 page
au sujet des consoles virtuelles)
: en fait, le programme exécuté est celui qui demande le nom et le mot de passe
de l'utilisateur, pour contrôler l'accès au système. Comme a priori une
telle procédure peut survenir plusieurs fois sur une même console (plusieurs
utilisateurs qui se connectent et se déconnectent les uns après les autres),
l'action 'respawn' indique que le programme doit être relancé lorsque
son exécution est terminée.
Notez que le niveau 1, que nous avions décrit comme un mode mono-utilisateur, ne se voit attribué qu'une seule console virtuelle (qui devient alors réelle...)
Enfin, les deux dernières lignes sont utilisées pour un démarrage en mode graphique. Elles auraient put d'ailleurs être rassemblées en une seule :
x1:45:respawn:/opt/kde/bin/kdm -nodaemon
Pour plus de détails concernant ce fichier, consultez la page man correspondante : man 8 inittab.
On désigne par ce terme, un ensemble de fichiers textes qui sont en fait des programmes en langage shell. Le rôle de ces programmes est de mettre en place la configuration générale de la machine, lors du démarrage.
Par <<mettre en place la configuration>>, on entend plusieurs choses :
Ces scripts se trouvent centralisés en un seul endroit, /etc/rc.d. Mais à partir de ce point, il n'existe pour l'instant pas de standard entre les différentes distributions (bien qu'une normalisation soit en cours). Encore une fois, pour conserver la cohérence avec ce qui précède, nous nous référerons à une distribution RedHat.
Cette distribution respecte une norme Unix, la norme dites System V. Disons tout de même ici que cette norme tant à se généraliser.
Le répertoire /etc/rc.d contient quelques fichiers, et (au moins) huit répertoires. Décrivons dans un premier temps les fichiers (qui sont en fait des programmes exécutables en langage shell) :
Viennent ensuite un certain nombre de sous-répertoires, dont le nom est de la forme rcn.d : le n correspond à un niveau d'exécution. Ainsi, si vous démarrez en niveau 5, c'est le répertoire rc5.d qui va déterminer quels scripts sont lancés.
Chacun de ces sous-répertoires contient un ensemble de liens symboliques (voir
2.2.3 page
pour plus d'information sur les liens) vers
certains des fichiers du répertoire init.d. Le nom des liens respecte
un certain format :
La présence ou l'abscence d'un lien particulier détermine si le script est lancé ou non. De plus, la distinction entre les scripts d'entrée (dont le lien commence par 'S') et les scripts de sortie (dont le lien commence par 'K'), associée à l'ordre induit par les deux chiffres, permets d'avoir un contrôle très précis sur la mise en place des services et leur arrêt.
Mais prenons un exemple. Dans le répertoire rc5.d, se trouve un lien dont le nom est S11httpd. Le 'S' nous indique qu'il s'agit d'un script qui sera lancé lors de l'entrée dans le niveau 5, et sera (probablement) le onzième script à être exécuté. Le script sera httpd (avec l'argument 'start'), qui, en l'occurrence, met en place le serveur Web.
Ce lien possède un lien symétrique, K03httpd, qui sera exécuté lors de la sortie du niveau 5 en troisième position, le script étant toujours httpd mais cette fois avec l'argument 'stop'.
Il se peut que vous souhaitiez modifier les scripts lancés au démarrage, ou plus généralement créer une configuration radicalement différente de celle que vous utilisez quotidiennement (par exemple, pour s'adapter à un environnement réseau). Plusieurs méthodes sont à votre disposition pour ce faire.
La première, la plus mauvaise, consiste à modifier les scripts contenus dans le répertoire /etc/rc.d/init.d : ceci est vivement déconseillé, mieux vaut créer vos propres scripts pour vos besoins. Dans ce cas, placez-les dans le répertoire /etc/rc.d/init.d, afin de correspondre à la norme en vigueur.
Vous pouvez également manipuler les liens contenus dans les répertoires rcn.d,
pour en rajouter ou en supprimer. Prenez simplement garde à l'ordre dans
lequel ils doivent être lancés, en fixant convenablement les deux chiffres contenus
dans le nom du lien. De plus, pour tout script de démarrage ajouté (commençant
par 'S'), il est recommandé de créer son alter ego pour l'arrêt (commençant
par 'K'). Une bonne idée est de regarder de quelle façon sont faits les scripts
déjà existants, pour reprendre le même caneva. Notez qu'il existe un outil graphique
pour ce genre d'opération, tksysv (ou ksysv, si vous utilisez
l'interface KDE - voir 4.4.6 page
) : il vous permet d'enlever
ou d'ajouter des scripts dans les niveaux d'exécution et d'en préciser l'ordre
d'exécution.
Une autre possibilités est d'utiliser un niveau inutilisé normalement par votre distribution (dans notre exemple, le niveau 4), pour en faire ce que vous voulez. Si de plus vous placez un dièse ('#') au début de la ligne contenant le 'initdefault' du fichier /etc/inittab, à chaque démarrage le système vous demandera quel niveau vous voulez : une bonne manière d'avoir plusieurs configurations, selon les situations. En général, un niveau ainsi personnalisé est plus ou moins fortement inspiré d'un niveau existant : il peut donc être intéressant de dupliquer un niveau de référence comme base de départ. Pour ce faire, placez-vous dans le répertoire /etc/rc.d et exécutez :
rm rc4.d/*
pour <<faire le ménage>>, c'est-à-dire <<vider>> le niveau 4, et ainsi éviter l'influence de configurations précédentes. Puis, pour dupliquer par exemple le niveau 5 :
cp rc5.d/* rc4.d
Le niveau 4 est alors absolument identique au niveau 5, et c'est à vous de jouer pour modifier ce qui doit l'être...
Naturellement, les numéros indiqués ici ne sont que des exemples : adaptez-les pour correspondre à votre propre configuration.
Le fichier fstab contenu dans le répertoire /etc est utilisé lors du démarrage du système pour déterminer quelles sont les partitions qui doivent être montées lors du démarrage, et plus généralement donne des informations sur les différents systèmes de fichiers auxquels le système peut accéder. Considérons l'exemple suivant :
/dev/hdb9 /home ext2 defaults 1 2
/dev/hdb11 /home/ftp ext2 defaults 1 2
/dev/hdb10 /home/httpd ext2 defaults 1 2
/dev/hdb8 /root ext2 defaults 1 2
/dev/hda7 /usr ext2 defaults 1 2
/dev/hdb12 /usr/src ext2 defaults 1 2
/dev/hda6 swap swap defaults 0 0
/dev/hda1 /mnt/dos1 vfat defaults 1 2
/dev/fd0 /mnt/floppy auto user,noauto 0 0
/dev/cdrom /mnt/cdrom iso9660 user,noauto,ro 0 0
none /proc proc defaults 0 0
Décrivons les différentes colonnes qui apparaissent.
La première colonne est manifestement le fichier spécial correspondant à la partition ou au périphérique concerné. Le <<none>> de la dernière ligne ne doit pas vous étonner, en fait le répertoire /proc est utilisé de façon interne par le kernel : il ne contient par réellement des fichiers, ceux qui peuvent y apparaître ne sont que des images d'informations contenues dans le kernel.
La deuxième colonne est évidemment le point de montage (le répertoire sur lequel
on va accrocher la partition). Remarquez la ligne contenant le mot <<swap>>
dans la deuxième colonne : elle désigne en fait la partition de mémoire virtuelle,
qui ne se monte pas (voir 2.1.4 page
pour plus de détail
concernant la mémoire virtuelle).
La troisième colonne est le type de système de fichiers contenus sur la partition ou le périphérique concerné. <<ext2>> est le système Ext2Fs, utilisé normalement par Linux ; <<vfat>> est le système de fichiers de Windows 95/98 ; <<iso9660>> est utilisé par les CD-ROMs. Notez le <<auto>> dans la ligne commençant par /dev/fd0, qui correspond au lecteur de disquette : en effet une disquette peut être formatée selon différents systèmes de fichiers, <<auto>> demande au système de deviner quel est le type présent sur une disquette que l'on voudrait monter.
Suivent quelques options, pour préciser de quelle manière la partition doit être traitée. Le mot <<defaults>> indique qu'il faut appliquer les options par défaut, ce qui inclu entre autre le montage automatique : toutes les partitions ainsi marquées seront montées avec la simple commande :
mount -a
Cette commande est exécutée durant le démarrage du système (voyez 2.6.7
page
pour plus de détails sur la commande mount).
Par contre, les lignes commençant par /dev/fd0 et /dev/cdrom comportent un <<noauto>> : ces périphériques ne seront pas montés automatiquement, ce qui est après tout normal pour le lecteur de disquettes et le lecteur de CD-ROMs... Dans ces lignes apparaît également le mot <<user>>, qui indique qu'un utilisateur quelconque est autorisé à monter le périphérique en question : normalement, seul root est autorisé à monter les systèmes de fichiers. Consultez la page man de mount pour plus de détails concernant ces options.
L'avant-dernière colonne comporte un chiffre, 0 (zéro) ou 1. La fonction exacte de ce chiffre est un peu obscure, nous n'en parlerons pas davantages. Remarquez toutefois qu'il n'est à 1 que pour les systèmes de fichiers effectivement montés au démarrage.
La dernière colonne, enfin, indique dans quel ordre les systèmes de fichiers doivent être vérifiés (c'est-à-dire contrôler qu'ils sont intègres et en bon état) lors du redémarrage. Normalement, le système de fichier abritant le répertoire racine doit toujours être vérifié en premier, d'où le 1 dans la première ligne. Les autres peuvent être vérifiés dans n'importe quel ordre, mais après la racine : ils sont tous à 2. Un 0 (zéro) indique que le système de fichiers n'a pas besoin d'être vérifié : c'est le cas naturellement pour la disquette et le CD-ROM, mais aussi pour la mémoire virtuelle et le <<pseudo-système de fichiers>> contenu dans /proc. Cela concerne également les systèmes de fichiers de type différent que Ext2Fs, car a priori Linux ne sait pas les vérifier (bien que cela ne soit pas toujours vrai).