Red Hat Linux 7.1: Guide de référence officiel Red Hat Linux | ||
---|---|---|
Précédent | Chapitre 3. Processus de démarrage, Init et arrêt | Suivant |
Remarque | |
---|---|
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.
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.
Avertissement | |
---|---|
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) :
boot=/dev/hda indique à LILO de regarder sur le premier disque dur du premier contrôleur IDE.
map=/boot/map localise le fichier map. Pour une utilisation normale, ce nom ne devrait pas être modifié.
install=/boot/boot.b indique à LILO d'installer le fichier spécifié en tant que nouveau secteur de démarrage. Pour une utilisation normale, cela ne devrait pas être modifié. Si la ligne install manque, LILO prendra par défaut /boot/boot.b en tant que fichier à utiliser.
L'existence de prompt indique à LILO de vous afficher tout ce qui est défini dans la ligne message. Bien qu'il ne soit pas recommandé d'éliminer la ligne prompt, si vous le faites, vous pourrez tout de même obtenir une invite en appuyant sur la touche Shift pendant que votre ordinateur commence l'amorçage.
timeout=50 définit combien de temps LILO doit attendre que l'utilisateur entre une commande avant d'amorcer la ligne d'entrée default. Cette période de temps est mesurée en dixièmes de seconde et est réglée sur 50 par défaut.
message=/boot/message se réfère à l'écran que LILO affiche pour vous laisser sélectionner le système d'exploitation ou le noyau à amorcer.
lba32 décrit la géométrie du disque dur à LILO. Une autre ligne commune que l'on retrouve à cet endroit est linear. Vous ne devriez pas changer cette ligne à moins d'être sûr de ce que vous faites. Autrement, vous pourriez mettre votre ordinateur dans un état où il lui est impossible d'être redémarré.
default=linux se réfère au système d'exploitation par défaut que LILO doit amorcer au moyen des options énumérées sous cette ligne. Le nom linux fait référence à la ligne label située sous chacune des options de démarrage.
image=/boot/vmlinuz-2.4.0-0.43.6 spécifie le noyau Linux à amorcer au moyen de cette option.
label=linux donne le nom de l'option du système d'exploitation sur l'écran LILO. Dans ce cas, il s'agit également du nom auquel fait référence la ligne default.
initrd=/boot/initrd-2.4.0-0.43.6.img se réfère à l'image disque RAM initial qui est utilisée lors du démarrage pour initialiser et lancer les périphériques qui font en sorte qu'il est possible d'amorcer le noyau. Le disque RAM initial est un ensemble de pilotes nécessaires au fonctionnement de l'unité de disque dur et tout ce qui sert à charger le noyau. Vous ne devriez jamais essayer de partager des disques RAM initiaux entre différents ordinateurs à moins que la configuration de leur matériel ne soit identique (et même dans ce cas, c'est une bien mauvaise idée).
read-only spécifie que la partition root (voir la ligne root en-dessous) ne peut être modifiée elle ne peut qu'être lue.
root=/dev/hda5 indique à LILO quelle partition de disque utiliser en tant que partition root.
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.
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.
Remarque | |
---|---|
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.
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 noyau recherche init dans /sbin.
init exécute le script /etc/rc.d/rc.sysinit.
rc.sysinit prend en charge la plupart des processus du chargeur de démarrage et exécute ensuite rc.serial (s'il existe).
init exécute tous les scripts pour le niveau d'exécution par défaut.
init exécute /etc/rc.d/rc.local.
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.
Précédent | Sommaire | Suivant |
Processus de démarrage, Init et arrêt | Niveau supérieur | Information Sysconfig |