Chapitre 3. Initialisation du système

Table des matières

3.1. Aperçu du processus d’amorçage du système
3.1.1. Étage 1 : le BIOS
3.1.2. Étage 2 : le chargeur initial
3.1.3. Étage 3 : le système mini-Debian
3.1.4. Étage 4 : le système Debian normal
3.2. Initialisation façon SysV
3.2.1. Signification du niveau de fonctionnement (« runlevel »)
3.2.2. Configuration des niveaux de fonctionnement (« runlevel »)
3.2.3. Exemple de gestion de niveau de fonctionnement
3.2.4. Paramètre par défaut de chaque script init
3.2.5. Nom de machine (« hostname »)
3.2.6. Le système de fichiers
3.2.7. Initialisation de l’interface réseau
3.2.8. Initialisation des services réseau
3.2.9. Messages du système
3.2.10. Messages du noyau
3.3. Le système udev
3.3.1. Initialisation des modules du noyau

En tant tant qu’administrateur du système, il est sage que vous sachiez en gros comment le système Debian est démarré et configuré. Bien que les détails exacts figurent dans les fichiers sources des paquets installés et dans leurs documentations, c’est un peu pénible pour la plupart d’entre-nous.

J’ai fait de mon mieux pour fournir un aperçu rapide des points-clés du système Debian et de sa configuration pour vous servir de référence en me basant sur mes propres connaissances actuelles et antérieures et celles des autres. Comme le système Debian est une cible changeante, la situation sur le système peut avoir changé. Avant de faire une quelconque modification au système, vous devrez vous référer à la dernière documentation de chacun des paquets.

Le système informatique subit plusieurs phases de processus d’amorçage (« boot strap process ») depuis l’événement de mise sous tension jusqu’à ce qu’il offre à l’utilisateur un système d’exploitation (OS) pleinement fonctionnel.

Pour des raison de simplicité, je limiterai la discussion à une plateforme PC typique avec l’installation par défaut.

Le processus d’amorçage typique est comme une fusée à quatre étages. Chaque étage de la fusée passe le contrôle du système à l’étage suivant.

Bien entendu, elles peuvent être configurées de manière différente. Par exemple, si vous avez compilé votre propre noyau, vous pouvez sautez l’étape avec le système mini-Debian. Ne supposez donc pas que c’est le cas sur votre système avant de l’avoir vérifié vous-même.

[Note] Note

Pour les plateformes autres que les PC traditionnels tels que les systèmes SUN ou Macintosh, le BIOS sur la ROM et la partition sur le disque peuvent être assez différents (Section 9.5.2, « Configuration de la partition du disque »). Veuillez dans ce cas rechercher ailleurs une documentation spécifique à votre plateforme.

Le BIOS est la première étape du processus d’amorçage, il est est démarré par l’événement de mise sous tension. Le BIOS, qui est implanté sur une mémoire à lecture seule (ROM), est exécuté depuis l’adresse mémoire particulière à laquelle le pointeur de programme du processeur est initialisé par l’événement de mise sous tension.

Ce BIOS effectue l’initialisation de base du matériel (POST : autotest à la mise sous tension) (« power on self test ») et passe le contrôle du système à l’étape suivante que vous lui indiquez. Le BIOS est habituellement fourni avec le matériel.

L’écran de démarrage du BIOS indique en général quelle(s) touche(s) presser pour entrer dans l’écran de configuration du BIOS afin de paramétrer son comportement. Des touches courantes sont F1, F2, F10, Échap, Ins et Suppr. Si l’écran de démarrage de votre BIOS est caché par un bel écran graphique, vous pouvez essayer de presser différentes touches comme Échap pour désactiver cet écran. Ces touches dépendent beaucoup du matériel.

L’emplacement du matériel et la priorité du code lancé par le BIOS peuvent être définis depuis l’écran de configuration du BIOS. Typiquement, quelques secteurs de début du premier périphérique sélectionné qui est trouvé (disque dur, disquette, CD-ROM, …) sont chargés en mémoire et le code initial est exécuté. Ce code peut être l’un des suivants :

  • code du chargeur initial ;

  • code du noyau d’un OS de transition comme FreeDOS ;

  • code du système d’exploitation cible s’il peut tenir dans cet espace réduit.

Typiquement, le système est amorcé depuis la partition spécifiée du disque dur primaire. Les deux premiers secteurs du disque dur d’un PC traditionnel contiennent l’enregistrement maître d’amorçage (MBR). (« master boot record »). Les informations de partition du disque, y compris la sélection de l’amorçage, sont enregistrées à la fin de ce MBR. Le code initial du chargeur d’amorçage exécuté depuis le BIOS occupe le reste de ce MBR.

Le chargeur initial (« boot loader ») est le deuxième étage du processus d’amorçage, il est lancé depuis le BIOS. Il charge en mémoire l’image du noyau du système et l’image initrd et leur passe le contrôle. Cette image mémoire initiale (« initrd image ») est l’image du système de fichiers racine et sa prise en compte dépend du chargeur initial utilisé.

Le système Debian utilise normalement le noyau de Linux comme noyau de système par défaut. L’image mémoire initiale de l’actuel noyau de Linux 2.6/3.x est techniquement l’image initramfs (initial RAM filesystem : système de fichiers initial en mémoire). L’image initramfs est une archive cpio, compressée à l’aide de gzip, des fichiers du système de fichiers racine.

L’installation par défaut du système Debian place, pour la plateforme PC, le premier étage du code du chargeur initial GRUB sur le MBR. Il existe de nombreux chargeurs d’amorçage et d’options de configuration possibles.


[Avertissement] Avertissement

Ne jouez pas avec les chargeurs d’amorçage sans avoir un support de secours amorçable (CD ou disquette) créé à partir des images du paquet grub-rescue-pc. Il vous permettra de démarrer votre système sans même avoir de chargeur initial fonctionnel sur le disque dur.

Le menu de configuration de GRUB Legacy est situé en « /boot/grub/menu.lst ». Il peut, par exemple, avoir les entrées suivantes :

title           Debian GNU/Linux
root            (hd0,2)
kernel          /vmlinuz root=/dev/hda3 ro
initrd          /initrd.img

Le fichier de menu de configuration de GRUB 2 est situé en  /boot/grub/grub.cfg ». Il est automatiquement créé par « /usr/sbin/update-grub » depuis les modèles situés dans « /etc/grub.d/* » et les paramètres situés en « /etc/default/grub ». Il peut, par exemple, avoir les entrées suivantes :

menuentry "Debian GNU/Linux" {
        set root=(hd0,3)
        linux /vmlinuz root=/dev/hda3
        initrd /initrd.img
}

Les paramètres de GRUB pour ces exemples ont la signification suivante :


[Note] Note

La valeur du numéro de partition utilisé par le programme « GRUB legacy » est inférieure d’un unité à celle normalement utilisée par le noyau de Linux et les outils utilitaires. Le programme GRUB 2 corrige ce problème.

[Astuce] Astuce

Un UUID (consultez Section 9.5.3, « Accès à une partition en utilisant l’UUID ») peut être utilisé pour identifier un périphérique spécial par bloc plutôt que son nom de fichier comme « /dev/hda3 », par exemple, « root=UUID=81b289d5-4341-4003-9602-e254a17ac232 ro ».

[Astuce] Astuce

Si GRUB est le chargeur en usage, le paramètre de démarrage du noyau est spécifié dans /boot/grub/grub.cfg. Sur les systèmes Debian, il ne faut pas modifier soi-même /boot/grub/grub.cfg. Il faut modifier la valeur de GRUB_CMDLINE_LINUX_DEFAULT dans /etc/default/grub puis exécuter update-grub(8) qui se charge de la mise à jour de /boot/grub/grub.cfg.

[Astuce] Astuce

Vous pouvez démarrer un chargeur d’amorçage depuis un autre chargeur d’amorçage en utilisant une technique appelée chargement en chaîne (« chain loading »).

Consultez « info grub » et grub-install(8).

Le système mini-Debian est la troisième étape du processus d’amorçage lancée par le chargeur d’amorçage. Elle lance le noyau du système avec son système de fichiers racine en mémoire. C’est une étape préparatoire facultative du processus de démarrage.

[Note] Note

Le terme « système mini-Debian » est utilisé par l’auteur pour décrire dans ce document cette 3ème étape du processus de démarrage. On désigne souvent ce système par système initrd. Un système semblable en mémoire est utilisé par l’installateur Debian.

Le script « /init » est exécuté en tant que premier programme sur le système de fichiers racine en mémoire. C’est un script de l’interpréteur de commandes qui initialise le noyau dans l’espace utilisateur et passe le contrôle au reste de l’étage. Ce système mini-Debian offre au système d’amorçage une flexibilité comme l’ajout de modules du noyau avant le processus de démarrage principal ou le montage du système de fichiers racines en mode chiffré.

Vous pouvez interrompre cette partie du processus d’amorçage afin d’obtenir l’invite de l’interpréteur de l’administrateur en indiquant « break=init » etc. comme paramètre de démarrage du noyau. Consultez le script « /init » pour d’autres conditions d’interruption. Cet environnement d’interpréteur de commandes est suffisamment sophistiqué pour effectuer une bonne inspection du matériel de votre machine.

Les commandes disponibles avec ce système mini-Debian sont des commandes réduites et sont principalement fournies par un outil GNU appelé busybox(1).

[Attention] Attention

Vous devrez utiliser l’option « -n » de la commande mount lorsque vous êtes sur le système de fichiers en lecture seule.

Le système Debian normal est le quatrième étage du processus d’amorçage, il est lancé par le système mini-Debian. Le noyau du système mini-Debian continue de tourner dans cet environnement. Le système de fichiers racine passe de celui en mémoire à celui, réel, lu sur le disque dur.

Le programme init est le premier à être exécuté, assorti du PID=1, afin qu’il accomplisse son rôle de processus principal du démarrage, qui consiste à commander l’exécution de plusieurs programmes. Le chemin par défaut du programme init est « /sbin/init » mais il peut être modifié en passant un paramètre de démarrage au noyau, comme suit : « init=/chemin/vers/programme_init ».

Le programme d’initialisation par défaut a subi des changements :

  • Les versions de Debian antérieures à squeeze utilisent une simple initialisation façon SysV.

  • Debian wheezy improves the SysV-style init by ordering the boot sequence with LSB header and starting boot scripts in parallel.

  • Debian jessie switches its default init to the systemd for the event-driven and parallel initialization.

[Astuce] Astuce

Tous les mécanismes de redémarrage sont compatibles par l’intermédiaire des scripts « /etc/init.d/rc », « /etc/init.d/rcS », « /usr/sbin/update-rc.d » et « /usr/sbin/invoke-rc.d ».

[Astuce] Astuce

Il est possible de vérifier le niveau d’exécution courant de la commande init du système avec la commande « ps --pid 1 -f ».

Tableau 3.3. Liste d’utilitaires d’amorçage initial pour le système Debian :

paquet popcon taille description
initscripts V:863, I:999 277 scripts pour initialiser et arrêter le système
sysvinit-core V:27, I:31 247 Utilitaires init(8) de type System-V
sysv-rc V:865, I:998 221 Mécanisme de changement de niveau de fonctionnement de type System-V
sysvinit-utils V:865, I:998 206 Utilitaires de type System-V (startpar(8), bootlogd(8), …)
lsb-base V:864, I:999 36 Linux Standard Base 3.2 fonctionnalité de script d’initialisation
insserv V:811, I:946 183 outil pour organiser la séquence de démarrage en utilisant les dépendances du script LSB de init.d
upstart V:0, I:0 1832 démon init(8) basé sur des événements pour la concurrence (remplacement de sysvinit)
systemd V:122, I:141 11723 démon init(8) basé sur des événements pour la concurrence (remplacement de sysvinit)
readahead-fedora V:4, I:8 157 readahead(8) pour précharger les fichiers nécessaires au démarrage ;
uswsusp V:8, I:22 575 outil permettant d’utiliser le programme de l’espace utilisateur de mise en veille fourni par Linux
kexec-tools V:1, I:7 289 outil kexec pour le redémarrage par kexec(8) (redémarrage à chaud)
bootchart V:0, I:1 46 analyseur des performances du processus de démarrage
bootchart-view V:0, I:1 211 analyseur des performances du processus de démarrage (virtualisation)
mingetty V:0, I:3 24 getty(8) en mode console uniquement
mgetty V:0, I:2 360 modem intelligent (« smart modem ») remplaçant de getty(8)

[Astuce] Astuce

Le paquet readahead-fedora peut accélérer le démarrage d’un système équipé d’une quantité suffisante de DRAM.

[Astuce] Astuce

Vous trouverez des conseils actualisés pour accélérer le processus de démarrage sur Debian wiki:BootProcessSpeedup.

Cette section explique de quelle manière le système était anciennement démarré avec la bonne vieille initialisation façon SysV. Votre système Debian ne fonctionne pas exactement de cette manière mais il est très instructif de connaître ces bases, puisque les systèmes d’initialisation plus récents tendent à offrir des fonctionnalités équivalentes.

Le processus de démarrage façon SysV franchit essentiellement les étapes suivantes :

  1. Le système Debian passe au niveau de fonctionnement N (« runlevel N ») (aucun) pour initialiser le système selon la description de « /etc/inittab ».

  2. Le système Debian passe au niveau de fonctionnement S pour initialiser le système en mode utilisateur unique afin de terminer l’initialisation matérielle, etc.

  3. Pour démarrer les services du système, le système Debian passe alors à l’un des niveaux de fonctionnement multi-utilisateurs (2 à 5) indiqués.

Le niveau de fonctionnement initial utilisé pour le mode multi-utilisateurs est indiqué par le paramètre de démarrage « init= » du noyau ou par la ligne « initdefault » du fichier « /etc/inittab ». Le système Debian tel qu’il est installé démarre au niveau de fonctionnement 2.

Tous les fichiers de scripts réels exécutés par le système init sont situés dans le répertoire « /etc/init.d/ ».

Consultez init(8), inittab(5), et "/usr/share/doc/sysv-rc/README.runlevels.gz" pour une explication précise.

Chaque niveau de fonctionnement utilise un répertoire pour sa configuration, il possède la signification particulière décrite ci-dessous :


Vous pouvez aussi changer de niveau de fonctionnement depuis la console, par exemple 4 en faisant ce qui suit :

$ sudo telinit 4
[Attention] Attention

Le système Debian n’assigne pas par avance de différence spéciale de signification entre les niveaux de fonctionnement compris entre 2 et 5.. L’administrateur du système d’un système Debian peut modifier ce comportement. (C’est-à-dire que Debian n’est ni Red Hat Linux, ni Solaris de Sun Microsystems, ni HP-UX de Hewlett Packard, ni AIX d’IBM, ni…)

[Attention] Attention

Le système Debian ne remplit pas les répertoires des niveaux d’exécution entre 7 et 9 lors de l’installation. Les variantes d’UNIX traditionnelles n’utilisent pas ces niveaux d’exécution.

Lorsque la commande init(8) ou telinit(8) arrive au niveau « <n> », le système exécute essentiellement les scripts d’initialisation comme suit.

  1. Les noms de scripts de « /etc/rc<n>.d/ » commençant par un « K » sont exécutés dans l’ordre alphabétique avec le paramètre unique « stop » (arrêt des services).

  2. Les noms de scripts de « /etc/rc<n>.d/ » commençant par un « S » sont exécutés dans l’ordre alphabétique avec le paramètre unique « start » (lancement des services).

Par exemple, si vous avez les liens « S10sysklogd » et « S20exim4 » dans un répertoire de niveau de fonctionnement, « S10sysklogd » qui est lié symboliquement à « ../init.d/sysklogd » sera lancé avant « S20exim4 » qui est lié symboliquement à « ../init.d/exim4 ».

Ce simple système séquentiel d’initialisation est le système de démarrage classique de type System V tel qu’il a été utilisé jusqu’au système Debian Lenny.

Les systèmes Debian récents sont optimisés pour exécuter les scripts simultanément.

[Avertissement] Avertissement

Faire des modifications aux liens symboliques se trouvant dans « /etc/rcS.d/ » est déconseillé à moins d’en savoir davantage que le responsable du paquet.

Définissons, par exemple, définissons un niveau de fonctionnement du système comme Red Hat Linux de la manière suivante :

  • init démarre le système au niveau 3 qui est la valeur par défaut ;

  • init ne démarre pas gdm3(1) aux niveaux 0,1,2,6 ;

  • init démarre gdm3(1) aux niveaux 3,4,5 ;

Cela peut être fait en éditant le fichier « /etc/inittab » afin de modifier les niveaux de lancement et en utilisant des outils conviviaux de gestion des niveaux de fonctionnement tels que sysv-rc-conf ou bum pour éditer le niveau de fonctionnement. Si vous ne devez utiliser que la ligne de commande, voici comment faire (après l’installation par défaut du paquet gdm3 et sa sélection comme gestionnaire d’affichage).

# cd /etc/rc2.d ; mv S21gdm3 K21gdm3
# cd /etc ; perl -i -p -e 's/^id:.:/id:3:/' inittab

Veuillez noter que le fichier « /etc/X11/default-display-manager » est vérifié lors du démarrage des démons de gestion d’affichage : xdm, gdm3, kdm, et wdm.

[Note] Note

Vous pouvez toujours lancer X depuis l’interpréteur de commandes de n’importe quelle console avec la commande startx(1).

Le paramètre par défaut de chacun des scripts d’initialisation de « /etc/init.d/ » est donné par le fichier correspondant se trouvant dans « /etc/default/ » qui ne contient que des assignations de variables d’environnement. Ce choix de nom de répertoire est spécifique au système Debian. Il est en gros l’équivalent du répertoire « /etc/sysconfig » qu’on trouve dans Red Hat Linux et d’autres distributions. Par exemple, « /etc/default/cron » peut être utilisé pour contrôler la manière dont fonctionne « /etc/init.d/cron ».

Le fichier « /etc/default/rcS » peut être utilisé pour personnaliser les valeurs par défaut au moment du démarrage demotd(5), sulogin(8), etc.

Si vous ne pouvez pas obtenir le comportement que vous souhaitez en modifiant ces variables, alors vous pouvez modifier les scripts init eux-mêmes. Ce sont des fichiers de configuration qui peuvent être édités par les administrateurs du système.

De nombreux services réseau (consultez Chapitre 6, Applications réseau) sont directement démarrés en tant que démons sous le mode multi-utilisateurs lors du démarrage du système par le script d’initialisation, par exemple « /etc/rc2.d/S20exim4 » (pour RUNLEVEL=2) qui est un lien symbolique vers « /etc/init.d/exim4 ».

Certains services réseau peuvent être démarrés à la demande en utilisant le super-serveur inetd (ou un équivalent). inetd est lancé lors au démarrage du système par « /etc/rc2.d/S20inetd » (pour RUNLEVEL=2) qui est un lien symbolique vers « /etc/init.d/inetd ». Fondamentalement, inetd permet à un démon en cours de fonctionnement d’en appeler plusieurs autres, ce qui réduit la charge du système.

Lorsqu’une requête pour un service arrive au super-serveur inetd, le protocole et le service sont identifiés par une recherche dans les bases de données se trouvant dans « /etc/protocols » et « /etc/services ». inetd recherche ensuite un service Internet normal dans la base de données « /etc/inetd.conf » ou un service basé sur Open Network Computing Remote Procedure Call (ONC RPC)/Sun RPC dans « /etc/rpc.conf ».

Parfois, inetd ne lance pas directement le serveur voulu mais exécute le programme d’enveloppe du démon TCP/IP tcpd(8) avec, en paramètre dans « /etc/inetd.conf », le service demandé. Dans ce cas, tcpd lance le serveur approprié après avoir enregistré la requête dans le journal et avoir fait quelques autres vérifications à l’aide de « /etc/hosts.deny » et « /etc/hosts.allow ».

Afin d’assurer la sécurité du système, désactivez autant de services réseau que possible. Consultez Section 4.6.4, « Restreindre l’accès à certains services du serveur ».

Consultez inetd(8), inetd.conf(5), protocols(5), services(5), tcpd(8), hosts_access(5), hosts_options(5), rpcinfo(8), portmap(8) et « /usr/share/doc/portmap/portmapper.txt.gz ».

À partir de la version 2.6 du noyau Linux, le système udev fournit un mécanisme de découverte et d’initialisation automatique du matériel (consultez udev(7)). Lors de la découverte de chaque périphérique par le noyau, le système udev lance un processus utilisateur qui utilise les informations provenant du système de fichiers sysfs (consultez Section 1.2.12, « procfs et sysfs »), charge les modules du noyau nécessaires pour sa prise en charge en utilisant le programme modprobe(8) (consultez Section 3.3.1, « Initialisation des modules du noyau ») et crée les nœuds de périphériques en conséquence.

[Astuce] Astuce

Si « /lib/modules/<kernel-version>/modules.dep » n’a pas été proprement créé par depmod(8) pour quelque raison, les modules peuvent ne pas être chargés par le système udev comme on le souhaiterait. Lancez « depmod -a » pour corriger ce problème.

Le nom des nœuds de périphériques peut être configuré par les fichiers de règle de udev se trouvant dans « /etc/udev/rules.d/ ». Les règles actuelles par défaut tendent à créer des noms générés dynamiquement ce qui donne des noms de périphériques non statiques excepté pour les périphériques cd et réseau. En ajoutant vos règles personnalisées semblables à celles existantes pour les périphériques cd et réseau, vous pouvez aussi créer des noms de périphériques statiques pour les autres périphériques comme les clés USB. Consultez « Écrire des règles udev » ou « /usr/share/doc/udev/writing_udev_rules/index.html ».

Comme le système udev est une cible quelque peu mouvante, je laisse les détails pour d’autres documentations et je ne donnerai ici qu’un minimum d’informations.

[Astuce] Astuce

Les nœuds de périphériques n’ont pas besoin d’être statiques pour les règles de montage se trouvant dans « /etc/fstab ». Vous pouvez utiliser UUID à la place de leur nom de périphérique tel que« /dev/sda » pour monter les périphériques. Consultez Section 9.5.3, « Accès à une partition en utilisant l’UUID ».

Le programme modprobe(8) nous permet de configurer, depuis un processus utilisateur, un noyau Linux en cours d’exécution en ajoutant ou en supprimant des modules du noyau. Le système udev (consultez Section 3.3, « Le système udev ») en automatise l’appel afin d’aider à l’initialisation du module du noyau.

Il existe des modules non liés au matériel et des modules qui pilotent des éléments matériels particuliers comme les suivants qui demandent à être préchargés en les déclarant dans le fichier « /etc/modules » (consultez modules(5)).

Les fichiers de configuration du programme modprobe(8) se trouvent dans le répertoire « /etc/modprobes.d/ » comme c’est expliqué dans modprobe.conf(5). (Si vous souhaitez que certains modules du noyau ne soient pas chargés automatiquement, vous pouvez les mettre en liste noire dans le fichier« /etc/modprobes.d/blacklist »).

Le fichier « /lib/modules/<version>/modules.dep » généré par le programme depmod(8) décrit les dépendances des modules utilisés par le programme modprobe(8).

[Note] Note

Si vous rencontrez des problèmes de chargement de modules lors du chargement des modules au démarrage ou avec modprobe(8), « depmod -a » peut résoudre ces problèmes en reconstruisant « modules.dep ».

Le programme modinfo(8) affiche des informations concernant les modules du noyau.

Le programme lsmod(8) formate de manière agréable le contenu de « /proc/modules », affichant quels sont les modules du noyau actuellement chargés.

[Astuce] Astuce

Vous pouvez identifier le matériel exact installé sur votre système. Consultez Section 9.4.3, « Identification du matériel ».

[Astuce] Astuce

Vous pouvez configurer le matériel au moment du démarrage pour activer les fonctionnalités désirées de ce matériel. Consultez Section 9.4.4, « Configuration matérielle ».

[Astuce] Astuce

Vous pouvez probablement ajouter la prise en charge d’un périphérique particulier en recompilant le noyau. Consultez Section 9.9, « Le noyau ».