
Ce tuto est consacré au démarrage et à l'arrêt du système pour les systèmes Unix de type System V.
Table des matières
I.Processus de démarrage 1
(1)Niveau d'exécution : runlevel 1
(2)Les scripts de démarrage Runlevel Changes 2
II.Fichier de script de démarrage 2
III.Détermination du runlevel en cours 4
IV.Gérer le démarrage des services 4
(1)Généralités 4
(2)Sous Fedora 5
(a)Lister les services démarrables 5
(b)Ajouter un service pour lancement au démarrage 5
(c)Activer ou désactiver un service au démarrage 5
(d)Gestion de la commande avec setup 5
(e)Gestion manuel du lancement des services 5
(f)Lister les services existants 5
(3)Sous Debian 6
(a)Gestion manuel du lancement des services 6
(b)Lister les services démarrables 6
(c)Ajouter un service pour lancement au démarrage 6
(d)Désactiver un service au démarrage 6
(e)Lister les services existants 6
(4)Manuellement (à éviter) 7
Tout d'abord, le fichier /etc/inittab est lu par le système pour déterminer le « runlevel » ou niveau de démarrage. Ces niveaux vont de 0 à 6 et ont une signification qui peut dépendre de la distribution. Dans le cas de Fedora, il y a les niveaux suivant :
0 : arrêt
1 : mode maintenance (mono utilisateur)
2 : mode console multi utilisateur sans NFS
3 : mode console multi utilisateur avec NFS
5 : démarrage en mode graphique multi utilisateur
6 : redémarrage
Ensuite, un certain
nombre de scripts sont exécutés en fonction de ce
runlevel.
En regardant attentivement, on s'aperçoit que
le script /etc/rc.d/rc est
exécuté avec comme paramètre le runlevel.
Ce script va exécuter
tous les programmes se trouvant dans /etc/rc.d/rcX.d
ou X représente
le runlevel.
Dans ces répertoires,
on trouve des liens symboliques vers des scripts du dossier
/etc/init.d/. Ce dernier
dossier contient les scripts de démarrage des services. Cela
permet de n'avoir qu'une seule copie d'un script de démarrage.
On trouve dans les répertoires /etc/rc.d/rcX.d deux types de scripts : ceux commençant par « S » et ceux commençant par « K ». Seuls les scripts commençant par S sont exécutés au démarrage. A l'arrêt du système si pour un service donné un script commençant par S existe il est exécuté avec l'argument « stop », sinon le script commençant par K est exécuté. Ceci permet de ne pas supprimer les scripts que l'on ne veut plus exécuter, mais simplement les renommer. Du fait que ce sont des liens, on ne garde qu'une seule copie des scripts de démarrage réel.
Le numéro se
trouvant après le S indique l'ordre dans lequel vont être
exécutes les scripts, plus le numéro est petit, plus il
est prioritaire et sera donc exécuté avant les autres.
Ceci s'explique par le fait que, par exemple, la couche réseau
doit être démarrée avant de démarrer le
démon apache (serveur web).
L'ensemble de ces scripts est utilisé aussi bien lors du démarrage, au quel cas ils reçoivent l'argument start, qu'à l'extinction du système avec l'argument stop.
De plus en général, un troisième argument « status » permet de connaître l'état du service lancé par ce script.
Enfin, un dernier fichier est exécuté : /etc/rc.d/rc.local.
Ainsi, lorsque l'on veut paramétrer un nouveau service, deux solutions sont envisageables, soit créer un nouveau script daemon (basé sur un script existant) et faire des liens au besoin dans les dossiers /etc/rc.d/rcX.d, soit ajouter des lignes dans le fichier rc.local. Il est bien évident
que la première solution est la meilleure.
Voici un script de démarrage permettant de démarrer un service :
Contenu du fichier /etc/rc.d/init.d/démon
#!/bin/bash
#
# démon Startup script for nom du démon
#
# chkconfig: liste_runlevel_démarrage ordre_démarrage ordre_arrêt
# description: Desciption du démon
# processname: nom_exécutable_démon
# config: /chemin/fichier/config_principal_démon
# pidfile: /var/run/démon.pid
# Source function library : daemon, pidofproc...
. /etc/rc.d/init.d/functions
# Path to the server binary, and short-form for messages.
Serv=/chemin/démon
prog=nom_court_démon
pidfile=/var/run/démon.pid
lockfile=/var/lock/subsys/démon.lock
RETVAL=0
# fonction pour lancer le démon
start() {
echo -n $"Starting $prog: "
#on lance le démon en arrière plan
daemon $serv
RETVAL=$?
#on crée le fichier de lock
echo
[ $RETVAL = 0 ] && touch ${lockfile}
#on inscrit le pid dans le fichier
pidofproc $serv > ${pidfile}
return $RETVAL
}
# fonction pour arrêter le démon
stop() {
echo -n $"Stopping $prog: "
#stopper le processus en douceur (SIGINT ou autre)
killproc $serv
RETVAL=$?
#on supprime le fichier du pid et du lock
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
# On regarde ce que l'on nous demande de faire au démon
case "$1" in
start)
start
;;
stop)
stop
;;
status)
#routine par défaut pour obtenir le status du démon
#affiche des choses comme « en cours d'exécution »
status $serv
RETVAL=$?
;;
restart)
stop
start
;;
*)
echo $"Usage: $prog {start|stop|restart|status|help}"
exit 1
esac
exit $RETVAL
Pour déterminer le runlevel que l'on utilise on peut exécuter la commande runlevel en root.
Le runlevel courant se trouve dans le fichier /etc/inittab à la ligne id:x:initdefault: où x est le niveau de démarrage. Si par exemple, on trouve id:5:initdefault: c'est que l'on est au niveau 5.
Les scripts de démarrage sont installés dans /etc/init.d/. Pour démarrer ou arrêter un service à un certain niveau d'exécution (runlevel), il suffit d'ajouter des liens symboliques du type SXXdémon ou KXXdémon afin d'indiquer que le démon démon doit être démarré ou arrêté après les services dont le XX est inférieur à celui-ci.
Les scripts S servent à démarrer les services.
Les scripts K servent à arrêter les services.
La commande chkconfig --list sert à lister l'arrêt et le démarrage des services et à gérer le démarrage et l'arrêt des services.
Pour ajouter le service démon au démarrage :
[root]# chkconfig --add démon
[root]# chkconfig démon on
Pour activer et désactiver un service :
[root]#
chkconfig --level niveau démon on
[root]#
chkconfig --level niveau démon off
On peut aussi activer et désactiver un service par la commande setup :
[root]# setup
-> Services systèmes...
La commande service permet d'exécuter un script de démarrage pour lancer/stopper/interroger un service en fonction du niveau de démarrage :
[root]# service <nom_du_service> start
[root]# service <nom_du_service> stop
[root]# service <nom_du_service> restart
[root]# service <nom_du_service> status
On peut aussi obtenir l'état de tous les services existants :
[root]# service --list-all
On peut exécuter directement les scripts de démarrage des services depuis le dossier /etc/init.d/ pour démarrer/arrêter/redémarrer/connaître l'état d'un service :
[root]# /etc/init.d/<nom_du_service> start
[root]# /etc/init.d/<nom_du_service> stop
[root]# /etc/init.d/<nom_du_service> restart
[root]# /etc/init.d/<nom_du_service> status
Pour lister les services démarrables au niveau d'exécution Niveau, il suffit de taper :
[root]# ls -l /etc/rc.d/rc.Niveau/S*
La commande update-rc.d permet de gérer le lancement des services à certains niveaux d'exécution :
démarrage en NN ième position aux niveaux par défaut (2345) et arrêt en NN ième position aux niveaux par défaut (016)
[root]# update-rc.d nom_démon defaults NN
démarrage en NN ième position aux niveaux par défaut (2345) et arrêt en MM ième position aux niveaux par défaut (016)
[root]# update-rc.d nom_démon defaults NN MM
démarrage en NN ième position aux niveaux 2, 3 et 5 et arrêt en MM ième position aux niveaux par 0 et 6
[root]# update-rc.d nom_démon start NN 2 3 5 . stop MM 0 6 .
La commande update-rc.d permet de gérer le lancement des services à certains niveaux d'exécution. Pour désactiver un service :
au niveau Niveau :
[root]# update-rc.d nom_démon stop 20 Niveau .
totalement :
[root]# update-rc.d -f nom_démon remove
Note : certains services peuvent contenir un paramètre de démarrage dans leur fichier /etc/default/démon.
Pour lister les services existants, on pourra simplement lister le contenu du dossier /etc/init.d :
[root]# ls -l /etc/init.d/
Ce qui pourrait se faire manuellement par (il faut cependant connaître l'ordre de démarrage des démons pour ne pas, par exemple, lancer un service TCP/IP avant de lancer les interfaces réseaux) :
[root]#
ln -s /etc/init.d/démon
/etc/rc.d/rcX.d/Sxxdémon
[root]#
ln -s /etc/init.d/démon /etc/rc.d/rcX.d/Kxxdémon
[root]#
rm /etc/rc.d/rcX.d/Sxxdémon
[root]#
rm /etc/rc.d/rcX.d/Kxxdémon
Donc pour changer l'état de démarrage d'un service :
[root]# mv /etc/rc.d/rc5.d/Sxxmyqld /etc/rc.d/rc5.d/Kxxmyqld
[root]# mv /etc/rc.d/rc5.d/Kxxmyqld /etc/rc.d/rc5.d/Sxxmyqld