Différences entre versions de « Script rc debian »

De Cliss XXI
Sauter à la navigation Sauter à la recherche
imported>VincentAdolphe
 
(3 versions intermédiaires par un autre utilisateur non affichées)
Ligne 1 : Ligne 1 :
Introduction aux runlevel et a ses variantes debian:
+
== Introduction aux runlevel et a ses variantes debian: ==
  
 
Si:
 
Si:
* /etc/default/rcS contient CONCURRENCY=none -> démarrage sysV classique
+
* '''/etc/default/rcS''' contient CONCURRENCY=none ou '''/etc/init.d/.legacy-bootordering''' existe -> démarrage sysV classique
 
* sinon si les fichiers /etc/init.d/.depend.{boot,start,stop} existent et sont non vide -> démarrage "startpar -M"
 
* 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
 
* tout les autres cas, -> démarrage sysV classique
 +
 +
Tapez '''dpkg-reconfigure sysv-rc''' pour passer du ''systemV'' classique au système ''makefile like'' après la mise a jour d'une Lenny en Squeeze par exemple. Ce script va vérifier la viabilité de la migration et vous dire ce qui coince, si ça coince.
  
 
Quelque soit le système de démarrage le cas particulier du runlevel 1 est source de confusion:
 
Quelque soit le système de démarrage le cas particulier du runlevel 1 est source de confusion:
Ligne 46 : Ligne 48 :
 
||
 
||
 
  /etc/init.d/.depend.{boot,start,stop}
 
  /etc/init.d/.depend.{boot,start,stop}
/etc/rc?.d/* (lorsque insserv est appelé avec /etc/init.d/ (sans script en particulier)
+
(lorsque insserv est appelé avec /etc/init.d/
 +
(sans nommer un script en particulier)
 +
/etc/rc?.d/*
 +
 
 
|-
 
|-
 
||
 
||
Ligne 77 : Ligne 82 :
 
** 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.
 
** 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
 
** lorsque insserv est appelé avec /etc/init.d/ il met à jour les fichiers .depend.{boot,start,stop} en fonction
 
  
 
=== cas concret ===
 
=== cas concret ===
Ligne 85 : Ligne 89 :
 
* sous Lenny: je supprime le(s) liens symboliques dans les rc{2,3,4,5}.d manuellement ou avec un sysv-rc-conf
 
* 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 sysv classique): idem
* sous Squeeze (version "makefile like"): idem + "insserv /etc/init.d/" pour mettre à jour les .depend.{boot,start,stop}
+
* sous Squeeze (version "makefile like"): idem + '''insserv''' pour mettre à jour les .depend.{boot,start,stop}
 
* sous Squeeze variante /etc/insserv/override/:
 
* 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.
+
** copiez le script /etc/init.d/slapd dans /etc/insserv/override/ ne gardez que l'entete dans laquelle vous modifiez les runlevel.
 
** lancez "insserv -r slapd" (sinon insserv ne touchera pas aux scripts de demarrage deja en place)
 
** lancez "insserv -r slapd" (sinon insserv ne touchera pas aux scripts de demarrage deja en place)
 
** lancez "insserv /etc/init.d/slapd"
 
** lancez "insserv /etc/init.d/slapd"
  
 
Voila a quoi ressemble un entete:
 
Voila a quoi ressemble un entete:
 
+
<pre>
 
  #! /bin/sh
 
  #! /bin/sh
 
  ### BEGIN INIT INFO
 
  ### BEGIN INIT INFO
Ligne 104 : Ligne 108 :
 
  #                    placed in /etc/init.d.
 
  #                    placed in /etc/init.d.
 
  ### END INIT INFO
 
  ### END INIT INFO
 
+
</pre>
 
==== modification de l'ordre de lancement d'un service ====
 
==== 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 Lenny: on refait les liens à la main, ou avec update-rc.d et une bonne palanquée de paramètres.
Ligne 116 : Ligne 120 :
 
** Lenny: update-rc.d ...
 
** Lenny: update-rc.d ...
 
** Squeeze: insserv mon_nouveau_script
 
** Squeeze: insserv mon_nouveau_script
 +
 +
Par exemple on veut creer un script drbd-mount qui doit etre lancer
 +
* apres drbd
 +
* avant lxc
 +
 +
D'autre part on veut etre sur que drbd est toujours la avant d'arreter lxc
 +
 +
# on cree le script a partir de /etc/init.d/skeleton on specifie "Required-Start drbd"
 +
# on cree une entete "override" pour /etc/init.d/lxc dans laquelle on specifie
 +
** "Required-Start drbd-mount"
 +
** "Required-Stop drbd"
 +
 +
On insere le script (d'abord un dry run pour etre sur):
 +
insserv -n drbd-mount
 +
Puis une fois que c'est bon
 +
insserv drbd-mount

Version actuelle datée du 7 mars 2012 à 21:16

Introduction aux runlevel et a ses variantes debian:

Si:

  • /etc/default/rcS contient CONCURRENCY=none ou /etc/init.d/.legacy-bootordering existe -> 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

Tapez dpkg-reconfigure sysv-rc pour passer du systemV classique au système makefile like après la mise a jour d'une Lenny en Squeeze par exemple. Ce script va vérifier la viabilité de la migration et vous dire ce qui coince, si ça coince.

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

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 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 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

Par exemple on veut creer un script drbd-mount qui doit etre lancer

  • apres drbd
  • avant lxc

D'autre part on veut etre sur que drbd est toujours la avant d'arreter lxc

  1. on cree le script a partir de /etc/init.d/skeleton on specifie "Required-Start drbd"
  2. on cree une entete "override" pour /etc/init.d/lxc dans laquelle on specifie
    • "Required-Start drbd-mount"
    • "Required-Stop drbd"

On insere le script (d'abord un dry run pour etre sur):

insserv -n drbd-mount

Puis une fois que c'est bon

insserv drbd-mount