inittab a disparu ... bienvenue upstart
Par dominique - le samedi 17 février 2007, 10:04 - Linux - Lien permanent
Vous voulez connaître le niveau par défaut de votre environnement Ubuntu fraîchement installé, et vous ouvrez le fichier /etc/inittab pour voir la valeur du initdefault.
Ah, le fichier /etc/inittab n'existe pas ?
Panique, recherche, interrogation et ... découverte : Ubuntu utilise maintenant un nouveau mécanisme qui remplace le traditionnel init : upstart !
Les jobs sont placés dans le répertoire /etc/event.d, dont voici une liste typique :
logd rc0 rc0-poweroff rc2 rc4 rc6 rcS-sulogin tty1 tty3 tty5La commande initctl list fournit la liste des jobs lancés, actifs ou en attente :
control-alt-delete rc-default rc0-halt rc1 rc3 rc5 rcS sulogin tty2 tty4
control-alt-delete (stop) waitingEt le contenu typique d'un fichier job est :
logd (start) running, process 1821 active
rc-default (stop) waiting
rc0 (stop) waiting
rc0-halt (stop) waiting
rc0-poweroff (stop) waiting
rc1 (stop) waiting
rc2 (stop) waiting
rc3 (stop) waiting
rc4 (stop) waiting
rc5 (stop) waiting
rc6 (stop) waiting
rcS (stop) waiting
rcS-sulogin (stop) waiting
sulogin (stop) waiting
tty1 (start) running, process 3356 active
tty2 (start) running, process 3357 active
tty3 (start) running, process 3358 active
tty4 (start) running, process 3359 active
tty5 (start) running, process 3360 active
tty6 (start) running, process 3361 active
# tty1 - gettyOn y trouve tout simplement les actions à mener lorsqu'un événement (runlevel-2, runlevel-3, ... ou shutdown) se produit, et les instructions à exécuter lorsque le job est lancé.
#
# This service maintains a getty on tty1 from the point the system is
# started until it is shut down again.
start on runlevel-2
start on runlevel-3
start on runlevel-4
start on runlevel-5
stop on shutdown
respawn /sbin/getty 38400 tty1
Un exemple un peu plus complexe ?
# rc2 - runlevel 2 compatibilityOn retrouve un fonctionnement habituel, qui lance les scripts dans rc2.d lorsqu'on entre dans le niveau 2, et arrête le job lorsqu'on entre dans d'autres niveaux. On remarque que le script exécuté par le job est un peu plus complexe, et on voit l'un des intérêts de ce nouveau mécanisme, à savoir éviter d'écrire un script uniquement pour le placer dans une ligne de /etc/inittab.
#
# This task runs the old sysv-rc runlevel 2 ("multi-user") scripts. It
# is usually started by the telinit compatibility wrapper.
start on runlevel-2
stop on shutdown
stop on runlevel-3
stop on runlevel-4
stop on runlevel-5
script
set $(runlevel --set 2 || true)
if [ "$1" != "unknown" ]; then
PREVLEVEL=$1
RUNLEVEL=$2
export PREVLEVEL RUNLEVEL
fi
exec /etc/init.d/rc 2
end script
A l'issue de ce petit tour, vous vous demandez peut être quel est l'intérêt de ce changement ?
Pour ma part, j'en vois un majeur, qu'on ne peut pas réaliser avec le init classique sans aller modifier le fichier inittab. Il est possible d'arrêter ou de lancer temporairement et interactivement un job, c'est à dire d'être dans un niveau de fonctionnement donné sans que ce job ne continue à tourner, à l'aide des commandes start et stop.
Par exemple stop tty1 arrête le processus de login lancé sur le port virtuel tty1.
Essayez donc de faire la même chose de façon interactive avec un init classique : voues êtes obligés de modifier /etc/inittab, et de faire un telinit q. Et si vous oubliez ensuite d'annuler votre modification dans /etc/inittab, votre système reste configuré de travers, ce qui ne sera pas le cas avec upstart puisque vous n'avez rien modifié aux fichiers de configuration.
Oh j'allais oublier de donner la réponse à la question. Sous Ubuntu, le niveau par défaut est le 2, et on peut le voir en lisant le contenu du job rc-default !

Commentaires
Un complément suite à une question posée : "Comment faire pour remplacer le redémarrage par un arrêt lorsqu'on appuie sur CTRL-ALT-DEL ?"
Il suffit de modifier, dans le fichier control-alt-delete, l'option -r par l'option -h
Bonjour,
Si le processus démarré par Upstart crash, est-ce qu'il y a moyen qu'il soit redémarré automatiquement?
Je pensais que c'est ce que voulais dire "respawn", mais en faisant un "kill -9 pid", le processus est tué sans être réssucité.
Si vous avez une idée comment faire?
L'attribut respawn sert bien à relancer une commande lorsqu'elle est arrêtée (comme c'est le cas dans le fichier /etc/inittab).
Sur les essais que j'ai réalisé, tout se comporte normalement. Contactez moi par mail avec plus de détails sur votre configuration et votre problème, si vous le souhaitez.
bonjour,
est-il possible de rajouter un job? Et pour cela faut-il créer un nouveaux fichier ou bien essayer de l'insérer dans un des fichier de job déjà existant?
Il est tout à fait possible d'ajouter un job.
Pour cela, il faut créer un nouveau fichier dans le répertoire /etc/events.d (par exemple en copiant un fichier job existant et en l'éditant pour qu'il fasse ce que l'on veut).
Il suffit ensuite de le lancer en utilisant la commande initctl, avec la syntaxe
Une autre solution peut consister à modifier un fichier existant, mais cela couplera les nouvelles actions avec les anciennes, ce qui n'est pas forcement une bonne idée, et cela risque de poser des problèmes en cas de mise à jour, avec un écrasement intempestif du fichier job modifié.
Ceci dit, dans la grande majorité des cas, c'est plutôt dans les scripts de description des services (répertoires etc/rcn.d) qu'on intervient normalement.
J'ai un problème de démarrage après un upgrade 6.06 vers 8.04 ubuntu. Jusqu'au execv /sbin/init tout va bien, mais ensuite, dans la phase user space, il ne se passe plus rien.... (et c'est là que je découvre que je n'ai plus d'inittab et qu'il est remplacé par upstart. !!)
Je voudrais comprendre dans quel ordre les différents rc scripts sont lancés (s'ils sont encore tous lancés) et en particulier celui par lequel commence upstart.après le /sbin/init lancé à partir du ramfs.
merci d'avance,
Je ne comprend pas bien la question ?
Lorsque le système entre dans un niveau n, upstart lance le srcipt :etc/init.d/rc n tout comme le faisait init. Et normalement rc exécute tous les scripts Kxxnom pour arrêter les services non voulus, puis Syynom pour lancer ceux qui sont voulus. Et ces actions sont exécutées dans l'ordre des numéros xx ou yy, puis dans l'ordre alphabétiques des noms si plusieurs scripts sont au même numéro.
En fait j'ai compris l'aspect évènementiel, et donc asynchrone, du lancement des tâches qui sont contenues dans les répertoires rcx.d. Je ne voyais pas alors ce que pouvait bien lancer "execv ("/sbin/init",.....) et dans quel ordre lorsque le processus de démarrage lance le spawn de init et quitte la ramfs.
Après quelque tests je me rends compte que le processus de démarrage fonctionne comme avant upstart: c'est rc S est d'abord executé et les rcx.d ensuite suivant le niveau voulu. C'est bien cela ?
Oui, c'est cela.
Avant, init lisait les entrées dans inittab qui était construit pour lancer le rc n correspondant au niveau n, ainsi que d'autres actions (par exemple le lancement de l'interface graphique au niveau 5 dans la majorité des distributions).
Maintenant, les actions autrefois décrites ligne par ligne dans inittab le sont comme des évènements et rc n est lancé comme cela.
Merci pour vos réponses...
Bonjour,
Merci pour cet article.
Petite faute de frappe:
"Les jobs sont placés dans le répertoire /etc/event_s_.d"
=> /etc/event.d
Philippe
C'est corrigé, merci !
L'article sur Digit Books est plus complet et a priori sans cette faute.