Init

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

Le programme /sbin/init est le premier lancé au démarrage (après le noyau et l'initrd). C'est lui qui va gérer le démarrage du système. Il est lancé par l'utilisateur root.

Runlevels

L'init debian est basé sur System V, qui utilise plusieurs de fonctionnements (runlevels). Ils sont numérotés de 0 à 6. Leur signification varie en fonction de la distribution. Sous debian, ils sont répartis par défaut comme tels :

  • 0 : arrêt
  • 1 : Mode maintenance « single-user »
  • 2 à 5 : système multi-user
  • 6 : Redémarrage

La commande runlevel indique le runlevel courant. On peut passer d'un runlevel à l'autre avec la commande telinit. Par exemple :

# telinit 0

arrête la machine

Le fichier /etc/inittab

Il contient les informations qui vont être lues au démarrage du système. Chaque entrée dans ce fichier est sous la forme : id:runlevels:action:process

  • id : un code unique généralement de deux caractères
  • runlevels: la liste des runlevels ou l'action sera exécutée
  • process : le chemin vers le programme ou script qui sera exécuté.
  • action : plusieurs actions sont possibles, notamment :
    • initdefault : indique le runlevel par défaut. On peut passer outre cette directive en ajoutant le paramètre init=<runlevel> au noyau (par exemple init=3 pour démarrer au runlevel 3).
    • once: lance le process une seule fois
    • wait : exécute le process et attend la fin de son exécution
    • respawn : exécute le process sans cesse (on le relance dès qu'il s'est terminé)

Scripts de démarrage

Syntaxe

Les scripts de démarrage des services sont dans le répertoire /etc/init.d/

Ils sont construits de la façon suivante :

  • /etc/init.d/nom_du_service start : lance le service
  • /etc/init.d/nom_du_service stop : stoppe le service
  • /etc/init.d/nom_du_service reload : relance le service (prend en compte la nouvelle configuration)
  • /etc/init.d/nom_du_service restart : relance complètement le service (équivaut à stop, puis start)
  • /etc/init.d/nom_du_service status : affiche le status (facultatif)

Pour être utilisables, un script doit avoir le droit d'éxécution et doit avoir au début des commentaires sous la forme :

### BEGIN INIT INFO
# Provides:          nom_du_service
# Required-Start:    dépendance1 dépendance2
# Required-Stop:     dépendance1 dépendance2
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Une courte description
# Description:       Une description plus détaillée du service
### END INIT INFO

Pour plus d'infos, voir la section sur les tags LSB dans le wiki debian.org : http://wiki.debian.org/LSBInitScripts?highlight=%28BEGIN%29%7C%28INIT%29%7C%28INFO%29

Activation

Cette commande permet de créer les liens symboliques dans les répertoires /etc/rcX.d, ou X représente le runlevel. Ces liens sont nommés par une lettre (S ou K), suivi d'un numéro et du nom du service.

Les lettres S (start) et K (kill) servent à déterminer si le service doit être démarré ou éteint (on verra donc essentiellement des liens « K » dans /etc/rc0.d et /etc/rc6.d) Les numéros servent à donner une priorité (les scripts ayant le numéro le plus élevés sont exécutés en dernier).

Les liens dans /etc/rcS.d sont éxecutés à chaque démarrage, pour tous les runlevels.

On peut gérer ses liens avec la commande update-rc.d. La commande sysv-rc-conf (apt-get install sysv-rc-conf) permet de faire la même chose dans une interfaces curses.

Attention : Si vous modifiez des liens installés par debian, il peuvent réapparaitre lors de la mise à jour du paquet concerné. La plupart des scripts init installés par debian « sourcent » un fichier /etc/default/nom_du_service. Ce fichier contient généralement une variable permettant de ne pas démarrer le service, même si le script est lancé, ce qui permet de désactiver le démarrage d'un service au boot de façon pérenne.

Petits ajustements au démarrage

Lorsqu'on veut simplement lancer une commande ou un petit script à chaque démarrage, il n'est pas nécessaire d'écrire un script init complet. Le fichier /etc/rc.local est exécuté à chaque boot, pour tous les runlevels, après les scripts init.

Attention, comme les scripts init, ils doit rendre la main après son exécution.

Ressources

  • Pages de manuel : init(8), inittab(5), update-rc.d(8), sysv-rc-conf(8), insserv(8)
  • Le fichier /etc/init.d/skeleton montre un exemple de script init