Au démarrage ou à l'arrêt d'une machine GNU/Linux, plusieurs tâches doivent être effectuées. Ces tâches peuvent correspondre :
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.
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 :
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 ?
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...
Pour chaque état de la machine, des scripts différents seront exécutés :
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
Concrètement, quand une machine démarre :
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.
Sous Ubuntu, ce fichier n'existe pas, il faut donc utiliser le Grub (ce n'est pas la seule solution)...
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.
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.
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.
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.