Dans les coulisses du processus de démarrage

NoteRemarque
 

Cette section porte principalement sur le processus de démarrage x86. Le processus de démarrage de votre ordinateur peut varier légèrement en fonction de son architecture. Toutefois, le processus de démarrage par défaut de Red Hat Linux est identique pour toutes les architectures après que le noyau a été trouvé et chargé par l'ordinateur. Reportez-vous à la la section intitulée Différences du processus de démarrage d'autres architectures pour obtenir plus de renseignements au sujet de processus de démarrage non x86.

Lorsque l'on démarre un ordinateur, le processeur recherche le BIOS (Basic Input/Output System) à la fin de la mémoire du système et l'exécute. Le programme du BIOS est écrit en lecture seulement dans la mémoire permanente et peut toujours être utilisé. 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.

Le BIOS teste le système, recherche et vérifie les périphériques et recherche ensuite une unité qui sera utilisée pour amorcer le système. Normalement, il vérifie le lecteur de disquette (ou le lecteur de CD-ROM sur de nombreux ordinateurs plus récents) afin de trouver un support amorçable, s'il y en a un, puis se tourne vers le disque dur. L'ordre des unités utilisées pour le démarrage est généralement contrôlé par une configuration particulière du BIOS sur le système. Après avoir installé Red Hat Linux sur le disque dur de l'ordinateur, le BIOS cherche un bloc de démarrage maître (MBR) en commençant par le premier secteur du premier disque dur, charge son contenu dans la mémoire et lui donne le contrôle.

Ce code MBR cherche ensuite la première partition active et lit son enregistrement d'amorçage. Cet enregistrement contient les instructions sur la façon de charger LILO (LInux LOader), le chargeur de démarrage. Le MBR charge LILO, qui prend alors la relève (si LILO est installé dans le MBR). Dans la configuration par défaut de Red Hat Linux, LILO utilise les paramètres dans le MBR pour afficher les options de démarrage et permet à l'utilisateur de spécifier quel système d'exploitation doit être lancé.

Cela entraîne la question suivante : "Comment LILO fait-il dans le MBR pour savoir ce qu'il faut faire lorsque le MBR est lu?". Les instructions pour LILO sont en fait déjà écrites à cet endroit par l'entremise de lilo et du fichier de configuration /etc/lilo.conf.

Options dans /etc/lilo.conf

En général, vous n'avez pas à changer le bloc de démarrage maître sur votre disque dur à moins d'avoir besoin d'amorcer un système d'exploitation venant tout juste d'être installé ou de vouloir utiliser un nouveau noyau. Si vous devez créer un nouveau bloc de démarrage maître au moyen de LILO, mais utilisant une configuration différente, vous devrez modifier /etc/lilo.conf et exécuter lilo encore une fois.

AvertissementAvertissement
 

Si vous prévoyez de modifier /etc/lilo.conf, assurez-vous de faire une copie de sauvegarde du fichier avant d'y apporter des changements. De plus, assurez-vous d'avoir une disquette d'amorçage fonctionnel à votre disposition, de sorte que vous puissiez démarrer le système et apporter des modifications au MBR s'il y a des problèmes. Lisez les pages de manuel concernant mkbootdisk pour en savoir plus sur la création d'une disquette d'amorçage.

Le fichier /etc/lilo.conf est utilisé par lilo pour déterminer quel(s) système(s) d'exploitation utiliser ou avec quel noyau commencer, ainsi que pour savoir où l'installer (exemple : /dev/hda pour le premier disque dur IDE). Un fichier /etc/lilo.conf échantillon ressemble à ceci :

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
lba32
default=linux

image=/boot/vmlinuz-2.4.0-0.43.6
	label=linux
	initrd=/boot/initrd-2.4.0-0.43.6.img
	read-only
	root=/dev/hda5

other=/dev/hda1
	label=dos

Cet exemple montre un système qui est configuré pour amorcer deux systèmes d'exploitation : Red Hat Linux et DOS. Voici plus de détails sur certaines des lignes de ce fichier (votre fichier /etc/lilo.conf pourrait être légèrement différent) :

LILO affiche ensuite l'écran Red Hat Linux initial sur lequel apparaissent les systèmes d'exploitation ou les noyaux qui, selon la configuration choisie, doivent être amorcés. Si vous n'avez installé que Red Hat Linux et n'avez rien changé dans /etc/lilo.conf, vous ne verrez que l'option linux. Si vous avez configuré LILO de façon à ce qu'il amorce également d'autres systèmes d'exploitation, cet écran vous donnera la possibilité de choisir quel système amorcer. Utilisez les flèches de direction pour choisir le système d'exploitation désiré et appuyez sur Entrée.

Si vous désirez avoir une invite pour donner des commandes à LILO, appuyez sur Cntl-X. LILO affiche alors une invite LILO: sur l'écran et attend pendant une période de temps préétablie que l'utilisateur entre une commande (cette période d'attente de LILO est déterminée par la ligne timeout dans le fichier /etc/lilo.conf). Si le fichier /etc/lilo.conf est programmé pour donner un choix de systèmes d'exploitation à LILO, à ce moment vous pourrez taper l'étiquette de l'un où l'autre des systèmes d'exploitation que vous désirez amorcer.

Si LILO amorce Linux, il charge d'abord le noyau dans la mémoire, un fichier vmlinuz (avec un numéro de version, tel que vmlinuz-2.4.0-xx par exemple) qui se trouve dans le répertoire /boot. Ensuite, le noyau donne le contrôle à init.

Ainsi, le noyau étant chargé dans la mémoire et opérationnel, Linux est déjà amorcé, bien qu'à un niveau encore très bas. Cependant, comme aucune application n'utilise le noyau et que l'utilisateur ne peut donner d'informations utiles au système, on ne peut en faire grand chose. Le programme init résout ce problème en démarrant les divers services qui permettent au système de jouer son rôle.

Init

Le noyau trouve init dans /sbin et l'exécute ; init coordonne ensuite le reste du processus de démarrage.

Lorsque init est lancé, il devient l'élément parent ou grand-parent de tous les processus qui sont lancés automatiquement sur votre système Red Hat Linux. D'abord, il exécute le script /etc/rc.d/rc.sysinit, qui établit les chemins d'exécution par défaut, initialise le swap, vérifie les systèmes de fichiers, etc. Bref, rc.sysinit s'occupe de tout ce dont a besoin votre système lors de son initialisation. Exemple : sur un système en réseau, rc.sysinit utilise l'information contenue dans le fichier /etc/sysconfig/network pour initialiser le processus réseau. La plupart des systèmes utilisent une horloge, donc rc.sysinit utilise le fichier /etc/sysconfig/clock sur ceux-ci pour initialiser l'horloge. Si vous avez des processus de port série spéciaux à initialiser, rc.sysinit peut aussi exécuter rc.serial.

Ensuite, init exécute le script /etc/inittab, qui décrit comment le système doit être configuré dans chaque niveau d'exécution et définit le niveau d'exécution par défaut. (Voir la la section intitulée Niveaux d'exécution d'Init pour avoir plus de détails sur les niveaux d'exécution d'init.) Ce fichier établit notamment que /sbin/update doit être exécuté chaque fois qu'un niveau d'exécution commence. Le programme update sert à recopier périodiquement les tampons mémoire vers les disques.

Lorsque le niveau d'exécution change, init utilise les scripts dans /etc/rc.d/init.d pour faire démarrer ou arrêter différents services, tels que votre serveur Web, votre serveur DNS, etc. Premièrement, init définit la bibliothèque de fonctions source pour le système (/etc/rc.d/init.d/functions habituellement), qui explique comment démarrer ou arrêter un programme et comment trouver l'identification des paramètres d'un programme. Puis, init détermine le niveau d'exécution en cours ainsi que le niveau précédent.

Ensuite, init lance toutes les tâches de fond nécessaires pour que le système puisse s'exécuter en cherchant dans le répertoire rc approprié pour ce niveau d'exécution (/etc/rc.d/rc<x>.d, où <x> est numéroté de 0 à 6). init exécute chacun des scripts kill (leur nom de fichier commencent par un K) avec un paramètre stop. Par la suite, init exécute tous les scripts de démarrage (leur nom de fichier commencent par un S) dans le répertoire approprié du niveau d'exécution avec un start afin que tous les services et applications soient lancés correctement. En fait, vous pouvez exécuter ces scripts de façon manuelle après que le système a fini l'amorçage au moyen de commandes telles que /etc/rc.d/init.d/httpd stop ou service httpd stop si vous êtes l'utilisateur root. Cela arrêtera le serveur httpd.

NoteRemarque
 

Il est préférable d'être l'utilisateur root pour lancer des services manuellement. Si vous obteniez une erreur en exécutant service httpd stop, vous pourriez ne pas avoir spécifié l'accès à /sbin dans /root/.bashrc (ou le bon fichier .rc pour votre shell préféré). Vous pouvez alors entrer la commande complète de /sbin/service httpd stop ou ajouter export PATH="$PATH:/sbin" à votre fichier shell .rc. Si vous modifiez le fichier de configuration du shell, sortez et reconnectez-vous en tant qu'utilisateur root afin que le fichier de configuration du shell modifié soit appliqué.

Aucun des scripts qui lancent et arrêtent les services n'est réellement situé dans /etc/rc.d/rc<x>.d. Tous les fichiers dans /etc/rc.d/rc<x>.d sont des liens symboliques qui pointent vers les scripts, qui sont situés dans /etc/rc.d/init.d. Un lien symbolique n'est autre qu'un fichier qui pointe vers un autre fichier. Dans le cas présent, on en fait usage car ils peuvent être créés et éliminés sans avoir aucun effet sur les scripts eux-mêmes, qui arrêtent ou démarrent les services. Les liens symboliques sont numérotés et ont un ordre particulier afin qu'ils s'exécutent dans cet ordre. Il vous est possible de changer l'ordre dans lequel les services sont arrêtés ou démarrés en changeant le nom du lien symbolique se référant au script qui démarre ou arrête un service donné. Vous pouvez donner aux liens symboliques le même numéro qu'un autre lien si vous voulez que ce service démarre ou arrête juste avant ou juste après cet autre service.

Exemple : pour le niveau d'exécution 5, init cherche dans le répertoire /etc/rc.d/rc5.d et pourrait trouver ce qui suit (votre système et votre configuration peuvent varier) :

K01pppoe -> ../init.d/pppoe
K05innd -> ../init.d/innd
K10ntpd -> ../init.d/ntpd
K15httpd -> ../init.d/httpd
K15mysqld -> ../init.d/mysqld
K15pvmd -> ../init.d/pvmd
K16rarpd -> ../init.d/rarpd
K20bootparamd -> ../init.d/bootparamd
K20nfs -> ../init.d/nfs
K20rstatd -> ../init.d/rstatd
K20rusersd -> ../init.d/rusersd
K20rwalld -> ../init.d/rwalld
K20rwhod -> ../init.d/rwhod
K25squid -> ../init.d/squid
K28amd -> ../init.d/amd
K30mcserv -> ../init.d/mcserv
K34yppasswdd -> ../init.d/yppasswdd
K35dhcpd -> ../init.d/dhcpd
K35smb -> ../init.d/smb
K35vncserver -> ../init.d/vncserver
K45arpwatch -> ../init.d/arpwatch
K45named -> ../init.d/named
K50snmpd -> ../init.d/snmpd
K54pxe -> ../init.d/pxe
K55routed -> ../init.d/routed
K60mars-nwe -> ../init.d/mars-nwe
K61ldap -> ../init.d/ldap
K65kadmin -> ../init.d/kadmin
K65kprop -> ../init.d/kprop
K65krb524 -> ../init.d/krb524
K65krb5kdc -> ../init.d/krb5kdc
K75gated -> ../init.d/gated
K80nscd -> ../init.d/nscd
K84ypserv -> ../init.d/ypserv
K90ups -> ../init.d/ups
K96irda -> ../init.d/irda
S05kudzu -> ../init.d/kudzu
S06reconfig -> ../init.d/reconfig
S08ipchains -> ../init.d/ipchains
S10network -> ../init.d/network
S12syslog -> ../init.d/syslog
S13portmap -> ../init.d/portmap
S14nfslock -> ../init.d/nfslock
S18autofs -> ../init.d/autofs
S20random -> ../init.d/random
S25netfs -> ../init.d/netfs
S26apmd -> ../init.d/apmd
S35identd -> ../init.d/identd
S40atd -> ../init.d/atd
S45pcmcia -> ../init.d/pcmcia
S55sshd -> ../init.d/sshd
S56rawdevices -> ../init.d/rawdevices
S56xinetd -> ../init.d/xinetd
S60lpd -> ../init.d/lpd
S75keytable -> ../init.d/keytable
S80isdn -> ../init.d/isdn
S80sendmail -> ../init.d/sendmail
S85gpm -> ../init.d/gpm
S90canna -> ../init.d/canna
S90crond -> ../init.d/crond
S90FreeWnn -> ../init.d/FreeWnn
S90xfs -> ../init.d/xfs
S95anacron -> ../init.d/anacron
S97rhnsd -> ../init.d/rhnsd
S99linuxconf -> ../init.d/linuxconf
S99local -> ../rc.local

Ces liens symboliques indiquent à init qu'il doit arrêter pppoe, innd, ntpd, httpd, mysqld, pvmd, rarpd, bootparamd, nfs, rstatd, rusersd, rwalld, rwhod, squid, amd, mcserv, yppasswdd, dhcpd, smb, vncserver, arpwatch, named, snmpd, pxe, routed, mars-nwe, ldap, kadmin, kprop, krb524, krb5kdc, gated, nscd, ypserv, ups, et irda. Une fois tous ces processus arrêtés, init cherche dans le même répertoire et trouve des scripts de démarrage pour kudzu, reconfig, ipchains, portmap, nfslock, autofs, random, netfs, apmd, identd, atd, pcmcia, sshd, rawdevices, xinetd, lpd, keytable, isdn, sendmail, gpm, canna, crond, FreeWnn, xfs, anacron, rhnsd, et linuxconf. La dernière chose que fait init est d'exécuter /etc/rc.d/rc.local afin de lancer tout script spécial configuré pour cet ordinateur hôte. A ce stade, le système est considéré comme opérationnel au niveau d'exécution 5.

Lorsqu'init a parcouru tous les niveaux d'exécution, le script /etc/inittab lance un processus getty pour chaque console virtuelle (invites de connexion) et pour chaque niveau d'exécution (les niveaux d'exécution 2 à 5 obtiennent les six consoles, alors que le niveau d'exécution 1, qui est un mode mono-utilisateur, n'en obtient qu'une ; les niveaux 0 et 6 n'obtiennent aucune console virtuelle). Fondamentalement, getty ouvre des terminaux, définit leur mode, imprime l'invite d'ouverture de session, obtient le nom d'utilisateur et initialise ensuite un processus d'ouverture de session pour cet utilisateur. Cela permet à l'utilisateur de s'authentifier auprès du système et de commencer à l'utiliser.

De plus, /etc/inittab indique à init comment interpréter la combinaison des touches Ctrl-Alt-Suppr sur la console. Comme Red Hat Linux doit être correctement arrêté et redémarré, init reçoit la directive d'exécuter la commande /sbin/shutdown -t3 -r now lorsqu'un utilisateur appuie sur ces touches. Aussi, /etc/inittab indique ce que init devrait faire en cas de panne d'alimentation, si un système d'alimentation sans coupure est branché à l'ordinateur.

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é (gdm si vous utilisez GNOME, kdm si vous utilisez KDE ou xdm si vous utilisez AnotherLevel) en fonction de ce qui est contenu dans le répertoire /etc/sysconfig/desktop.

A ce stade, le système devrait afficher une invite de connexion. Tout cela s'est produit en quelques secondes seulement.

Init SysV

Comme nous l'avons vu, le programme init est exécuté par le noyau au démarrage. Il est chargé de lancer tous les processus normaux qui ont besoin de démarrer avec le système. Ces derniers incluent notamment les processus getty qui vous permettent de vous connecter, les démons NFS ou FTP et tout ce que vous aimeriez exécuter lors du démarrage de votre ordinateur.

init SysV est le processus init standard de l'univers Linux pour le contrôle de l'exécution de logiciels au démarrage car il est facile à utiliser, plus puissant et plus flexible que le programme init BDS traditionnel.

init SysV est aussi différent de init BDS du fait que ses fichiers de configuration sont dans /etc/rc.d au lieu d'être situés directement dans /etc. Dans /etc/rc.d, vous trouverez rc, rc.local, rc.sysinit et les répertoires suivants :

init.d
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d

init SysV représente chacun des niveaux d'exécution d'init avec un répertoire séparé, au moyen de liens symboliques dans chaque répertoire, afin que init puisse arrêter ou démarrer les services au fur et à mesure que le système passe d'un niveau d'exécution à l'autre.

Pour résumer le tout, la chaîne des événements d'un démarrage init SysV se présente comme suit :

Le niveau d'exécution par défaut est défini dans /etc/inittab. Vous devriez avoir une ligne près du début qui ressemble à ceci :

id:3:initdefault:

Dans cet exemple, le niveau d'exécution par défaut est 3, soit le chiffre qui suit le premier deux-points. Si vous désirez le changer, vous pouvez modifier manuellement /etc/inittab. Soyez très prudent lorsque vous apportez des changements au fichier inittab. Si vous faites une erreur, vous pouvez la corriger en redémarrant l'ordinateur, en allant dans l'invite boot: avec Ctrl-X et en tapant :

boot:  linux single

Ceci devrait vous permet de démarrer en mode mono-utilisateur afin de modifier à nouveau inittab et de rétablir les valeurs initiales.

Maintenant, nous aborderons la question des informations contenues dans les fichiers qui se trouvent dans /etc/sysconfig et qui définissent les paramètres utilisés par les différents services au moment de leur démarrage.