8.2. Le processus init

Le programme init est le processus doté de l'ID de processus 1. Il est responsable de l'initialisation du système de la manière requise. init joue un rôle spécial. Il est démarré directement par le kernel et résiste au signal 9 qui, en règle générale, détruit les processus. Tous les autres programmes sont soit démarrés directement par init, soit par l'un de ses processus enfants.

init est configuré de manière centralisée dans le fichier /etc/inittab où les niveaux d'exécution sont définis (reportez-vous à la Section 8.2.1, « Niveaux d'exécution »). Ce fichier indique également les services et les démons disponibles dans chacun des niveaux. En fonction des entrées de /etc/inittab, plusieurs scripts sont exécutés par init. Pour des raisons de clarté, ces scripts, appelés scripts init, résident tous dans le répertoire /etc/init.d (reportez-vous à la Section 8.2.2, « Scripts d'initialisation »).

Le processus de démarrage et d'arrêt du système est intégralement géré par init. De ce point de vue, le kernel peut être considéré comme un processus d'arrière-plan dont la tâche est de prendre en charge tous les autres processus et de régler l'horloge de l'unité centrale et l'accès matériel en fonction des requêtes en provenance d'autres programmes.

8.2.1. Niveaux d'exécution

Sous Linux, les niveaux d'exécution définissent le mode de démarrage du système et les services disponibles sur le système en cours d'exécution. Après l'amorçage, le système démarre conformément à la ligne initdefault du fichier /etc/inittab. Il s'agit généralement du niveau d'exécution 3 ou 5 Reportez-vous au Tableau 8.1, « Niveaux d'exécution disponibles ». Il est également possible de spécifier le niveau d'exécution au moment de l'amorçage (à l'invite d'amorçage, par exemple). Tous les paramètres qui ne sont pas directement évalués par le kernel sont transmis à init.

Tableau 8.1. Niveaux d'exécution disponibles

Niveau d'exécution

Description

0

Arrêt du système

S

Mode mono-utilisateur ; à partir de l'invite d'amorçage, uniquement avec disposition de clavier américaine

1

Mode mono-utilisateur

2

Mode multi-utilisateur local sans réseau distant (NFS, etc.)

3

Mode multi-utilisateur intégral avec réseau

4

Non utilisé

5

Mode multi-utilisateur intégral avec réseau et gestionnaire d'affichage X (KDM, GDM ou XDM)

6

Redémarrage du système

[Important]éviter le niveau d'exécution 2 avec une partition montée par NFS

Vous ne devez pas utiliser le niveau d'exécution 2 si votre système monte la partition /usr via NFS. Comme le service NFS n'est pas disponible dans le niveau d'exécution 2 (mode multi-utilisateur local sans réseau distant), le système peut avoir un comportement inattendu en l'absence de fichiers programme ou de bibliothèques.

Pour modifier le niveau d'exécution alors que le système est en cours d'exécution, entrez la commande telinit et le numéro correspondant comme argument. Seul l'administrateur système est autorisé à effectuer cette opération. La liste suivante résume les principales commandes dans la zone du niveau d'exécution.

telinit 1 ou shutdown now

Le système passe en mode mono-utilisateur. Ce mode est utilisé pour la maintenance du système et les tâches d'administration.

telinit 3

Tous les programmes et services essentiels (notamment réseau) sont démarrés et les utilisateurs standard sont autorisés à se loguer et à utiliser le système sans environnement graphique.

telinit 5

L'environnement graphique est activé. En règle générale, un gestionnaire d'affichage du type XDM, GDM ou KDM est démarré. Si la fonction de login automatique est activée, l'utilisateur local est logué au gestionnaire de fenêtres présélectionné (GNOME, KDE ou autre).

telinit 0 ou shutdown -h now

Le système s'arrête.

telinit 6 ou shutdown -r now

Le système s'arrête et redémarre.

Le niveau d'exécution 5 est le niveau d'exécution par défaut dans toutes les installations standard SUSE Linux. Les utilisateurs sont invités à se loguer avec une interface graphique ou l'utilisateur par défaut a été automatiquement logué. Si le niveau d'exécution par défaut est 3, le système X Window doit être configuré correctement, comme le décrit le Chapitre 14, Système X Window, avant que le niveau d'exécution puisse passer à 5. Dans ce cas, vérifiez le bon fonctionnement du système en entrant telinit 5. Si tout fonctionne comme prévu, vous pouvez utiliser YaST pour définir sur 5 le niveau d'exécution par défaut.

Généralement, deux événements se produisent lorsque vous changez de niveau d'exécution. Tout d'abord, les scripts d'arrêt du niveau d'exécution en cours sont lancés, ce qui entraîne la fermeture de certains programmes essentiels au niveau d'exécution en cours. Ensuite, des scripts de démarrage du nouveau niveau d'exécution sont démarrés. Dans la plupart des cas, un certain nombre de programmes sont démarrés. Voici par exemple ce qui se produit lors du passage du niveau d'exécution 3 à 5 :

  1. L'administrateur (root) demande à init de passer à un autre niveau d'exécution en entrant la commande telinit 5.

  2. init consulte son fichier de configuration (/etc/inittab) et détermine qu'il doit démarrer /etc/init.d/rc avec le nouveau niveau d'exécution comme paramètre.

  3. La commande rc appelle alors tous les scripts d'arrêt du niveau d'exécution actuel, mais uniquement ceux qui ne sont associés à aucun script de démarrage dans le nouveau niveau d'exécution. Dans cet exemple, il s'agit de tous les scripts situés dans /etc/init.d/rc3.d (l'ancien niveau d'exécution était 3) et qui commencent par un K. Le nombre qui suit le K indique l'ordre de démarrage car certaines dépendances doivent être prises en compte.

  4. Les derniers éléments à démarrer sont les scripts de démarrage du nouveau niveau d'exécution. Il sont situés, dans cet exemple, dans /etc/init.d/rc5.d et commencent par un S. La même procédure concernant l'ordre de démarrage s'applique ici.

Lorsque vous passez au même niveau d'exécution que le niveau d'exécution actuel, init vérifie uniquement /etc/inittab afin d'y détecter d'éventuelles modifications et lance les étapes correspondantes, par exemple, pour démarrer un getty sur une autre interface. Vous pouvez obtenir la même fonction via la commande telinit q.

8.2.2. Scripts d'initialisation

Il existe deux types de scripts dans /etc/init.d :

Les scripts exécutés directement par init

Ce n'est le cas qu'au cours du processus d'amorçage ou si un arrêt immédiat du système a lieu (panne de courant ou si un utilisateur appuie sur les touches Ctrl-Alt-Suppr). L'exécution de ces scripts est définie dans /etc/inittab.

Les scripts exécutés indirectement par init

Ces scripts sont exécutés lors d'un changement du niveau d'exécution et appellent toujours le script maître /etc/init.d/rc, qui garantit l'ordre correct des scripts correspondants.

Tous les scripts sont situés dans /etc/init.d. Les scripts exécutés au démarrage sont appelés via des liens symboliques à partir de l'emplacement /etc/init.d/boot.d. Les scripts de changement du niveau d'exécution sont appelés par des liens symboliques à partir d'un des sous-répertoires (/etc/init.d/rc0.d à /etc/init.d/rc6.d), pour des raisons de clarté et pour éviter les scripts en double s'ils sont utilisés dans plusieurs niveaux d'exécution. Comme chaque script peut être exécuté comme un script de démarrage et d'arrêt, ces scripts doivent savoir interpréter les paramètres start et stop. Ils doivent également reconnaître les options restart, reload, force-reload et status. Ces différentes options sont décrites dans le Tableau 8.2, « Options possibles des scripts d'initialisation ». Les scripts exécutés directement par init ne disposent pas de ces liens. Ils sont exécutés indépendamment à partir du niveau d'exécution, si nécessaire.

Tableau 8.2. Options possibles des scripts d'initialisation

Option

Description

start

Démarre le service.

stop

Arrête le service.

restart

Si le service est en cours d'exécution, cette option l'arrête, puis le redémarre. S'il n'est pas en cours d'exécution, elle le démarre.

reload

Recharge la configuration sans arrêter et redémarrer le service.

force-reload

Recharge la configuration si le service prend cette opération en charge. Sinon, effectue la même action que l'option restart.

status

Affiche l'état actuel du service.

Des liens dans chaque sous-répertoire propre au niveau d'exécution permettent d'associer des scripts à différents niveaux d'exécution. Lors de l'installation ou de la désinstallation des paquetages, ces liens sont ajoutés et supprimés à l'aide du programme insserv (ou du script /usr/lib/lsb/install_initd qui appelle ce programme). Pour plus d'informations, reportez-vous à la page de manuel sur insserv(8).

Une brève introduction aux scripts d'amorçage et d'arrêt lancés en premier ou en dernier lieu, respectivement, suit ainsi qu'une explication du script de maintenance.

boot

Exécuté lors du démarrage du système directement à l'aide d'init. Il est indépendant du niveau d'exécution choisi et est exécuté une seule fois. Les systèmes de fichiers proc et pts sont montés et le démon blogd de journalisation des informations d'amorçage est activé. Si le système est amorcé pour la première fois après une mise à jour ou une installation, la configuration initiale du système est démarrée.

Le démon blogd est un service démarré en tout premier lieu par boot et rc. Il est arrêté dès la fin des actions déclenchées par les scripts ci-dessus (exécutant un certain nombre de sous-scripts, par exemple). Le démon blogd écrit toutes les sorties d'écran dans le fichier journal /var/log/boot.msg, mais uniquement si et lorsque /var est monté en lecture-écriture. Sinon, blogd met en tampon toutes les données d'écran jusqu'à ce que /var soit disponible. Pour plus d'informations, reportez-vous à la page de manuel sur blogd(8).

Le script boot est également chargé du démarrage de tous les scripts situés dans /etc/init.d/boot.d et dont le nom commence par S. Les systèmes de fichiers sont contrôlés et les périphériques de bouclage (loop) sont configurés, si nécessaire. L'horloge système est également définie. Si une erreur survient au cours du contrôle et de la réparation automatiques du système de fichiers, l'administrateur système peut intervenir après avoir entré le mot de passe root. Le script boot.local est exécuté en dernier lieu.

boot.local

Entrez ici les commandes supplémentaires à exécuter au démarrage avant de changer de niveau d'exécution. Ce script est comparable au fichier AUTOEXEC.BAT sur les systèmes DOS.

boot.setup

Ce script est exécuté lors du passage du mode mono-utilisateur à tout autre niveau d'exécution. Il est chargé d'un certain nombre de paramétrages de base, tels que la disposition du clavier et l'initialisation des consoles virtuelles.

halt

Ce script est exécuté uniquement lors du passage au niveau d'exécution 0 ou 6. Ici, il est exécuté comme équivalent de halt ou de reboot. L'arrêt ou le redémarrage du système dépend de la manière dont halt est appelé.

rc

Ce script appelle les scripts d'arrêt appropriés du niveau d'exécution actuel et les scripts de démarrage du nouveau niveau d'exécution sélectionné.

Vous pouvez créer vos propres scripts et les intégrer facilement dans le modèle décrit ci-dessus. Pour plus d'informations sur le formatage, l'assignation de noms et l'organisation des scripts personnalisés, reportez-vous aux spécifications établies par les normes LSB et les pages de manuel sur init, init.d et insserv. Reportez-vous également aux pages de manuel sur startproc et killproc.

[Warning]scripts d'initialisation défectueux susceptibles d'arrêter votre système

Les scripts init défectueux peuvent bloquer votre machine. Modifiez ces scripts avec le plus grand soin et, si possible, soumettez-les à des tests importants dans un environnement multi-utilisateur. Vous trouverez des informations utiles sur les scripts init à la Section 8.2.1, « Niveaux d'exécution ».

Pour créer un script init personnalisé pour un programme ou un service donné, utilisez comme modèle le fichier /etc/init.d/skeleton. Enregistrez une copie de ce fichier sous son nouveau nom et modifiez les noms de programme et de fichier, les chemins correspondants, ainsi que les autres informations nécessaires. Vous pouvez également améliorer le script en y ajoutant vos propres parties afin que les actions correctes soient déclenchées par la procédure d'initialisation.

Le bloc INIT INFO situé au début du script est une partie obligatoire qui doit être modifiée. Reportez-vous à l'Exemple 8.1, « bloc INIT INFO minimal ».

Exemple 8.1. bloc INIT INFO minimal

### BEGIN INIT INFO 
# Provides:          TOTO 
# Required-Start:    $syslog $remote_fs 
# Required-Stop:     $syslog $remote_fs 
# Default-Start:     3 5 
# Default-Stop:      0 1 2 6 
# Description:       Démarre TOTO pour autoriser XY et fournir YZ 
### END INIT INFO 
    

Sur la première ligne du bloc INFO, après Provides:, indiquez le nom du programme ou service contrôlé par ce script init. Sur les lignes Required-Start: et Required-Stop:, indiquez tous les services qui doivent être démarrés ou arrêtés avant le démarrage ou l'arrêt du service même. Ces informations sont utilisées ultérieurement pour générer la numérotation des noms de script tels qu'ils figurent dans les répertoires de niveau d'exécution. Après Default-Start: et Default-Stop:, indiquez les niveaux d'exécution dans lesquels le service doit automatiquement être démarré ou arrêté. Enfin, pour Description:, fournissez une brève description du service en question.

Pour créer des liens à partir des répertoires de niveau d'exécution (/etc/init.d/rc?.d/) vers les scripts correspondants dans /etc/init.d/, entrez la commande insserv nouveau nom de script. Le programme insserv évalue l'en-tête INIT INFO pour créer les liens nécessaires aux scripts de démarrage et d'arrêt dans les répertoires de niveau d'exécution (/etc/init.d/rc?.d/). Le programme s'occupe également de l'ordre correct de démarrage et d'arrêt de chaque niveau d'exécution en incluant les numéros nécessaires dans les noms figurant dans ces liens. Si vous préférez qu'un outil graphique crée ces liens, utilisez l'éditeur de niveaux d'exécution fourni par YaST, conformément aux instructions de la Section 8.2.3, « Configuration des services système (niveau d'exécution) avec YaST ».

Si un script déjà présent dans /etc/init.d/ doit être intégré au modèle de niveau d'exécution existant, créez les liens dans les répertoires du niveau d'exécution directement avec insserv ou en activant le service correspondant dans l'éditeur de niveaux d'exécution de YaST. Les modifications sont appliquées lors du redémarrage suivant. Le nouveau service est démarré automatiquement.

Ne définissez pas ces liens manuellement. Si une information est incorrecte dans le bloc INFO, des problèmes surviennent lorsque insserv est exécuté ultérieurement pour un autre service. Le service ajouté manuellement sera supprimé lors de la prochaine exécution de la commande insserv.

8.2.3. Configuration des services système (niveau d'exécution) avec YaST

Après avoir démarré ce module YaST en sélectionnant YaST+Système+Services système (niveau d'exécution), vous voyez apparaître la liste de tous les services disponibles et l'état actuel de chaque service (désactivé ou activé). Choisissez d'utiliser le module en mode simple ou en mode Experts. Lemode simple par défaut suffit dans la plupart des cas. La colonne de gauche indique le nom du service, la colonne du milieu renseigne sur l'état actuel et la colonne de droite donne une brève description. En ce qui concerne le service sélectionné, une description plus détaillée apparaît au bas de la fenêtre. Pour activer un service, sélectionnez-le dans le tableau et cliquez sur Activer. Procédez de même pour désactiver un service.

Figure 8.1. Services système (niveau d'exécution)

Services système (niveau d'exécution)

Pour effectuer un contrôle détaillé sur les niveaux d'exécution dans lesquels un service est démarré ou arrêté, ou pour modifier le niveau d'exécution par défaut, sélectionnez d'abord le mode Experts. Le niveau d'exécution par défaut actuel ou « initdefault » (niveau d'exécution dans lequel le système démarre par défaut) est affiché en haut. En règle générale, le niveau d'exécution par défaut d'un système SUSE Linux est le niveau d'exécution 5 (mode multi-utilisateur intégral avec réseau et X). Le niveau d'exécution 3 (mode multi-utilisateur intégral avec réseau) offre une alternative appropriée.

Cette boîte de dialogue YaST permet de sélectionner l'un des niveaux d'exécution (répertoriés dans le Tableau 8.1, « Niveaux d'exécution disponibles ») comme nouveau niveau d'exécution par défaut. Utilisez également le tableau de cette fenêtre pour activer ou désactiver un à un des services et des démons. Ce tableau liste les services et les démons disponibles, indique s'ils sont actuellement activés sur votre système et, dans ce cas, pour quels niveaux d'exécution. Après avoir sélectionné l'une des lignes avec la souris, cochez les cases représentant les niveaux d'exécution (B, 0, 1, 2, 3, 5, 6 et S) pour définir les niveaux d'exécution dans lesquels le service ou le démon sélectionné doit s'exécuter. Au départ, le niveau d'exécution 4 n'est pas défini pour permettre la création d'un niveau d'exécution personnalisé. Une brève description du service ou du démon sélectionné est fournie sous le tableau.

À l'aide des options Démarrer/Arrêter/Actualiser, indiquez si un service doit être activé. L'option Actualiser l'état vérifie l'état actuel. L'option Définir/Remettre à zéro permet d'appliquer les modifications au système ou de restaurer les paramètres en vigueur avant le démarrage de l'éditeur de niveaux d'exécution. Sélectionnez Terminer pour enregistrer les nouveaux paramètres sur le disque.

[Warning]paramètres de niveau d'exécution incorrects susceptibles d'endommager votre système

Le système peut devenir instable du fait de paramètres de niveau d'exécution incorrects. Avant d'appliquer les modifications, assurez-vous absolument que vous en connaissez les conséquences.