next up previous contents
Next: 2.6 Commandes <<avancées>> Up: 2. Premières courses Previous: 2.4 Les variables d'environnement [YB]

Sous-sections

  
2.5 Fichiers particuliers

2.5.1 /etc/profile, /etc/bashrc et paramètres personnalisés

2.5.2 Les runlevels2.29 [YB]

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 :

Mis à part les deux précédents, chaque distribution Linux dispose des autres niveaux comme elle l'entend. Nous prendrons ici l'exemple d'une distribution RedHat, mais ce qui suit est aisément transposable aux autres distributions.

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 :

Le choix du niveau par défaut, et les actions associées à chaque niveau, sont inscrits dans un seul fichier, qui est décrit ci-dessous.

  
2.5.2.1 Le fichier /etc/inittab [YB]

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ù :

id
est une suite de un à quatre caractères, utilisés pour identifier la ligne : on ne doit pas retrouver deux fois la même suite sur deux lignes différentes.
niveau(x)
indique quels sont les niveaux concernés par la ligne. Par exemple, '124' indique que la ligne ne concerne que les niveaux 1, 2 et 4.
action
précise de quelle manière la ligne doit être interprétée, c'est-à-dire dans quel cadre elle s'inscrit ou de quelle façon traiter les autres champs.
programme
est le programme à exécuter, dans le cadre précisé précédemment, pour les niveaux donnés.
Le plus simple pour bien comprendre ces différentes notions, est d'examiner ensemble un exemple réel. Le fichier suivant est extrait d'un système RedHat Linux, version 5.2 :




width


#

# 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


width

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.

2.5.2.2 Les scripts de démarrage [YB]

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) :

Le sous-répertoire important est init.d : il contient tous les scripts de configuration des différents services qui doivent être lancés. En général, le nom du fichier exécutable correspondant à un certain service est assez explicite : par exemple, le fichier httpd lance (ou arrête, cela dépend des paramètres) le service qui permet à votre machine Linux de se comporter comme un serveur de pages HTML sur le Word Wide Web.

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

2.5.2.3 Contrôle et adaptation du démarrage [YB]

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.

2.5.3 Montage automatique des partitions : /etc/fstab [YB]

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 :




width


/dev/hdb5        /                ext2    defaults          1 1

/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


width

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



Footnotes

...runlevels2.27
niveaux d'exécution, en français
...runlevels2.28
niveaux d'exécution, en français
...runlevels2.29
niveaux d'exécution, en français
...champs2.30
fields en anglais
...
De daemon en anglais. En fait, services et démons sont deux choses différentes : le démon est le processus mémoire qui, par son exécution, rend un certain service (comme la gestion du courrier électronique). Mais la confusion est pour l'instant sans grande conséquence.
...
pour start, démarrer en français
...
pour kill, littérallement tuer, ici plutôt arrêter
...démons>>2.31
... 'S2.32
... 'K2.33

next up previous contents
Next: 2.6 Commandes <<avancées>> Up: 2. Premières courses Previous: 2.4 Les variables d'environnement [YB]
kafka.fr@linux-france.org