Cours Linux : les runlevels
Cet article a été publié par Benjamin
le 25-01-09 à 12:35 dans la catégorie Cours Linux
Tags :
- Cours
- Libre
- Ubuntu
Voici donc une nouvelle catégorie sur Génération Linux : les cours Linux.
Le cours
d'aujourd'hui porte donc sur les runlevels. Au programme, une définition complète des runlevels, comment changer le runlevel du démarrage, comment
personnaliser son runlevel, ...
I. Présentation, définition
Au démarrage ou à l'arrêt d'une machine Linux (ou Unix en général), plusieurs tâches doivent être effectuées. Ces tâches peuvent correspondre à des fonctionnalités de base (montage des partitions, chargement des périphériques, démarrage de l'interface graphique, ..) ou à des tâches plus spécifiques (lancement d'un serveur web, d'un service ssh, d'une base de données MySQL, ...).
Le premier processus a être lancé sur un système Unix est le programme init (qui est le père de tous les processus existants). Son but est, entre autres, de lancer tous les autres processus nécessaires à l'utilisation d'une machine.
La gestion de tous les services installés sur une machine passe par des scripts situés dans le répertoire /etc/init.d/. Ce répertoire contient un script par service (serveur web, gestion du réseau, l'interface graphique, le DHCP, le gestionnaire des logs, ...).
Ces scripts peuvent être exécutés en leur passant un paramètre spécifique :
start
: démarre le servicestop
: arrête le servicerestart
: redémarre le servicereload
: force la relecture du fichier de configuration sans arrêter le servicestatus
: affiche l'état actuel du service (démarré, éteint, ...)
/etc/init.d/apache2 start
ou pour le redémarrer : /etc/init.d/apache2 restart
.Cette liste n'est pas exhaustive et n'est pas applicable à tous les scripts. En effet, cela dépend du script. Certains scripts ne sont pas prévus pour prendre en compte le paramètre
relaod
par exemple.Ces scripts sont donc le moyen de contrôler les différents services installés sur votre machine. Lors de l'installation d'un paquet correspondant à un service, un script est automatiquement ajouté dans ce répertoire.
Bon d'accord mais quel est le rapport avec les runlevels ?
En fait, il y a 7 runlevels différents sur un système Unix. Chacun est associé à un état de votre machine. Voici les runlevels des systèmes Debian/Ubuntu :
- Runlevel 0 : Arrêt de la machine
- Runlevel 1 : Mode maintenance (mono-utilisateur en ligne de commande)
- Runlevel 2 à 5 : Mode multi-utilisateur complet avec serveur graphique si installé
- Runlevel 6 : Redémarrage de la machine
Lorsqu'un système Unix démarre, il se place dans le runlevel 2, 3, 4 ou 5 (par défaut, le 2). Que se passe t-il donc ?
Admettons que le système utilise le runlevel par défaut pour démarrer (le 2). Au démarrage, il va consulter le répertoire /etc/rc2.d/. Allons voir ce que contient ce répertoire (
ls -l /etc/rc2.d/
) :[...]
lrwxrwxrwx 1 root root 13 2008-11-18 20:04 S16ssh -> ../init.d/ssh
lrwxrwxrwx 1 root root 15 2008-12-17 19:50 S19mysql -> ../init.d/mysql
lrwxrwxrwx 1 root root 14 2008-11-03 14:58 S89cron -> ../init.d/cron
lrwxrwxrwx 1 root root 17 2008-11-17 19:31 S91apache2 -> ../init.d/apache2
[...]
Voici la syntaxe d'une ligne :
X00service -> ../init.d/service
- X correspond à la lettre S ou à la lettre K. Si il y a la lettre S, le paramètre
start
sera passé au script /etc/init.d/service. En revanche, si c'est la lettre K, c'est le paramètrestop
qui sera passé à ce script. - 00 correspond à une priorité d'exécution. Le service possédant le plus petit chiffre s'exécutera en premier. Par exemple, S16ssh s'exécutera avant S89cron. (Attention : Tous les liens commençant par K s'exécuteront avant les liens commençants par un S)
- service correspond au au nom du service lancé (ou arrêté). Exemple : apache2, ssh, ...
- -> ../init.d/service indique que ce lien utilise le fichier /etc/init.d/service avec un paramètre. Par exemple
/etc/init.d/apache2 start
Vous avez compris ? Ce n'est pas difficile de toutes façons :)
Bon, comme dans tout cours digne de ce nom, nous allons faire une petite pause café pour détendre un peu vos neurones :
II. Changement du runlevel
Sous Debian il existe un fichier /etc/inittab qui contient cette ligne :
id:2:initdefault:
Cela signifie que le système boot avec le runlevel 2. Pour changer le runlevel de démarrage, vous l'aurez compris, il suffit de modifier cette ligne et de mettre le numéro de votre choix à la place du 2.
Sous Ubuntu, ce fichier n'existe pas, il faut donc utiliser le Grub (ce n'est pas la seule solution mais c'est, selon moi, la plus simple) :
- De manière permanente : Éditez le fichier /boot/grub/menu.list. Par exemple, copiez ces lignes (qui correspondent à une ligne de votre Grub) :
title Ubuntu 8.04.1, kernel 2.6.24-21-eeepc
root (hd0,0)
kernel /boot/vmlinuz-2.6.24-21-eeepc root=UUID=8db02c66-167f-467a-a8f8-3f6ae22a70d4 ro
initrd /boot/initrd.img-2.6.24-21-eeepc
quiet
Puis collez-les en dessous en ajoutant les mots en gras :
title Ubuntu 8.04.1, kernel 2.6.24-21-eeepc - runlevel 3
root (hd0,0)
kernel /boot/vmlinuz-2.6.24-21-eeepc root=UUID=8db02c66-167f-467a-a8f8-3f6ae22a70d4 ro 3
initrd /boot/initrd.img-2.6.24-21-eeepc
quiet
Vous aurez désormais une ligne de plus dans votre grub au démarrage, vous pourrez la sélectionner pour booter en runlevel 3. - De manière temporaire : Lorsque vous démarrez, au moment du grub, appuyez sur la touche
e
pour éditer la ligne kernel puis ajoutez un chiffre à la fin de la ligne (chiffre qui correspondra au runlevel avec lequel vous souhaitez démarrer).
Enfin, appuyez surb
pour démarrer. Vous démarrerez avec le runlevel indiqué précédemment.
who -r
.III. Configuration et personnalisation d'un runlevel
Pour vous expliquer comment faire un runlevel personnalisé, nous allons prendre un exemple concret. Dans mon précédent article, je disais qu'il était préférable de démarrer un serveur sans interface graphique (bien qu'un serveur ne devrait pas être installé avec une interface graphique). Bref, nous partons du principe qu'une interface graphique est installée et qu'elle se lance par défaut à chaque démarrage.
Nous allons donc voir comment désactiver cette interface graphique au démarrage en utilisant un runlevel personnalisé (nous allons personnaliser le runlevel 3).
Premièrement, nous allons devoir identifier quel service sert à lancer notre interface graphique. Pour cela, nous pouvons lister les éléments contenus dans notre runlevel par défaut (le 2) : ls -l /etc/rc2.d/
[...]
lrwxrwxrwx 1 root root 20 2008-11-03 14:58 S25pulseaudio -> ../init.d/pulseaudio
lrwxrwxrwx 1 root root 13 2008-11-03 14:58 S30gdm -> ../init.d/gdm
lrwxrwxrwx 1 root root 17 2008-11-03 14:58 S89anacron -> ../init.d/anacron
lrwxrwxrwx 1 root root 13 2008-11-03 14:58 S89atd -> ../init.d/atd
lrwxrwxrwx 1 root root 14 2008-11-03 14:58 S89cron -> ../init.d/cron
lrwxrwxrwx 1 root root 24 2008-12-11 16:44 S90binfmt-support -> ../init.d/binfmt-support
lrwxrwxrwx 1 root root 17 2008-11-17 19:31 S91apache2 -> ../init.d/apache2
[...]
Le fautif se trouve être S30gdm (le nombre peut varier chez vous).
Nous allons donc devoir supprimer cette exécution. Pour ce faire, il faut exécuter ces commandes :
update-rc.d -f gdm remove
Cette commande va, dans un premier lieu, supprimer gdm de tous les runlevels. Nous allons pouvoir le rajouter à notre convenance :
update-rc.d gdm start 30 2 . stop 30 0 6 .
Grâce cette commande, nous ajoutons le démarrage de gdm avec une priorité de 30 (j'ai conservé l'ancienne) dans le runlevel 2 uniquement, puis nous l'arrêtons dans les runevels 0 et 6 (arrêt et redémarrage de la machine).
Vous constatez que nous ne l'avons pas ajouté dans le runlevel 3, ce qui est normal car on veut un runlevel 3 sans gdm.
Voilà, vous pouvez désormais redémarrer en runlevel 3, vous verrez que vous resterez en mode texte :)
Ainsi se termine ce premier cours, j'espère qu'il vous a plu. Si vous avez d'autres sujets de cours, j'accepte avec plaisir :)
Commentaires
Excellent résumé sur les runlevels. Je l'enverrai à deux personnes m'ayant demandés comment personnaliser les services d'Ubuntu aux oignons ! Merci !
Il me semble qu'il y a une coquille: "ls -l /etc/rc2.c/" doit être lu "ls -l /etc/rc2.d/"
Oups, bien vu :)
Merci
Merci beaucoup (pour le cours, et pour la vidéo ;) ) !
j'ai raté l'émission... mais découvert cette radio !
Excellente doc sur les niveaux d'exécution (en français c'est mieux ;-).
Je me permets cependant de faire quelques suggestions :
- modifier les niveaux d'exécution, notamment 0,1,2 et 6 est une opération risquée
- on peut basculer d'un niveau à l'autre sans redémarrer la machine avec la commande telinit (ex sudo telinit 1 pour passer en mode console mono-utilisateur). C'est utile par exemple lorsque l'on veut réparer une configuration de Xorg
- pour avoir un niveau 3 sans interface graphique, il serait plus judicieux de faire : update-rc.d gdm start 30 2 . stop 30 0 3 6 (cela permet d'utiliser telinit 3 pour passer en mode console sans Xorg depuis un autre niveau).
Merci beaucoup pour cet article on ne peut plus clair!
Tu pourrais en dire un peu plus sur le 6 et 0 ? (Quand sont-ils exécutés et que se passe-t-il ?)
Lors d'une installation, les 2,3,4 et 5 lancent-ils par défaut les même services ?
Quand utiliser rc.local (je l'ai sur ma machine du boulot, est-ce standard ?) ?
@Bruno : Merci pour ces ajouts, il est vrai que modifier les runlevels 0, 1, 2 et 6 est assez risqué, cependant, si on s'en tient à ce que j'ai présenté, il n'y a (selon moi) pas de risques.
Je voulais également parler de telinit mais finalement j'ai renoncé. Peut-être que je vais le rajouter finalement.
@LHB : Pour le runlevel 0 et 6, tous les scripts (qu'il aient comme paramètre S ou K) sont arrêtés.
Par défaut sous les systèmes Debian, les runlevels par défaut 2, 3, 4 et 5 sont effectivement identique.
Concernant le rc.local, cela ne semble pas poser de problème. Je ne l'ai jamais utilisé mais à priori beaucoup de monde l'utilise sans aucun problème. Je serais curieux de savoir ce que contient ton fichier rc.local :)
Bonjour et merci pour ses explications !!!
Si j'ai bien compris, les niveaux 3 à 5 servent à paramétrer différentes sessions. Par exemple :
runlevel 2 : Le laisse par defaut
runlevel 3 : Je demarre un serveur LAMP pour du developpement (Que je fais de temps en temps)
runlevel 4 : Je garde le minimum pour optimiser le framerate dans quakewars
Je boot en runlevel 2 pour l'utilisation quotidienne.
Si je veux jouer je tape 'sudo telinit 4' pour optimiser mon PC.
Je reviens avec un 'telinit 3' pour développer mon site... et ainsi de suite...
Ca peut servir à ça, si j'ai bien compris ?!!
Exactement Joda, tu as tout compris :)
Par contre, ce que je fais moi pour mon serveur Apache occasionnel, je le supprime de tous les runlevels et le démarre seulement via /etc/init.d/apache2 start quand j'en ai besoin :)
Bonjour,
Sous Ubuntu 8.04.2, j'ai essayé ta modification du fichier menu.lst mais cela ne fonctionne pas: je démarre toujours en mode graphique.
J'ai cherché sur le net et j'ai trouvé ça:
http://forum.ubuntu-fr.org/viewtopi...
Il y d'autres manip à faire pour que le runlevel 3 soit pris en compte: il faut modifier le fichier /etc/event.d/rc-default
Merci quand-même pour l'explication, ça m'a permis de comprendre le mécanisme.
@+
Rebonjour,
@Benjamin
Un truc que je voudrais éclaircir
J'ai fais un test, j'ai viré bluetooth du RL3 avec ta méthode ça fonctionne nickel !!! si je boot sur le RL3
Par contre si je veux utilisé la méthode de Bruno : Je boot sur le RL2, et je fais une "sudo telinit 3" pour passé en RL3 sans reboot, le bluetooth apparait toujours dans la liste des processus...
Avec cette ligne ces lignes ça fonctionne mieux ...
sudo update-rc.d -f bluetooth remove
sudo update-rc.d bluetooth start 25 2 . stop 25 0 3 6 .
Un telinit ne supprime pas les processus lancer par un autre RL !!!
2 commandes utiles pour connaitre son runlevel en cours !
runlevel
who -r
merci et a+
Le runlevel par défaut de Ubuntu est bien le 2, par contre ce sera le 5 sous Debian :)
À préciser que certaine distributions utilisent d'autres gestionnaires que le init proche de System V décrit ici, comme sous Gentoo ou Slackware par exemple.
merci pour ce tuto qui explique pas mal de choses! ;)
A noter le paquet et la commande sysv-rc-conf sous Debian et Ubuntu/Kubuntu qui permet de configurer les démons sur tous les niveaux d'exécution.
Pour Fedora/Centos/RedHat, les commandes ntsysv et chkconfig font aussi ça très bien.
Sous Mandriva, vous pouvez utiliser DrakConf et sous Suse et OpenSuse, utilisez YaST.
Petit reproche qui n'enlève rien à la qualité du travail effectué : dommage que ce tuto ne parle que de Debian et de Ubuntu. Le fonctionnement des niveaux d'exécution sous les distributions de type RPM like est très, très différent.
Be aware.
Merci à tous pour vos remarques :)
@Denis, j'aurais bien voulu parler des runlevels sous les distributions type rpm mais je ne connais pas du tout, j'ai donc préféré m'abstenir plutôt que de dire une bêtise :
Merci pour ce boulot.
Je commence à comprendre !
La manipulation est un peu délicate à faire sous Debian dans le cas ou l'on réalise une configuration d'un serveur et qu'il faut faire des test à chaque fois et redémarrer le service du serveur à chaque fois de cette manière.
par exemple sous RedHat on utilise service "X" restart , ou bien chkconfig ou ntsys; c'est plus pratique. y'aurait il une solution de contournement pour Debian ? ou bien faudrait-il nécessairement utiliser update-rc.d "X" start 30 2 . ? je voudrait aussi savoir s'il est nécessaire de rebooter à chaque fois la machine pour que start prenne effet ?
Merci d'avance de votre réponse
Qu'est-ce que c'est bien, ces tutos.
Synthétiques, accessibles à tous, ça donne envie de chercher pour creuser.
Tu as raison de ne parler que de l'essentiel du sujet.
Bravo !
Bonjour !
Super sympa le tuto, j'ai bien compris les runlevels ! Mais je suis sous Centos 5.4 et dans le dossier /etc/rc5.d/ je n'ai pas le service gdm alors que je suis sous gnome ! Quel est le service qui démarre mon interface graphique !!
Merci d'avance =)
Bravo et merci pour ce petit tuto et pour l'ensemble du site. Marrant la vidéo ;))
Merci beaucoup pour ces explications :) Ce cours est très simple à comprendre :)
Merci Benjamin pour ce tuto, bien réalisé et plus facile à comprendre lorsque c'est en françois... ;-)
Vraiment génial, j'ai bien compris les runlevels grâce à toi. Merci aussi de ne pas tout nous donner sur un plateau d'or car ça m'a permis de faire des recherches en profondeur et bien cerner tout le concept.
Merci infiniment.
Ces remarques me vont droit au coeur :)
Excellent tuto, grâce a toi je viens de comprendre en 20 min ce que je n'avais pas compris pendant tout une journée de cours.
Je t'encourage a continuer comme cela.
Un grand bravo
Génial, content que ça t'ai servi :)
Bon courage pour la suite !
Merci beaucoup :)
Bonjour,
J'aimerais avoir une réponse à cette question, car je ne suis pas sur d'avoir bien compris l'utilité des runlevels:
Leur utilisation peut-elle me permettre de lancer automatiquement une commande avant l'arrêt de mon ordinateur?
Merci d'avance de votre éclaircissemment
Bonsoir et merci pour ce trés utile tuto.
Petite question... je ne trouve pas le ...grub/menu.lst. Ni dans le /boot ni dans le /sbin/grub.
Y a t il un autre endroit ou il peut se cacher ?
Très intéressant merci