Personnaliser le démarrage de Linux

Gestion des utilisateurs Configurer une imprimante en local
Configuration diverse du système

Présentation

Etat de marche

Le fichier /etc/inittab

Passage à l'état de marche 3

Passage à un état de marche inférieur

Lancement d'un service personnalisé

Présentation

Cette page a pour objet de vous présenter le principe de démarrage d'un système Linux, comment les process sont lancés et dans quel ordre. En comprenant mieux ce principe on peut alors envisager de configurer le système pour, par exemple, lancer des services personnalisés.

Etat de marche

Sous LINUX (et UNIX d'une manière générale) on peut définir un état de marche qui correspond à un certain nombre de services (logiciels) qui seront lancés. Par exemple dans une université, on pourra définir un certain état de marche pour les élèves et un autre pour les professeurs, la différence entre les deux sera que les professeurs bénéficieront de plus de services.
A tout moment Linux se trouve dans un état de marche particulier, on peut très bien passer d'un état de marche à un autre, ce qui aura pour effet d'arrêter ou de lancer d'autres services. Un certain nombre d'état de marche ont été prédéfini sur le système, on peut les voir dans le fichier /etc/inittab. Voici ce qu'on peut trouver au début du fichier:

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

Six états de marche ont été prédéfinis. Etat de marche 0 pour réaliser un arrêt (shutdown) de la machine, 1 pour rentrer en mode single user (uniquement root de connecté), 2 en mode multiutilisateur sans NFS, 3 le mode multiutilisateur complet, 4 inutilisé, 5 mode multiutilisateur avec X lancé automatiquement, et 6 pour rebooter la machine.
initdefaut définit l'état de marche par défaut de la machine en fonctionnement normal, par défaut sur une RedHat 5.2 c'est 3. A noter que si vous mettiez 5, X se lancerez automatiquement sans avoir à lancer startx.
Pour passer d'un état de marche à un autre, on tape:

init 0

Pour arrêter la machine par exemple.

A noter que pour arriver à l'état de marche 3, le système passe successivement à l'état de marche 0, 1, 2 et 3. En état à l'état de marche 3, pour s'arrêter (état de marche 0), on passe successivement à l'état de marche 3, 2, 1 et 0.

Le fichier /etc/inittab

Au démarrage du système lilo lance le noyau /boot/vmlinuz-(numéro de version), qui exécute /sbin/init,qui est le premier process à être lancé , il va lire séquentiellement le fichier /etc/inittab pour lancer les autres services (process). Voici le fichier /etc/inittab avec les commentaires associés:
 
id:3:initdefault: Etat de marche par défaut 3
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
au démarrage c'est le  script /etc/rc.d/rc.sysinit qui va être lancé au premier, il permet d'initialiser le système, il réalise les tâches suivantes (liste non exhaustive): initialisation du réseau, de la swap, vérification des disques (fsck éventuel), montage des disques,  chargement des modules, .... . En fait les messages que vous voyez au boot sont générés par ce fichier.
l0:0:wait:/etc/rc.d/rc 0 Au démarrage on passe d'abord à l'état de marche 0, lancement de tous les services qui sont dans /etc/rc.d/rc0.d et qui commencent par S (pour Start). Vous constaterez que ce sont des liens vers des scripts qui sont dans /etc/rc.d/init.d. Le wait signifie que tant que tous les scripts de lancement ne se sont pas achevés, on ne va pas plus loin dans le fichier.
l1:1:wait:/etc/rc.d/rc 1 Passage ensuite à l'état de marche 1, lancement des services commençant par S dans le répertoire /etc/rc.d/rc1.d
l2:2:wait:/etc/rc.d/rc 2 Passage ensuite à l'état de marche 2, lancement des services commençant par S dans le répertoire /etc/rc.d/rc2.d
l3:3:wait:/etc/rc.d/rc 3 Passage ensuite à l'état de marche 3, lancement des services commençant par S dans le répertoire /etc/rc.d/rc3.d, comme c'est l'état de marche par défaut, on ne lit pas les 3 lignes suivantes.
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# Things to run in every runlevel.
ud::once:/sbin/update
A chaque passage à un état de mache on exécute une fois (once) la commande /sbin/update qui permet de vider les "dirty buffers", faire un man update pour plus de détails.
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
Ca c'est important, c'est ici qu'on définit que si on presse sur les touches ctrl+alt+del, on déclenche un shutdown (arrêt de la machine (-t3 dans 3 secondes, -r redémarrage après arrêt, bizarrement now c'est à dire arrêt immédiat alors qu'on a définit -t3 précédemment)
# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly. 
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
Pour ceux qui ont un onduleur, quand celui-ci envoit un signal d'alarme en cas de coupure du secteur.
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
C'est marqué dans le commentaire, annule le shutdown si le courant revient au niveau du onduleur.
# Run gettys in standard runlevels
1:12345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
Lancement de console minimaliste suivant l'état de marche (défini en début de ligne). respawn signifie que le process sera relancé si jamais il est interrompu.

# Run xdm in runlevel 5
x:5:respawn:/opt/kde/bin/kdm -nodaemon
Si on passe à l'état de marche 5, lancement de KDE automatiquement.

Passage à l'état de marche 3

Quand on passe à l'état de marche 3, au démarrage, le système va dans le répertoire /etc/rc.d/rc3.d on y trouve:

lrwxrwxrwx   1 root     root           17 mar 27 17:58 K20rusersd -> ../init.d/rusersd
lrwxrwxrwx   1 root     root           15 mar 27 17:58 K20rwhod -> ../init.d/rwhod
lrwxrwxrwx   1 root     root           16 mai  1 15:30 K30mcserv -> ../init.d/mcserv
lrwxrwxrwx   1 root     root           15 mar 27 17:58 K50snmpd -> ../init.d/snmpd
lrwxrwxrwx   1 root     root           16 mar 27 17:58 K55routed -> ../init.d/routed
lrwxrwxrwx   1 root     root           16 mar 27 17:58 K87ypbind -> ../init.d/ypbind
lrwxrwxrwx   1 root     root           16 mar 27 17:58 K96pcmcia -> ../init.d/pcmcia
lrwxrwxrwx   1 root     root           17 mar 27 17:58 S01kerneld -> ../init.d/kerneld
lrwxrwxrwx   1 root     root           17 mar 27 17:58 S10network -> ../init.d/network
lrwxrwxrwx   1 root     root           17 mar 27 17:58 S11portmap -> ../init.d/portmap
lrwxrwxrwx   1 root     root           15 mar 27 17:58 S15nfsfs -> ../init.d/nfsfs
lrwxrwxrwx   1 root     root           16 mar 27 17:58 S20random -> ../init.d/random
lrwxrwxrwx   1 root     root           16 mar 27 17:58 S30syslog -> ../init.d/syslog
lrwxrwxrwx   1 root     root           13 mar 27 17:58 S40atd -> ../init.d/atd
lrwxrwxrwx   1 root     root           15 mar 27 17:58 S40crond -> ../init.d/crond
lrwxrwxrwx   1 root     root           14 mar 27 17:58 S50inet -> ../init.d/inet
lrwxrwxrwx   1 root     root           15 mar 27 17:58 S55named -> ../init.d/named
lrwxrwxrwx   1 root     root           13 mar 27 17:58 S60lpd -> ../init.d/lpd
lrwxrwxrwx   1 root     root           13 mar 27 17:58 S60nfs -> ../init.d/nfs
lrwxrwxrwx   1 root     root           18 mar 27 17:58 S75keytable -> ../init.d/keytable
lrwxrwxrwx   1 root     root           18 mar 27 17:58 S80sendmail -> ../init.d/sendmail
lrwxrwxrwx   1 root     root           13 mar 27 17:58 S85gpm -> ../init.d/gpm
lrwxrwxrwx   1 root     root           15 mar 27 17:58 S85httpd -> ../init.d/httpd
lrwxrwxrwx   1 root     root           15 mar 27 17:58 S85sound -> ../init.d/sound
lrwxrwxrwx   1 root     root           13 mar 27 17:58 S91smb -> ../init.d/smb
lrwxrwxrwx   1 root     root           14 mar 27 17:58 S95innd -> ../init.d/innd
lrwxrwxrwx   1 root     root           19 mar 27 17:58 S99linuxconf -> ../init.d/linuxconf
lrwxrwxrwx   1 root     root           11 mar 27 17:15 S99local -> ../rc.local

Le système va d'abord lancer repérer tous les noms de liens qui commencent par S (start) ce sont les services à lancer, puis les chiffres croissants, il va donc repérer en premier S01kerneld qui pointe vers le script /etc/rc.d/init.d/kerneld qui a cette tête là:

#! /bin/sh

# chkconfig: 12345 01 98
# description: The kerneld daemon automatically loads kernel modules \
#              as the system needs them. This deamon should always \
#              be kept running, or many features of the system will \
#              stop working.
# processname: kerneld
# config: /etc/conf.modules autoreload

# Source function library.
. /etc/rc.d/init.d/functions

# See how we were called.
case "$1" in
  start)
    [ -f /var/lock/subsys/kerneld ] && exit 0

    echo -n "Starting kerneld services: "
    daemon kerneld

    echo
    touch /var/lock/subsys/kerneld
    ;;
  stop)
    echo -n "Stopping kerneld services: "
    killproc kerneld

    echo
    rm -f /var/lock/subsys/kerneld
    ;;
  status)
    status kerneld
    ;;
 restart)
    $0 stop
    $0 start
    ;;
 reload)
    killall -HUP kerneld
    ;;
 *)
    echo "Usage: kerneld {start|stop|status|restart}"
    exit 1
esac

exit 0

Ce script va être appelé avec comme argument start ce qui aura pour effet ici de lancer le service kerneld, à noter que le message "Starting kerneld services:" devrait apparaître au boot (ou du moins dans la console) lors du passage à l'état de marche 3.
Après S01kerneld c'est S10network qui va être appelé et ainsi de suite.

Passage à un état de marche inférieur

Supposons que l'administrateur veuille passer de l'état de marche 3 à l'état de marche 1 (single user) pour réaliser des tâches d'administration. Le système va jeter un coup d'oeil dans /etc/rc.d/rc3.d et exécutez tous les scripts dont les noms des liens commencent par K et ceci dans l'ordre croissant. Ce qui donne (voir liste plus haut),  K20ruserd exécuté en premier puis, K20rwhod et ainsi de suite, tous ces scripts sont appelés avec l'argument stop pour stopper les services. Le système va ensuite dans le répertoire /etc/rc.d/rc2.d et appelez les scripts dont le nom du lien commence par K, pareil ensuite pour le répertoire /etc/rc.d/rc.1.d.

Lancement d'un service personnalisé

Si vous voulez configurer votre système en lançant automatiquement vos propres applis au démarrage, vous devez d'abord écrire un script totod dans /etc/rc.d/init.d qui aura cette tête là (en admettant que votre service se nomme totod) :
 
 
#! /bin/sh
 Source function library. 
. /etc/rc.d/init.d/functions
Script qui définit les fonctions killproc, daemon, status, ...
# See how we were called.
case "$1" in
Vérification de l'argument (start pour lancer votre service et stop pour l'arrêter)
start)
    [ -f /var/lock/subsys/totod ] && exit 0
Si le service est lancé on crée un fichier lock, on vérifie ici si le fichier existe pour ne pas lancer le service une deuxième fois.
    echo -n "Starting totod services: "
    daemon totod
Lancement de votre appli (daemon est défini dans /etc/rc.d/init.d/functions)
    echo
    touch /var/lock/subsys/totod
Création du fichier lock
    ;;
stop)
   echo -n "Stopping totod services: "
En cas d'arrêt du service, on affiche le message
    killproc totod Arrêt de totod (killproc défini dans /etc/rc.d/init.d/functions)
   echo
   rm -f /var/lock/subsys/totod
   ;;
Suppression du fichier lock
status)
   status totod
  ;;
Pour avoir l'état de l'appli (status défini dans functions)
restart)
   $0 stop
   $0 start
   ;;
Pour relancer l'appli, à noter que $0 correspond au nom du script
reload)
   killall -HUP totod
 ;;
Pour recharger l'appli (voir killall dans functions)
*)
  echo "Usage: totod {start|stop|status|restart}"
  exit 1
esac
Si on appelle le script sans faire appel aux arguments start, stop, status ou restart, rappel de ces arguments.
 exit 0

On admet maintenant que vous vouliez lancer votre service uniquement à partir de l'état de marche 3 et l'arrêter quand vous voulez passer à l'état de marche 2 et inférieur.
Pour cela vous allez créer un lien dans /etc/rc.d/rc3.d :

ln -s /etc/rc.d/init.d/totod /etc/rc.d/rc3.d/S900totod

Votre service sera donc celui qui sera lancé en dernier au passage à l'état de marche 2 à 3. Ensuite tapez:

ln -s /etc/rc.d/init.d/totod /etc/rc.d/rc2.d/K900totod

Votre service sera donc celui qui sera arrêté en dernier au passage de l'état de marche 3 à 2. Rappelons que quand le lien commence par S le script est appelé avec l'argument start et par K avec l'argument stop.

Retour haut de la page