Script rc debian
Introduction aux runlevel et a ses variantes debian:
Si:
- /etc/default/rcS contient CONCURRENCY=none -> démarrage sysV classique
- sinon si les fichiers /etc/init.d/.depend.{boot,start,stop} existent et sont non vide -> démarrage "startpar -M"
- tout les autres cas, -> démarrage sysV classique
Quelque soit le système de démarrage le cas particulier du runlevel 1 est source de confusion:
- Appeler le runlevel 1 (avec init 1 par exemple) passe le système en mono utilisateur dans le runlevel S.
- Appeler le runlevel S (avec init S par exemple) est une erreur, certains scripts vont être lancés en double.
Voila comment je m'explique les choses pour tenter d'y voir clair:
- Pour passer en mode mono utilisateur, la porte d'entrée est le runlevel 1.
- Pour montrer qu'on est bien en mode mono utilisateur (single mode) le système passe en runlevel S (S pour "single")
Les scripts de démarrages ont pour moi une autre signification:
- rc1.d contient les script start/stop permettant d'aller vers le runlevel 1 ou d'en sortir
- rcS.d contient les script de démarrage de la machine elle même. Ces scripts ne sont censé être lancés qu'une seule fois par démarrage.
Bref le S de "runlevel S" et "rcS.d" n'a rien a voir:
- runlevel S -> on est en mode mono utilisateur (single), c'est ce qu'on constate avec la commande "runlevel"
- rcS.d -> les scripts "start" (ou "boot" dans le cas du démarrage startpar) lancés une seule fois par démarrage.
-> lorsqu'on désigne le "runlevel" S avec update-rc.d ou insserv (dans les entêtes) il s'agit en fait des scripts de démarrage ("start") donc rcS.d ou .depend.boot
Type: |
SystèmeV |
startpar -M |
---|---|---|
Fichiers utilisés |
/etc/inittab /etc/default/rcS /etc/init.d/rc | |
/etc/rc?.d/* |
/etc/init.d/.depend.{boot,start,stop} /etc/rc?.d/* (lorsque insserv est appelé avec /etc/init.d/ (sans script en particulier) | |
schéma (workflow) |
Manipulation des scripts de démarrage
- sous Lenny et avant: update-rc.d
- sous squeeze (et sans doute après): insserv
Ces 2 commandes ont en commun d'ajouter le lien symbolique sur le script désigné (qui doit être présent dans init.d) dans les repertoire rcN.d et de ne pas supprimer de lien symbolique sans que ce soit explicitement demandé à l'invocation de la commande. Bref, tant que les paquets utilisent l'une ou l'autre des commande pour installer leur script de démarrage, ils vont remplir les repertoires rcN.d mais ne vont pas enlever de script.
- système mis à jour:
- update-rc.d ne met à jour que les repertoires rcN.d
- insserv met à jour les repertoires rcN.d et les fichiers .depend.*
- rang dans l'ordre d'exécution
- update-rc.d loge tout le monde au rang 20 par défaut et sinon, il faut lui préciser le rang (entre 01 et 99)
- insserv se sert des entêtes de script pour calculer le rang, que ce soit à l'ajout ou la suppression. D'autre part, ayant la notion des dépendance, insserv va refuser de supprimer un lien symbolique si le script qu'il désigne est nécessaire à l'exécution d'un script encore en place.
- "runlevel" concerné
- update-rc.d loge par défaut les scripts de démarrage dans rc{2,3,4,5}.d et les scripts d'arrêt dans rc{1,0,6}.d. Sinon, pareil faut tout lui préciser en ligne de commande
- insserv se sert des entêtes de script pour savoir dans quel runlevel installer le script. Attention pour le démarrage "makefile like" avec startpar, il n'y a pas de différence entre les runlevel 2,3,4,5 (assimilé à "start") et entre les runlevel 1,0,6 (assimilés à "stop"). Pour ces 3 derniers, il y a une différence de taille sur l'action faite par init après (1-> sulogin, 0 -> halt, 6-> reboot) mais les scripts exécutés sont les mêmes.
- lorsque insserv est appelé avec /etc/init.d/ il met à jour les fichiers .depend.{boot,start,stop} en fonction
cas concret
suppression d'un service au démarrage
J'ai installé un serveur LDAP pour faire des essais, mais j'aimerais assez qu'il ne se lance pas automatiquement sur ma machine de travail voila mes options:
- sous Lenny: je supprime le(s) liens symboliques dans les rc{2,3,4,5}.d manuellement ou avec un sysv-rc-conf
- sous Squeeze (version sysv classique): idem
- sous Squeeze (version "makefile like"): idem + "insserv /etc/init.d/" pour mettre à jour les .depend.{boot,start,stop}
- sous Squeeze variante /etc/insserv/override/:
- copiez le script /etc/init.d/slapd dans /etc/insserv/override/ ne gardez que l'entete du script dans laquelle vous modifiez les runlevel.
- lancez "insserv -r slapd" (sinon insserv ne touchera pas aux scripts de demarrage deja en place)
- lancez "insserv /etc/init.d/slapd"
Voila a quoi ressemble un entete:
#! /bin/sh ### BEGIN INIT INFO # Provides: skeleton # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Example initscript # Description: This file should be used to construct scripts to be # placed in /etc/init.d. ### END INIT INFO
modification de l'ordre de lancement d'un service
- sous Lenny: on refait les liens à la main, ou avec update-rc.d et une bonne palanquée de paramètres.
- sous Squeeze: comme plus haut, on fait une copie dans override et cette fois on modifie les champs
- Required-Start (ce qui doit déjà être lancé avant ce script)
- Required-Stop (ce qui doit encore être là avant d'arrêter ce script)
- si besoin on peut creer un fichier du même nom que le script dans /etc/insserv.conf.d/ dans lequel on peut modifier quelques "étiquettes" de dépendance ($truc)
ajout d'un script de démarrage
- dans /etc/init.d/ se trouve un fichier "skeleton" a utiliser comme modèle, ensuite
- Lenny: update-rc.d ...
- Squeeze: insserv mon_nouveau_script