Jul 03, 2024

Wiki

Python

Aide

edit SideBar

Search

Runlevels


Présentation, définition

Démarrage et arrêt d'un système GNU/Linux

Au démarrage ou à l'arrêt d'une machine GNU/Linux, 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...
  • à 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 à être lancé 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.

Les scripts des services

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, interface graphique, DHCP, gestionnaire des logs, etc.

Ces scripts peuvent être exécutés en leur passant un paramètre spécifique :

  • start : démarre le service,
  • stop : arrête le service,
  • restart : redémarre le service,
  • reload : force la relecture du fichier de configuration sans arrêter le service,
  • status : affiche l'état actuel du service (démarré, éteint, ...)

Par exemple, pour lancer un serveur apache, il faut exécuter cette commande :

  /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 reload 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.

Quel est le rapport avec les runlevels ?

Les 7 runlevels

En fait, il y a 7 runlevels différents sur un système GNU/Linux. 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.

Pour chaque état de la machine, des scripts différents seront exécutés :

  • Pour le runlevel 0 (l'arrêt du système), il faut arrêter tous les services de la machine.
  • Pour le runlevel 2 (le démarrage du système), il faut démarrer tous les services de la machine.

Que se passe-t-il au démarrage ?

Lorsqu'un système GNU/Linux démarre, il se place dans le runlevel 2, 3, 4 ou 5 (par défaut, le 2).

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ètre stop 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 S.
service
correspond 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

Concrètement, quand une machine démarre :

  1. le noyau se charge, puis
  2. il passe la main à init qui va, dans un premier temps,
  3. lancer toutes les commandes du fichier /etc/rcS.d/ (montage des périphérques, du réseau, ...) puis, il va
  4. lancer toutes les commandes situées dans le fichier /etc/rcX.d/, X étant le runlevel actuel (par défaut le 2).

Changement du runlevel

Cas d'une Debian

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, il suffit de modifier cette ligne et de mettre le numéro de son choix à la place du 2.

Cas d'une Ubuntu

Sous Ubuntu, ce fichier n'existe pas, il faut donc utiliser le Grub (ce n'est pas la seule solution)...

Modification permanente du Grub

Pour ce faire, on doit éditer le fichier /boot/grub/menu.list puis terminer la ligne contenant kernel par le runlevel.

Ainsi, par exemple, pour booter avec un runlevel 3, le groupe de lignes suivantes

  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

sera remplacé par

  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

On peut avoir plusieurs groupes, donc plusieurs lignes dans le Grub, correspondant à un même noyau, mais lancé avec un runlevel différent.

De manière temporaire

Lorsque l'on démarre, au moment du grub, on peut appuyer sur la touche e pour éditer la ligne kernel, puis ajouter un chiffre à la fin de la ligne (chiffre qui correspondra au runlevel souhaité).

Enfin, on appuye sur b pour démarrer.

Configuration, personnalisation

Une illustration

Pour expliquer comment faire un runlevel personnalisé, un exemple concret est choisi : on suppose qu'un serveur a été installé avec une interface graphique, et qu'on souhaite pouvoir par la suite le démarrer sans cette interface.

Nous partons donc du principe qu'une interface graphique est installée, et qu'elle se lance par défaut à chaque démarrage.

La personnalisation

Nous allons désactiver cette interface graphique au démarrage, en utilisant un runlevel personnalisé : 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).

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, dans le runlevel 2 uniquement, puis nous l'arrêtons dans les runlevels 0 et 6 (arrêt et redémarrage de la machine).

Voilà, on peut désormais redémarrer en runlevel 3, on restera en mode texte.

Remarques finales

  • 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. Par exemple,
    sudo telinit 1
permet de 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.

Page Actions

Recent Changes

Group & Page

Back Links