Comment fonctionne le démarrage des services lors du boot ?
Introduction
Lorsque votre serveur dédié démarre, il passe par plusieurs phases d'initialisation appelées
runlevels. C'est lors de ces phases que les différents services du serveur sont démarrés automatiquement. Les services cruciaux tels que la configuration du réseau sont démarrés à ce momentlà, mais également les applications telles que le serveur Apache, le serveur de mails ou le serveur MySQL.
Principe
Il existe 5 niveaux importants de runlevel :
-
runlevel 0 : appelé lors de l'arrêt du système,
-
runlevel 1 : appelé lorsque le système démarre en mono-utilisateur,
-
runlevel 3 : appelé lorsque le système démarre en multi-utilisateur,
-
runlevel 5 : appelé lorsque le système démarre en multi-utilisateur, mode graphique,
-
runlevel 6 : appelé lorsque le système reboote.
Chaque service peut être configuré pour être démarré ou arrêté automatiquement lorsque le serveur entre dans l'un ou l'autre des runlevels. Le principe est de créer des liens dans le répertoire correspondant au runlevel qui pointeront vers le script de démarrage correspondant. Prenons par exemple
named, le serveur DNS. Ce service est configuré pour démarrer en
runlevel 3 et pour être stoppé en
runlevel 0.
Le script de démarrage se trouve dans
/etc/init.d/:
[root@julien root]# ls -al /etc/init.d/named
-rwxr-xr-x 1 root root 2281 jui 13 2004 /etc/init.d/named
Un lien est créé dans
/etc/rc3.d/ (répertoire contenant les fichiers utilisés en runlevel 3) :
[root@julien root]# ls -al /etc/rc3.d/S13named
lrwxrwxrwx 1 root root 22 oct 2 15:55 /etc/rc3.d/S13named -> ../init.d/named
Et un autre dans
/etc/rc0.d/ (répertoire contenant les fichiers utilisés en runlevel 0) :
[root@julien root]# ls -al /etc/rc0.d/K45named
lrwxrwxrwx 1 root root 15 oct 2 15:37 /etc/rc0.d/K45named -> ../init.d/named
En runlevel 3, le lien
S13named appelle donc automatiquement la commande
/etc/init.d/named start. En runlevel 0, le lien
K45named appelle automatiquement la commande
/etc/init.d/named stop.
La lettre
S du lien indique une action de démarrage, la lettre
K une action d'arrêt. Le numéro a également son importance, car il indique l'ordre dans lequel sont démarrés les services. Il est en effet impossible de démarrer le serveur DNS avant le service qui gère la configuration réseau.
Les serveurs dédiés OVH démarrent en
runlevel 3. Par habitude, lorsque vous souhaitez qu'un service démarre automatiquement au boot du serveur, il suffit de le configurer pour les runlevels 2, 3, 4 et 5.
Adminitration
Fort heureusement, la
Redhat fournit un outil qui va nous simplifier la vie. Il s'agit de
chkconfig. Cet outil va nous permettre de lister la configuration actuelle et de la modifier très simplement.
- Lister les services configurés au démarrage du serveur
Pour lister la configuration actuelle, vous devez utiliser cette commande :
[root@julien root]# /sbin/chkconfig --list
webmin 0:Arrêt 1:Arrêt 2:Marche 3:Marche 4:Arrêt 5:Marche 6:Arrêt
atd 0:Arrêt 1:Arrêt 2:Arrêt 3:Marche 4:Marche 5:Marche 6:Arrêt
watchdog 0:Arrêt 1:Arrêt 2:Arrêt 3:Arrêt 4:Arrêt 5:Arrêt 6:Arrêt
syslog 0:Arrêt 1:Arrêt 2:Marche 3:Marche 4:Marche 5:Marche 6:Arrêt
Ou, pour plus de précision, un seul service (ici mysql) :
[root@julien root]# /sbin/chkconfig --list mysql
mysql 0:Arrêt 1:Arrêt 2:Marche 3:Marche 4:Marche 5:Marche 6:Arrêt
Le résultat indique tous les niveaux de runlevel et l'action à entreprendre pour chaque démarrage ou arrêt du service.
- Modifier le comportement d'un service au démarrage
Pour modifier les actions sur un plusieurs runlevel, la commande à utiliser est du type
/sbin/chkconfig --level
Prenons par exemple le cas d'un serveur MySQL qui ne démarre pas automatiquement au boot du serveur. Un listage de la configuration montre que ce service n'est pas configuré pour démarrer automatiquement. Il suffit alors de modifier la configuration pour le mettre automatiquement en service lors du prochain démarrage du serveur :
[root@julien root]#/sbin/chkconfig --list mysql
mysql 0:Arrêt 1:Arrêt 2:Arrêt 3:Arrêt 4:Arrêt 5:Arrêt 6:Arrêt
[root@julien root]# /sbin/chkconfig --level 2345 mysql on
[root@julien root]# /sbin/chkconfig --list mysql
mysql 0:Arrêt 1:Arrêt 2:Marche 3:Marche 4:Marche 5:Marche 6:Arrêt
Ajouter un service au démarrage
Cet utilitaire est également capable de prendre en charge un nouveau service à partir de son fichier de démarrage et de créer automatiquement tous les liens nécessaires.
Prenons par exemple le fichier de démarrage de MySQL :
[root@julien root]# cat /etc/init.d/mysql
#!/bin/sh
# Copyright Abandoned 1996 TCX DataKonsult
? AB & Monty Program KB & Detron HB
# This file is public domain and comes with NO WARRANTY of any kind
# MySQL daemon start/stop script.
# Usually this is put in /etc/init.d (at least on machines SYSV R4 based
# systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/K01mysql.
# When this is done the mysql server will be started when the machine is
# started and shut down when the systems goes down.
# Comments to support chkconfig on RedHat
? Linux
# chkconfig: 2345 90 20
# description: A very fast and reliable SQL database engine.
La ligne intéressante est celle-ci:
chkconfig: 2345 90 20, car elle permet la configuration automatique du service MySQL à l'aide de l'outil
chkconfig. En l'utilisant, le démarrage de MySQL sera automatiquement ajouté aux runlevels 2, 3, 4 et 5 avec le numéro de séquence 90 pour une action de démarrage et le numéro de séquence 20 pour une action d'arrêt.
Par exemple :
[root@julien root]# /sbin/chkconfig --add mysql
Vérifions que tout est correct :
[root@julien root]# /sbin/chkconfig --list mysql
mysql 0:Arrêt 1:Arrêt 2:Marche 3:Marche 4:Marche 5:Marche 6:Arrêt
[root@julien root]# ls -al /etc/rc3.d/S90mysql
lrwxr-xr-x 1 root root 15 fév 12 16:17 /etc/rc3.d/S90mysql -> ../init.d/mysql
[root@julien root]# ls -al /etc/rc0.d/K20mysql
lrwxr-xr-x 1 root root 15 fév 12 16:17 /etc/rc0.d/K20mysql -> ../init.d/mysql
Supprimer un service au démarrage
Une fois que la gestion d'un service a été ajoutée à chkconfig, il reste dans la liste tant que le fichier de démarrage existe. Par contre, il est possible de supprimer l'action de démarrage dans tous les runlevels en une seule fois.
Par exemple :
[root@julien root]# /sbin/chkconfig --del mysql
Vérifions que tout a été supprimé :
[root@julien root]# /sbin/chkconfig --list mysql
mysql 0:Arrêt 1:Arrêt 2:Arrêt 3:Arrêt 4:Arrêt 5:Arrêt 6:Arrêt
[root@julien root]# ls -al /etc/rc3.d/S90mysql
ls: /etc/rc3.d/S90mysql: Aucun fichier ou répertoire de ce type