Cette section nous présentera ce qui se passe exactement quand Linux démarre. Nous couvrirons en même temps les services et la façon de les gérer.
6.4 - Les "runlevels" (niveaux d'exécution)
6.5 - Les fichiers de démarrage
6.6 - Modifier la séquence de démarrage
Que fait le système lorsque Linux démarre?
Le tout premier processus à démarrer sur un système Linux est init. Si vous faites un ps -e, vous constaterez qu'init a toujours le PID 1.
Init ouvrira le fichier /etc/fstab et montera chacune des partitions aux points de montage indiqués. La première à être montée sera /, puis les autres seront greffées après celle-ci.
Quelques définitions:
Retour à la table des matières de la section
C'est dans ce fichier que sont listés les différents sytèmes de fichiers disponibles sur votre système. Pour chacun d'eux, on trouvera un nom, un point de montage, un type (ext3 ou ntfs par exemple) puis des options de montage à utiliser.
Le fichier est un fichier de configuration Linux typique: fichier texte standard, avec une entrée par ligne. Chaque entrée contient plusieurs champs séparés par un ou des espaces ou tabulations. Les champs n'ont pas besoin d'être alignés d'une entrée à l'autre. Les lignes vides ou commençant par # sont ignorées.
Par exemple, on y verra quelque chose comme:
proc /proc proc defaults 0 0 #/dev/sda2 UUID=43455-3442-2123-1212-12 / ext3 defaults,errors=remount-ro 0 1 #/dev/sda3 UUID-385832-29482-2812-128123-12 /home ext3 defaults 0 2
Puis, plus bas dans le fichier:
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec 0 0
Dans ce fichier, les champs, dans l'ordre, sont:
Ce fichier est donc essentiel au bon fonctionnement du système. Si un jour vous faites des modifications aux disques durs ou partitions, il faut vous assurer que /etc/fstab est mis à jour correctement.
Retour à la table des matières de la section
Ubuntu fonctionne différemment des autres distributions pour ce qui est de la séquence de démarrage des services.
La majorité des distributions utilise sysvinit, un package appelé "System V" et commençant à se faire vieux. SysV s'occupe entre autres de la séquence de démarrage et utilise pour cela différents scripts et fichiers de configuration permettant d'orchestrer le tout de façon statique (dans un ordre bien défini).
Ubuntu utilise upstart, un tout nouveau package créé par Scott James Remnant de chez Ubuntu. L'idée derrière upstart est de remplacer SysV par quelque chose de dynamique basé sur des événements. Ainsi, certaines tâches ou services peuvent être démarrés lorsqu'un événement particulier est lancé (que ce soit pour signifier que le serveur s'allume ou qu'un service s'est arrêté). On permet donc une plus grande flexibilité dans la séquence de démarrage.
En contrepartie, Ubuntu simplifie bien des choses en fonctionnant toujours en mode graphique (sauf lorsqu'on démarre en "mode sans échec").
Retour à la table des matières de la section
En Linux, il y a plusieurs niveaux d'exécution. Un niveau d'exécution représente simplement une séquence quelconque de démarrage (ou d'arrêt). Lorsqu'on passe à un niveau d'exécution quelconque, Linux sait quels services arrêter et quels services démarrer pour que tout soit fonctionnel. On peut considérer un niveau d'exécution comme un mode.
Il existe 4 niveaux d'exécutions prédéfinis qui permettent d'utiliser le serveur d'une façon quelconque, 2 niveaux d'exécutions prédéfinis qui servent à l'arrêter et 1 niveau d'exécution non défini et par défaut non utilisé (ce qui pourrait permettre à quelqu'un de définir son propre niveau d'exécution selon ses besoins).
Voici la liste officielle:
Niveau d'exécution |
Usage Ubuntu |
Usage courant |
0 |
Arrêt (halt) - éteint la machine |
Arrêt (halt) – éteint la machine |
1 |
Mode mono usager (single user mode) – un genre de mode sans échec où seul le root peut se loguer et où peu de services sont démarrés |
Mode mono usager (single user mode) |
2 |
Multi usagers graphique |
Multi usagers sans NFS (texte) |
3 |
Multi usagers graphique |
Multi usagers normal (texte) |
4 |
Multi usagers graphique |
Non utilisé – peu servir de mode personnalisé si on en a besoin. |
5 |
Multi usagers graphique |
X11 – mode multi usagers graphique |
6 |
Redémarrage – redémarre l'ordinateur pour retomber dans le niveau d'exécution par défaut. |
Redémarrage |
Si on est root, on peut passer au niveau d'exécution voulu grâce à la commande init. On lui passe simplement en paramètre le numéro du niveau désiré comme ceci:
init 6
Sur Ubuntu, on peut également faire:
telinit 6
ce qui revient exactement au même. Évidemment, il faut être root pour pouvoir exécuter ces commandes (donc utilisez sudo!)
Lorsque l'on utilise la commande shutdown –h, celle-ci appelle en fait init 0. De la même façon, shutdown –r appelle init 6 et shutdown tout cours appelle init 1 (et passe donc en mode mono usager).
Sur toute autre distribution, si on est en mode texte et que l'on veut passer en mode graphique, on peut faire init 5, ce qui revient presque au même que d'appeler startx (qui démarre le mode graphique). La différence est qu'en runlevel 5, même l'écran de login sera graphique. De la même façon, on peut faire init 3 en mode graphique et se retrouver en un mode texte (uniquement console), à l'ancienne - idéal pour un serveur utilisé à distance seulement (inutile de s'encombrer d'une interface graphique).
Sur Ubuntu, les niveaux d'exécution 2 à 5 sont équivalents. Si on veut se retrouver avec un mode texte sans X-Windows, il faudra alors empêcher le service gdm de démarrer.
Retour à la table des matières de la section
Il existe plusieurs fichiers impliqués dans le démarrage d'Ubuntu. Ceux-ci sont organisés en répertoires et se trouvent tous quelque part sous /etc.
Nom de la job | Moment où la job est lancée | Effet |
control-alt-delete | Lorsque les touches Ctrl, Alt et Del sont appuyées en même temps | Redémarre l'ordinateur immédiatement en faisant un shutdown -r (qui lui appellera init 6). |
logd | Démarre toujours sauf quand le système est en train d'être arrêté ou passe en runlevel 1 | Démarre le daemon de log (qui permet de créer les logs système dans /var/log) Notez le "respawn" à la fin, qui signifie que si jamais le processus se termine d'une façon quelconque, il doit être redémarré automatiquement. |
rc1 à rc6 | Lorsque l'on passe dans le runlevel approprié | Appelle /etc/init.d/rc en lui passant le runlevel en paramètre, afin d'initier concrètement le changement de niveau d'exécution. |
rcS | Lorsque la machine est démarrée, avant que l'on soit passé à un niveau d'exécution quelconque | Appelle /etc/init.d/rcS pour démarrer les trucs communs à tous les runlevels. |
tty1 à tty6 | Lorsque l'on passe à un runlevel d'utilisation standard (2 à 5) | Démarre une console avec /sbin/getty et lui donne un nom. C'est ce qui fait qu'on a des consoles virtuelles prêtes à interagir avec nous en tout temps. Notez le "respawn" à la fin, qui signifie que si jamais le processus se termine d'une façon quelconque, il doit être redémarré automatiquement. |
rc-default | Lorsque rcS a terminé son travail, donc juste avant qu'on passe dans un niveau d'exécution | Détermine quel niveau on doit utiliser par défaut. Le script est tout de même assez complexe mais on peut modifier le niveau obtenu en changeant les deux lignes telinit 2 par telinit autre chose. Mettre un 0 ou un 6 ici est une très mauvaise idée. |
Retour à la table des matières de la section
La façon la plus évidente (mais la plus délicate) pour modifier la séquence de démarrage est de jouer avec les scripts dans /etc/init.d et les liens dans /etc/rc?.d.
C'est délicat puisque les scripts dans init.d sont généralement complexes et que l'ordre des liens est souvent important à cause de dépendances.
Si jamais vous vous aventurez là-dedans et que vous faites du grabuge, sachez que chaque script dans init.d commence par une section en commentaires qui indique les dépendances des services, les niveaux d'exécution où ils doivent démarrer et les niveaux où ils doivent s'arrêter. Il est ainsi possible de tout remettre en place.
Il y a encore parfois quelques vieilles applications de type service qui seront fournies avec un script à placer dans init.d et qui demanderont de créer des liens appropriés dans les rc?.d - mais c'est rare.
Il existe une façon plus simple de jouer avec les services, mais pour l'utiliser il faut d'abord installer un package. Pas d'inquiétude, c'est très facile. Il suffit de taper:
sudo apt-get install sysv-rc-conf
Ceci installera le package automatiquement. On pourra ensuite utiliser sysv-rc-conf pour modifier aisément, grâce à une interface pseudo-graphique, les services qui sont démarrés dans chaque niveau d'exécution. (Il faut être root, donc pensez au sudo - "q" vous permet de quitter).
L'équivalent en mode graphique se trouve dans Système->Administration->Services. On y voit alors le nom complet de chaque service (ce qui aide à comprendre à quoi ils servent) mais on ne peut que modifier la séquence du niveau d'exécution courant.
On peut également voir les jobs d'upstart et leur statut en faisant
initctl list
Finalement, on peut voir dans quel niveau d'exécution on se trouve présentement en faisant simplement
runlevel
On verra alors le niveau d'exécution précédent, suivi d'un espace, suivi du niveau courant. S'il n'y a pas de niveau précédent (puisqu'il n'a pas changé depuis le démarrage de la machine), on verra N.
Retour à la table des matières de la section
Pour arrêter un service, on peut simplement appeler son script dans /etc/init.d et lui passer "stop" en paramètre. Par exemple:
/etc/init.d/gdm stop
Pour le démarrer, on fait:
/etc/init.d/gdm start
On peut faire restart également pour plusieurs services qui supportent cette fonctionnalité (ceux pour lesquels c'est utile).
Il existe une autre syntaxe fort utile, par exemple ceci:
service networking restart
redémarre le service réseau (notez que sous Ubuntu, c'est networking, à bien d'autres endroits c'est network). Cette syntaxe est viable un peu partout, mais pour pouvoir l'utiliser sous Ubuntu, il nous faudra installer un autre package, comme bash nous le fera savoir si on essaie d'utiliser la commande service:
sudo apt-get install sysvconfig
Retour à la table des matières de la section
Niveau |
Définition Ubuntu |
Définition (autres définitions) |
0 |
|
|
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
Retour à la table des matières de la section