Initialisation systéme

vendredi 19 septembre 2008
par  Jerome ROBERT
popularité : 15%

B. Initialisation du système

Le noyau :

  • démarre le processus swapper, PID=0,

  • exécute le script /sbin/pre_init_rc,

  • lance /sbin/rc, qui va utiliser le fichier /etc/inittab pour initialiser le système.

 

1. Le script /sbin/pre_init_rc

Sert à vérifier l"intégrité du FS root avant son montage.

 

2. Les états de marche

Lorsqu"il fonctionne, un serveur se trouve toujours dans un état de marche (run-level en anglais) caractérisé par un chiffre (de 0 à 6). Ces états de marche servent à contrôler, à l"aide du fichier /etc/inittab, les applications à démarrer ou à stopper par le processus init.

L’état de marche cible par défaut (3 dans l’exemple) est défini dans le fichier /etc/inittab :

init:3:initdefault

 

Il est possible de connaître l’état de marche courant du système :

 

 

Chaque ligne du fichier /etc/inittab est construite sur le modèle suivant :

syntaxe :

id :etat(s)_de_marche :action :commande

id étiquette unique (1 à 4 caractéres)
etat(s)_de_marche liste des états de marche pour lesquels la ligne sera considérée. Si vide, la ligne concerne tous les états de marche.
action  mot clé précisant les modalités d’exécution du programme (parmi : initdefault, wait, boot, bootwait, respawn, ondemand, off, sysinit, powerfail, powerwait, once)
commande  programme à exécuter

Lorsque le noyau démarre le processus init, celui-ci lit le fichier /etc/inittab afin de déterminer l’état de marche cible ; puis exécute chaque ligne du fichier à traiter pour l’état de marche concerné :

  • traite d’abord les actions sysinit,

  • traite celles contenant les actions boot ou bootwait ,

  • cherche l’entrée initdefault,

  • puis traite les autres.

 

En cas de changement ultérieur de niveau de marche, les entrées sysinit, boot et bootwait ne sont pas réexaminées.

Les principales commandes exécutées sont :

/sbin/ioinitrc initialise les structures de données associées aux périphériques. Si nécessaire, les fichiers spéciaux associés aux nouveaux périphériques sont créés.
/sbin/bcheckrc vérifie l’intégrité des FS et lance fsck si nécessaire ; initialise éventuellement le lvm et le mirroring.
/sbin/rc gère les applications à lancer/arrêter.
init /usr/sbin/getty

 affiche le contenu de /etc/issue et génère l’invite de connexion sur le terminal spécifié.

 

 

3. Le script /sbin/rc

Ce script conditionne le démarrage et l’arrêt des applications à un niveau de marche donné : on peut par exemple décider de lancer une application de gestion de base de données au niveau 5 et pas au niveau 4. Une fois la mise en place effectuée, il suffira de sélectionner l’état de marche 5 pour démarrer l’application, et l’état 4 pour la stopper.

 

En fait, ce paramétrage est à deux étage : il faut décider d’une part dans quel état de marche une application sera éventuellement lancée, et d’autre part si l’on souhaite ou non la lancer.

Toutes les applications à lancer à un niveau donné le seront aussi à tous les niveaux supérieurs.

Toutes les applications à stopper à un niveau donné le seront aussi à tous les niveaux inférieurs.

 

Les fichiers et répertoires utilisés par /sbin/rc sont les suivants :

 

 

 

 L’algorithme de /sbin/rc lors de tout changement de niveau est le suivant :

  • exécution du script /etc/rc.config qui a pour objet de lancer tous les fichiers de configurations stockés dans /etc/rc.config.d.

  • si l’état de marche courant (noté C) et le nouvel état de marche (noté N) sont identiques, rien ne se passe,

  • si le nouvel état de marche est supérieur à l’état de marche courant (l’état de marche C+1 est noté D) :

les scripts /sbin/rcD/S* sont exécutés (avec dans l’ordre les arguments start_msg puis start),

le système passe à l’état de marche D ; si D ¹ N ,le processus est répété.

  • si le nouvel état de marche est inférieur à l’état de marche courant (l’état de marche C-1 est noté B) :

les scripts /sbin/rcD/K* sont exécutés (avec dans l’ordre les arguments stop_msg puis stop),

le système passe à l’état de marche B ; si B ¹ N , le processus est répété.

 

 

Dans la pratique, les scripts du répertoire /sbin/init.d savent traiter quatre arguments distincts :

  • start_msg : affichage d’un message d’information de lancement sur l’écran

  • start : lancement du programme

  • stop_msg : affichage d’un message d’information d’arrêt sur l’écran

  • stop : arrêt du programme

Un squelette de programme /sbin/init.d/template sert de base pour la création de nouveaux scripts :

# !/sbin/sh
#
# @(#) $Revision : 72.11 $
#
# NOTE : This script is not configurable ! Any changes made to this
# script will be overwritten when you upgrade to the next
# release of HP-UX.
#
# WARNING : Changing this script in any way may lead to a system that
# is unbootable. Do not modify this script.
 
#
# <Insert comment about your script here>
#
 
# Allowed exit values :
# 0 = success ; causes "OK" to show up in checklist.
# 1 = failure ; causes "FAIL" to show up in checklist.
# 2 = skip ; causes "N/A" to show up in the checklist.
# Use this value if execution of this script is overridden
# by the use of a control variable, or if this script is not
# appropriate to execute for some other reason.
# 3 = reboot ; causes the system to be rebooted after execution.
 
# Input and output :
# stdin is redirected from /dev/null
#
# stdout and stderr are redirected to the /etc/rc.log file
# during checklist mode, or to the console in raw mode.
 
PATH=/usr/sbin :/usr/bin :/sbin
export PATH
 
# NOTE : If your script executes in run state 0 or state 1, then /usr might
# not be available. Do not attempt to access commands or files in
# /usr unless your script executes in run state 2 or greater. Other
# file systems typically not mounted until run state 2 include /var
# and /opt.
 
rval=0
 
# Check the exit value of a command run by this script. If non-zero, the
# exit code is echoed to the log file and the return value of this script
# is set to indicate failure.
 
set_return()
x=$ ?
if [ $x -ne 0 ] ; then
echo "EXIT CODE : $x"
rval=1 # script FAILed
fi
 
# Kill the named process(es).
# $1=<search pattern for your process>
 
killproc()
pid=ps -e | awk '$NF~/'"$1"'/ {print $1}'
if [ "X$pid" != "X" ] ; then
if kill "$pid" ; then
echo "$1 stopped"
else
rval=1
echo "Unable to stop $1"
fi
fi
 
 
case $1 in
’start_msg’)
# Emit a _short_ message relating to running this script with
# the "start" argument ; this message appears as part of the checklist.
echo "Starting the <specific> subsystem"
 ; ;
 
’stop_msg’)
# Emit a _short_ message relating to running this script with
# the "stop" argument ; this message appears as part of the checklist.
echo "Stopping the <specific> subsystem"
 ; ;
 
’start’)
 
# source the system configuration variables
if [ -f /etc/rc.config ] ; then
. /etc/rc.config
else
echo "ERROR : /etc/rc.config defaults file MISSING"
fi
 
# Check to see if this script is allowed to run...
if [ "$CONTROL_VARIABLE" != 1 ] ; then
rval=2
else
 
# Execute the commands to start your subsystem
 :
fi
 ; ;
 
’stop’)
# source the system configuration variables
if [ -f /etc/rc.config ] ; then
. /etc/rc.config
else
echo "ERROR : /etc/rc.config defaults file MISSING"
fi
 
# Check to see if this script is allowed to run...
if [ "$CONTROL_VARIABLE" != 1 ] ; then
rval=2
else
 :
# Execute the commands to stop your subsystem
 
fi
 ; ;
 
*)
echo "usage : $0 start|stop|start_msg|stop_msg"
rval=1
 ; ;
esac
 
exit $rval
 

 

De plus, l’exécution des commandes d’arrêt et démarrage est conditionnée par la valeur de variables définies dans le script de même nom situé sous /etc/rc.config.d :

#script de contrôle du lancement de <specific>

# CONTROL_VARIABLE=0

CONTROL_VARIABLE=1

 

Les codes de retour des scripts de /sbin/init.d sont obligatoirement : 0 si ok, 1 si erreur, 2 si non exécuté (ignoré), 3 si exécution normale mais nécessitant un redémarrage pour prendre en compte les modifications.

Les fichiers des répertoires /etc/rcN.d/ commençant par S (Start) sont lancés dans l’ordre de présence dans le répertoire : le numéro les préfixant sert donc à fixer l’ordre de lancement ; il ne faut pas les modifier, et utiliser pour ses scripts les numéros réservés commençant par 9. Le principe est le même pour les fichiers K (kill), les numéros réservés commencent par 1.

 


Navigation

Articles de la rubrique

Statistiques

Dernière mise à jour

mercredi 4 octobre 2023

Publication

273 Articles
Aucun album photo
Aucune brève
6 Sites Web
2 Auteurs

Visites

227 aujourd’hui
111 hier
828093 depuis le début
2 visiteurs actuellement connectés