[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ next ]

Le manuel de programmation de dpkg
Chapter 13 - Configuration d'init


13.1 Introduction à la structure de init.d

Le répertoire /etc/init.d contient les scripts démarrés par init quand l'état du niveau d'exécution est changé (voir init(8)).

Ces scripts sont référencés par des liens symboliques dans les répertoires /etc/rcn.d. Quand on change le niveau d'exécution, init recherche dans le répertoire /etc/rcn.d le script à exécuter, où n est le niveau d'exécution à atteindre.

Le nom des liens ont tous la forme Smmscript ou Kmmscriptmm correspond à 2 chiffres et script est le nom du script (il doit être le même que le nom du script réel dans /etc/init.d). Quand init change le niveau d'exécution, d'abord les cibles des liens dont les noms commencent par K sont exécutées, chacune avec un seul argument stop, suivi par les scripts préfixés par un S, chacun avec l'argument start. Les liens K sont responsables de l'arrêt des services et les liens S du démarrage des services du nouveau niveau d'exécution.

Par exemple, si nous passons du niveau 2 au niveau 3, init exécutera d'abord tous les scripts préfixés par K qu'il trouve dans /etc/rc3.d et ensuite tous les scripts préfixés par S. Les liens commençant par K amèneront le fichier référencé à s'exécuter avec l'argument stop, et les liens S avec un argument start.

Les 2 chiffres mm sont utilisés pour décider dans quel ordre démarrer et arrêter les choses. Les liens exécutent leurs scripts dans un ordre croissant. Par exemple les scripts K20 seront exécutés avant les scripts K30. Cela est utilisé quand certains services doivent démarrer avant d'autres. Par exemple, le serveur de nom bind doit être démarré avant le serveur de news inn afin qu'inn puisse positionner ses listes d'accès. Dans ce cas, le script qui démarre bind doit avoir un plus petit numéro que le script qui lance inn pour démarrer d'abord:

         /etc/rc2.d/S17bind
         /etc/rc2.d/S70inn

13.2 Ecrire des scripts init.d

Les paquets peuvent et doivent placer les scripts dans /etc/init.d pour démarrer ou arrêter les services au démarrage ou pendant un changement de niveau d'exécution. Ces scripts doivent être nommées /etc/init.d/package, et ils doivent accepter un argument: start signifiant de démarrer le service, ou stop pour arrêter le service. Facultativement, ils peuvent supporter l'argument reload qui provoque le rechargement de la configuration.

Les scripts doivent s'assurer qu'ils se comporteront judicieusement, s'ils sont invoqués avec l'option start quand le service est déjà en action, ou stop s'il ne l'est pas, et qu'ils ne tuent pas fortuitement les process des utilisateurs.

La meilleure façon de réaliser cela est d'utiliser habituellement le programme start-stop-deamon.

Ces scripts ne doivent pas échouer de façon obscure quand les fichiers de configuration persistent alors que le paquet a été enlevé, par défaut dpkg laisse les fichiers de configuration dans le système après que le paquet ait été enlevé. C'est seulement quand il est exécuté avec l'option --purge, que dpkg enlèvera les fichiers de configuration. Cependant, tu dois inclure une instruction de test au début du script:

         test -f programme-exécuté-dans-le-script || exit 0

13.3 Gestion des liens rcn.d - update-rc.d

Un programme update-rc.d est fourni pour faciliter la maintenance des paquets dans l'orchestration de la création et de la destruction des liens symboliques de /etc/rcn.d à partir de leurs scripts postinst et postrm.

Tu dois utiliser ce script pour réaliser les changements dans /etc/rcn.d et jamais inclure n'importe quels liens symboliques /etc/rcn.d dans l'archive réel.

Par défaut, update-rc.d démarrera les services dans chacun des niveaux d'état d'exécution multi-utilisateur (2, 3, 4, et 5) et les arrêtent dans le niveau halt (0), niveau mono-utilisateur (1), et le niveau reboot (6). L'administrateur système a l'opportunité de personnaliser les niveaux d'exécution en ajoutant, en déplaçant, ou en enlevant simplement les liens symboliques dans /etc/rcn.d.

Pour obtenir le comportement par défaut de ton paquet, mets dans ton script postinst:

          update-rc.d package default >/dev/null

et dans ton script postrm:

          if [ purge = "$1" ]; then
              update-rc.d package remove >/dev/nul
          fi

Ceci utilisera un numéro de séquence par défaut à 20. Si on ne tient pas compte de quand ou dans quel ordre le script est exécuté, utilise le numéro par défaut. Sinon, tu dois demander un numéro au mainteneur du paquet sysvinit ou dans la mailing list debian-devel, ils t'aideront à en choisir un.

Pour plus d'information sur l'utilisation d'update-rc.d, consulte la page de manuel update-rc.d(8).


13.4 Initialisation du démarrage - rc.boot

Il y a un autre répertoire /etc/rc.boot qui contient les scripts qui sont exécutés une fois par démarrage. Ce dispositif est fournie pour l'initialisation de matériels périphériques, nettoyage de fichiers, et ainsi de suite.

Par exemple, le paquet kbd fournit un script pour l'initialisation de la configuration clavier, la fonte et le mode de la console.

Les fichiers dans /etc/rc.boot ne doivent pas être liés dans /etc/init.d. Ceux sont des scripts à part entière.

rc.boot ne doit pas être utilisé pour démarrer des processus à but général, et activités similaires. Ceci doit être fait en utilisant la structure rcn.d, ci-dessus, afin que les services puissent être démarrés et arrêtés proprement quand le niveau d'exécution change ou quand la machine doit être éteinte ou rebootée.


13.5 Remarques

Ne pas inclure les liens symboliques de /etc/rcn.d/* dans l'archive .deb du système de fichier! Cela amènera des problèmes! Tu dois les créer avec update-rc.d, comme ci-dessus.

Ne pas include les liens symboliques de /etc/rcn.d/* dans la liste de fichiers de configuration de dpkg! Cela provoquera des erreurs! Il faut cependant inclure les scripts /etc/init.d dans les fichiers de configuration.


13.6 Exemple

Le paquet DNS bind (serveur de nom) veut être sûr que le serveur de nom soit démarré dans les niveaux d'exécution multi-utilisateurs, et proprement arrêté avec le système. Il met un script dans /etc/init.d nommé bind. Comme indiqué ci-dessous, le script interprète l'argument reload, pour envoyer le signal HUP au serveur de nom (provoquant le rechargement de sa configuration). De cette façon, l'utilisateur peut taper /etc/init.d/bind reload pour recharger la configuration du serveur de nom.

        #!/bin/sh
        # Original version par Robert Leslie <rob@mars.org>, edited by iwj
        test -x /usr/sbin/named || exit 0
        case "$1" in
          start)
            test- f /etc/named.boot -a -f /var/name/boot.options || exit 0
            start-stop-deamon --start --verbose --exec /usr/sbin/named
            ;;
          stop)
            start-stop-deamon --stop --verbose \
               --pidfile /var/run/named.pid --exec /usr/sbin/named
            ;;
          reload)
            start-stop-deamon --stop --signal 1 --verbose \
               --pidfile /var/run/named.pid --exec /usr/sbin/named
            ;;
          *)
            echo "Usage: /etc/init.d/bin {start|stop|reload}" >&2
            exit 1
            ;;
        esac
        exit 0

Un autre exemple, sur lequel les scripts de /etc/init.d peuvent se baser, se trouve dans /etc/init.d/skeleton.

Si ce paquet se contente de la configuration par défaut donné par update-rc.d, c'est à dire un numéro d'ordre égal à 20 et mise en oeuvre dans tous les niveaux d'exécution, il est possible d'écrire dans le script postinst:

         update-rc.d bind default >/dev/null

Et dans son script postrm, la suppression du lien quand le paquet est détruit:

         if [ purge = "$1" ]; then
             update-rc.d acct remove >/dev/null
         fi

[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ next ]

Le manuel de programmation de dpkg

15 avril 2002
D. Cure cure@cnam.fr
C. Jacolot jacolot@ubolib.univ-brest.fr