1.2. Examen détaillé du processus de démarrage

Le début du processus de démarrage varie en fonction de la plate-forme matérielle utilisée. Toutefois, une fois le noyau trouvé et chargé par le chargeur de démarrage, le processus de démarrage par défaut est identique pour toutes les architectures. Ce chapitre se concentre principalement sur l'architecture x86.

1.2.1. Le BIOS

Lors du démarrage d'un ordinateur x86, le processeur recherche le programme BIOS (de l'anglais Basic Input/Output System) dans la mémoire morte (ROM) de la carte mère et l'exécute. Le BIOS est le plus bas niveau d'interface pour les périphériques et contrôle la première étape du processus de démarrage. C'est la raison pour laquelle le BIOS est enregistré en lecture-seule dans la mémoire morte et peut ainsi être utilisé à tout moment.

D'autres plates-formes utilisent différents programmes pour réaliser des tâches de bas niveau plus ou moins équivalentes à celles effectuées par le BIOS sur un système x86. Par exemple, les ordinateurs basés sur Itanium utilisent le Shell EFI (de l'anglais Extensible Firmware Interface).

Une fois chargé, le BIOS teste le système, recherche et vérifie les périphériques et trouve ensuite un périphérique valide qui sera utilisé pour amorcer le système. Normalement, il vérifie d'abord les lecteurs de disquettes et les lecteurs CD-ROM présents afin de trouver un support amorçable ; s'il n'en trouve aucun, il cherche sur les disques durs du système. Dans la plupart des cas, l'ordre des unités recherchées lors du démarrage peut être contrôlé par un paramètre du BIOS ; il cherche sur le périphérique IDE maître sur le bus IDE principal. Le BIOS charge ensuite en mémoire tout programme résidant sur le premier secteur de ce périphérique appelé bloc de démarrage maître ou MBR(de l'anglais Master Boot Record). Le MBR a une taille de 512 octets seulement et contient des instructions de codes machine, appelée chargeur de démarrage, qui sont nécessaires pour démarrer l'ordinateur ainsi que la table des partitions. Une fois que le BIOS trouve et charge en mémoire le programme du chargeur de démarrage, il lui cède le contrôle du processus de démarrage.

1.2.2. Le chargeur de démarrage

Cette section examine le chargeur de démarrage par défaut pour la plate-forme x86, à savoir GRUB. Selon l'architecture du système, le processus de démarrage peut varier légèrement. Reportez-vous à la Section 1.2.2.1 pour obtenir un bref aperçu des chargeurs de démarrage autres que ceux utilisés pour x86. Pour obtenir de plus amples informations sur la configuration et l'utilisation de GRUB, consultez le Chapitre 2.

Un chargeur de démarrage pour la plate-forme x86 fonctionne au minimum en deux étapes. La première est un petit binaire de code machine sur le MBR. Son seul rôle est de localiser le chargeur de démarrage pour l'Étape 2 et d'en charger la première partie en mémoire.

GRUB a l'avantage de pouvoir lire les partitions ext2 et ext3[1] et de charger son fichier de configuration — /boot/grub/grub.conf— au moment du démarrage. Pour obtenir de plus amples informations sur la façon de modifier ce fichier, reportez-vous à la Section 2.7.

TuyauAstuce
 

Si vous mettez à niveau le noyau en utilisant l'application Agent de mise à jour Red Hat, le fichier de configuration du chargeur de démarrage sera mis à jour automatiquement. De plus amples informations sur Red Hat Network se trouvent en ligne à l'adresse suivante : https://rhn.redhat.com/.

Une fois que le chargeur de démarrage Étape 2 est en mémoire, il affiche l'écran graphique indiquant à l'utilisateur les différents systèmes d'exploitation ou noyaux qu'il doit charger en fonction de sa configuration. Sur cet écran, l'utilisateur peut, à l'aide des touches fléchées, choisir le système d'exploitation ou le noyau qu'il souhaite charger et valider ce choix en appuyant sur la touche [Entrée]. Si l'utilisateur n'appuie sur aucune touche avant qu'un certain laps de temps - configurable - ne se soit écoulé, le chargeur de démarrage chargera la sélection par défaut.

NoteRemarque
 

Si la prise en charge par le noyau de Symmetric Multi-Processor (SMP) est installée, plusieurs options seront proposées lors du premier démarrage de votre système. Dans une telle situation, GRUB affiche Red Hat Enterprise Linux (<kernel-version>-smp), qui est le noyau SMP et Red Hat Enterprise Linux (<kernel-version>), qui est pour des processeurs simples (où <kernel-version> correspond à la version du noyau).

Si vous rencontrez des problèmes en utilisant le noyau SMP, sélectionnez le noyau non-SMP au redémarrage.

Une fois que le chargeur de démarrage Étape 2 a déterminé le noyau à lancer, il localise le binaire de noyau correspondant dans le répertoire /boot/. Le binaire du noyau est baptisé d'après le format— fichier /boot/vmlinuz-<kernel-version> (où <kernel-version> correspond à la version du noyau spécifiée dans les paramètres du chargeur de démarrage).

Pour obtenir des instructions sur la manière d'utiliser le chargeur de démarrage pour transmettre au noyau des arguments en ligne de commande, reportez-vous au Chapitre 2. Pour des informations sur la manière de changer le niveau d'exécution à l'invite du chargeur de démarrage, reportez-vous à la Section 2.8.

Le chargeur de démarrage place alors plusieurs images initramfs appropriées (ou une seule) en mémoire. Ensuite, par l'intermédiaire de cpio, le noyau décompresse ces images présentes dans la mémoire et les met sur /boot/, un système de fichiers virtuel basé sur la RAM. Les images initramfs sont utilisées par le noyau pour charger les pilotes et modules nécessaires au démarrage du système. Ce processus s'avère particulièrement important si votre système dispose de disques durs SCSI ou s'il utilise le système de fichiers ext3.

Une fois que le noyau et une ou plusieurs images initramfs sont chargées en mémoire, le chargeur de démarrage cède le contrôle du processus de démarrage au noyau.

Pour obtenir une présentation plus détaillé du chargeur de démarrage GRUB, reportez-vous au Chapitre 2.

1.2.2.1. Chargeurs de démarrage pour d'autres architectures

Une fois que le noyau se charge et qu'il passe les commandes à init, les mêmes événements se produisent sur toutes les architectures. La différence essentielle entre le processus de démarrage de chaque architecture réside dans le choix de l'application utilisée pour trouver et charger le noyau.

Par exemple, l'architecture Itanium utilise le chargeur de démarrage ELILO, l'architecture eServer pSeries d'IBM utilise YABOOT et les systèmes IBM s390 et eServer zSeries utilisent le chargeur de démarrage z/IPL.

Consultez le Guide d'installation de Red Hat Enterprise Linux spécifique à ces plates-formes pour obtenir de plus amples informations sur la manière de configurer leurs chargeurs de démarrage.

1.2.3. Le noyau

Lors du chargement du noyau, ce dernier non seulement initialise et configure immédiatement la mémoire de l'ordinateur, mais il configure également les divers composants matériels reliés au système, y compris tous les processeurs, les sous-systèmes d'E/S ainsi que les périphériques de stockage. Il recherche ensuite la ou les image(s) initrd compressée(s) dans un emplacement prédéterminé de la mémoire, effectue la décompression directement sur /sysroot/ et finalement charge tous les pilotes nécessaires. Ensuite, il initialise les dispositifs virtuels associés aux systèmes de fichiers, tels que LVM ou RAID logiciel, avant d'achever les processus initramfs et de libérer toute la mémoire que l'image du disque occupait.

Le noyau crée alors un dispositif root, monte la partition root en lecture-seule et libère la mémoire non-utilisée.

À ce stade, le noyau est chargé en mémoire et est désormais opérationnel. Toutefois, en l'absence de toute application offrant à l'utilisateur la possibilité de donner des informations utiles au système, on ne peut pas faire grand chose avec ce système.

Afin de configurer l'environnement utilisateur, le noyau exécute le progamme /sbin/init.

1.2.4. Le programme /sbin/init

Le programme /sbin/init (aussi appelé init) coordonne le reste du processus de démarrage et configure l'environnement de l'utilisateur.

Lorsque la commande init est lancée, elle devient le parent ou grand-parent de tous les processus qui sont lancés automatiquement sur le système. Tout d'abord, elle exécute le script /etc/rc.d/rc.sysinit qui définit le chemin d'accès de l'environnement, démarre swap, contrôle les systèmes de fichiers et exécute toutes les autres étapes nécessaires à l'initialisation du système. Par exemple, la plupart des systèmes utilisant une horloge, rc.sysinit lit le fichier de configuration /etc/sysconfig/clock pour initialiser l'horloge matérielle. Autre exemple : s'il existe des processus de port série spéciaux qui doivent être initialisés, rc.sysinit exécute le fichier /etc/rc.serial.

Ensuite la commande init exécute le script /etc/inittab qui décrit la manière selon laquelle le système devrait être configuré à chaque niveau d'exécution, SysV init runlevel. Les niveaux d'exécution sont des états ou modes définis par les services énumérés dans le répertoires /etc/rc.d/rc<x>.d/ de SysV, où <x> correspond au numéro du niveau d'exécution. Pour obtenir de plus amples informations sur les niveaux d'exécution (ou SysV init runlevels), reportez-vous à la Section 1.4.

Ensuite, la commande init configure la bibliothèque de fonctions sources, /etc/rc.d/init.d/functions, pour le système. Celle-ci indique comment démarrer ou arrêter un programme et comment déterminer le PID d'un programme.

Le programme init démarre l'ensemble des processus d'arrière-plan en consultant le répertoire rc approprié au niveau d'exécution spécifié comme valeur par défaut dans /etc/inittab. Les répertoires rc sont numérotés de façon à correspondre au niveau d'exécution qu'ils représentent. Par exemple, /etc/rc.d/rc5.d/ est le répertoire correspondant au niveau d'exécution 5.

En démarrant au niveau d'exécution 5, le programme init examine le répertoire /etc/rc.d/rc5.d/ afin de déterminer les processus à arrêter et à démarrer.

Ci-dessous figure un exemple de listing pour un répertoire /etc/rc.d/rc5.d/ :

K05innd -> ../init.d/innd
K05saslauthd -> ../init.d/saslauthd
K10dc_server -> ../init.d/dc_server
K10psacct -> ../init.d/psacct
K10radiusd -> ../init.d/radiusd
K12dc_client -> ../init.d/dc_client
K12FreeWnn -> ../init.d/FreeWnn
K12mailman -> ../init.d/mailman
K12mysqld -> ../init.d/mysqld
K15httpd -> ../init.d/httpd
K20netdump-server -> ../init.d/netdump-server
K20rstatd -> ../init.d/rstatd
K20rusersd -> ../init.d/rusersd
K20rwhod -> ../init.d/rwhod
K24irda -> ../init.d/irda
K25squid -> ../init.d/squid
K28amd -> ../init.d/amd
K30spamassassin -> ../init.d/spamassassin
K34dhcrelay -> ../init.d/dhcrelay
K34yppasswdd -> ../init.d/yppasswdd
K35dhcpd -> ../init.d/dhcpd
K35smb -> ../init.d/smb
K35vncserver -> ../init.d/vncserver
K36lisa -> ../init.d/lisa
K45arpwatch -> ../init.d/arpwatch
K45named -> ../init.d/named
K46radvd -> ../init.d/radvd
K50netdump -> ../init.d/netdump
K50snmpd -> ../init.d/snmpd
K50snmptrapd -> ../init.d/snmptrapd
K50tux -> ../init.d/tux
K50vsftpd -> ../init.d/vsftpd
K54dovecot -> ../init.d/dovecot
K61ldap -> ../init.d/ldap
K65kadmin -> ../init.d/kadmin
K65kprop -> ../init.d/kprop
K65krb524 -> ../init.d/krb524
K65krb5kdc -> ../init.d/krb5kdc
K70aep1000 -> ../init.d/aep1000
K70bcm5820 -> ../init.d/bcm5820
K74ypserv -> ../init.d/ypserv
K74ypxfrd -> ../init.d/ypxfrd
K85mdmpd -> ../init.d/mdmpd
K89netplugd -> ../init.d/netplugd
K99microcode_ctl -> ../init.d/microcode_ctl
S04readahead_early -> ../init.d/readahead_early
S05kudzu -> ../init.d/kudzu
S06cpuspeed -> ../init.d/cpuspeed
S08ip6tables -> ../init.d/ip6tables
S08iptables -> ../init.d/iptables
S09isdn -> ../init.d/isdn
S10network -> ../init.d/network
S12syslog -> ../init.d/syslog
S13irqbalance -> ../init.d/irqbalance
S13portmap -> ../init.d/portmap
S15mdmonitor -> ../init.d/mdmonitor
S15zebra -> ../init.d/zebra
S16bgpd -> ../init.d/bgpd
S16ospf6d -> ../init.d/ospf6d
S16ospfd -> ../init.d/ospfd
S16ripd -> ../init.d/ripd
S16ripngd -> ../init.d/ripngd
S20random -> ../init.d/random
S24pcmcia -> ../init.d/pcmcia
S25netfs -> ../init.d/netfs
S26apmd -> ../init.d/apmd
S27ypbind -> ../init.d/ypbind
S28autofs -> ../init.d/autofs
S40smartd -> ../init.d/smartd
S44acpid -> ../init.d/acpid
S54hpoj -> ../init.d/hpoj
S55cups -> ../init.d/cups
S55sshd -> ../init.d/sshd
S56rawdevices -> ../init.d/rawdevices
S56xinetd -> ../init.d/xinetd
S58ntpd -> ../init.d/ntpd
S75postgresql -> ../init.d/postgresql
S80sendmail -> ../init.d/sendmail
S85gpm -> ../init.d/gpm
S87iiim -> ../init.d/iiim
S90canna -> ../init.d/canna
S90crond -> ../init.d/crond
S90xfs -> ../init.d/xfs
S95atd -> ../init.d/atd
S96readahead -> ../init.d/readahead
S97messagebus -> ../init.d/messagebus
S97rhnsd -> ../init.d/rhnsd
S99local -> ../rc.local

Comme le montre ce listing, aucun des scripts qui lancent et arrêtent vraiment les services n'est réellement situé dans le répertoire /etc/rc.d/rc5.d/. Tous les fichiers dans /etc/rc.d/rc5.d/ sont en fait des liens symboliques qui pointent vers les scripts situés dans le répertoire /etc/rc.d/init.d/. Des liens symboliques sont utilisés dans chacun des répertoires rc afin que les niveaux d'exécution puissent être reconfigurés en créant, modifiant et supprimant les liens symboliques, et ce, sans affecter les scripts auxquels ils font référence.

Le nom de chaque lien symbolique commence soit par K, soit par S. Les liens K correspondent à des processus arrêtés à ce niveau d'exécution, tandis que les liens S correspondent à des processus démarrés à ce niveau d'exécution.

La commande init arrête tout d'abord tous les liens symboliques K du répertoire en émettant la commande /etc/rc.d/init.d/<command> stop, <command> correspondant au processus à arrêter. Elle démarre ensuite tous les liens symboliques S en émettant la commande /etc/rc.d/init.d/<command> start.

TuyauAstuce
 

Une fois que le système a terminé son démarrage, il est possible d'établir une connexion en tant que super-utilisateur et d'exécuter ces mêmes scripts pour démarrer et arrêter des services. Par exemple, la commande /etc/rc.d/init.d/httpd stop arrêtera le Serveur HTTP Apache.

Chacun des liens symboliques est numéroté de façon à établir l'ordre de démarrage. L'ordre dans lequel les services sont démarrés ou arrêtés peut être modifié en changeant ce numéro. Plus le numéro est bas, plus le démarrage se produira tôt. Les liens symboliques disposant du même numéro sont démarrés par ordre alphabétique.

NoteRemarque
 

Une des dernières choses que le programme init exécute est le fichier /etc/rc.d/rc.local. Ce dernier est utilisé pour la personnalisation du système. Reportez-vous à la Section 1.3 pour de plus amples informations sur l'utilisation du fichier rc.local.

Une fois que la commande init a progressé dans le répertoire rc approprié pour le niveau d'exécution, le script /etc/inittab crée un processus /sbin/mingetty pour chaque console virtuelle (invites de connexion) assignée au niveau d'exécution. Les niveaux d'exécution de 2 à 5 ont tous six consoles virtuelles, tandis que le niveau d'exécution 1 (mode mono-utilisateur) n'a lui qu'une seule console virtuelle et que les niveaux d'exécution 0 et 6 n'en ont eux aucune. Le processus /sbin/mingetty ouvre des chemins de communication vers les périphériques tty[2], définit leurs modes, affiche l'invite de connexion, accepte le nom et le mot de passe de l'utilisateur, puis commence le processus de connexion.

Au niveau d'exécution 5, /etc/inittab exécute un script appelé /etc/X11/prefdm. Le script prefdm exécute le gestionnaire d'affichage X préféré [3]gdm, kdm ou xdm, en fonction de ce qui est contenu dans le fichier /etc/sysconfig/desktop.

Une fois l'ensemble du processus terminé, le système fonctionne à un niveau d'exécution 5 et affiche un écran de connexion.

Notes

[1]

GRUB lit les systèmes de fichiers ext3 en tant que ext2, en abandonnant le fichier journal. Reportez-vous au chapitre intitulé Le système de fichiers ext3 du Guide d'administration système de Red Hat Enterprise Linux pour de plus amples informations sur le système de fichiers ext3.

[2]

Consultez la Section 5.3.11 pour obtenir des informations supplémentaires sur les périphériques tty.

[3]

Consultez la Section 7.5.2 pour obtenir davantage d'informations sur les gestionnaires d'affichage.