De la mise sous tension à l'invite de commande de Bash

Greg O'Keefe

          
        

v0.9, novembre 2000

Voici une description rapide de ce qui se passe dans un système Linux, depuis l'instant où vous mettez celui-ci sous tension, jusqu'au moment où vous vous connectez et obtenez l'invite de commande de Bash. Comprendre ces mécanismes vous sera très utile lorsque vous aurez besoin de résoudre des problèmes ou de configurer votre système.



Introduction

Je trouve frustrant qu'il se passe dans ma machine Linux des choses que je ne comprends pas. Si, comme moi, vous souhaitez vraiment comprendre votre système plutôt que simplement savoir comment l'utiliser, ce document devrait être un bon point de départ. Ce genre de connaissance de fond est aussi requis si vous voulez devenir un as de la résolution de problèmes sous Linux.

Je pars du principe que vous avez une machine Linux en état de marche, et que vous maîtrisez les bases d'Unix et de l'architecture matérielle des PC. Si ce n'est pas le cas, Les notions fondamentales d'Unix et d'Internet est un excellent endroit pour débuter. C'est un document concis, lisible, et qui couvre toutes les bases.

Le sujet principal de ce document est la façon dont Linux démarre. Mais il se veut également être une ressource d'apprentissage plus large. J'ai inclus des exercices dans chaque section. Si vous en faites vraiment quelques-uns, vous en apprendrez bien plus qu'en vous contentant de lire ce document.

J'espère que certains lecteurs s'attaqueront au meilleur exercice d'apprentissage de Linux que je connaisse: construire un système à partir du code source. Giambattista Vico, un philosophe italien (1668-1744) disait verum ipsum factum ce qui signifie de l'expérience naît la compréhension (NdT: traduction libre). Merci à Alex (voir ) pour cette citation.

Si vous souhaitez vous réaliser votre propre installation Linux, je vous conseille d'aller voir le document de Gerard Beekmans Comment faire un système Linux à partir de zéro (Linux from scratch - LFS). LFS fournit des instructions détaillées pour bâtir un système complet et exploitable à partir du code source. Sur le site web de LFS, vous trouverez aussi une liste de discussion à la disposition des personnes qui construisent de tels systèmes. Les instructions jadis incluses à ce guide se trouvent maintenant dans un document distinct nommé «Construire un système Linux minimum à partir du code source» et qui peut être récupéré sur le site From PowerUp to Bash Prompt pour construire un système jouet, purement pour l'exercice.

Les paquets sont présentés dans l'ordre où ils apparaissent dans le processus de démarrage du système. Cela signifie que si vous installez les paquets dans cet ordre vous pouvez redémarrer après chaque installation, et voir à chaque fois le système se rapprocher petit à petit de l'état où il vous donnera la ligne de commande. Il y a une notion de progression rassurante dans cela.

Je vous recommande de commencer par lire le texte principal de chaque section, en ignorant les exercices et références, puis de décider du point jusqu'auquel vous souhaitez comprendre votre système. Reprenez alors depuis le début, en faisant les exercices et en relisant en détail.


Partie matérielle

Lorsque vous allumez votre ordinateur, celui-ci se teste lui-même pour s'assurer que tous ses composants sont en état de marche. Cela s'appelle l'auto-test à l'allumage (Power On Self Test - POST). Ensuite, un programme nommé chargeur d'amorçage (bootstrap loader), situé dans le BIOS en ROM, recherche un secteur d'amorçage. Un secteur d'amorçage est le premier secteur d'un disque et contient un petit programme capable de charger un système d'exploitation. Les secteurs d'amorçage sont marqués par un nombre magique (i.e. une valeur fixe caractéristique) 0xAA55 = 43603 à l'octet 0x1FE = 510. Ce sont les deux derniers octets du secteur. C'est de cette façon que la partie matérielle peut déterminer s'il s'agit d'un secteur d'amorçage ou pas.

Le chargeur d'amorçage a une liste d'endroits où chercher un secteur d'amorçage. Ma vieille machine regarde d'abord sur le lecteur de disquette, puis sur le disque dur. Les machines modernes peuvent aussi rechercher un secteur d'amorçage sur un CD-ROM. S'il trouve un secteur d'amorçage, il le charge en mémoire et passe ainsi le contrôle au programme qui charge le système d'exploitation en mémoire. Sur un système Linux classique, ce programme sera la première étape du chargeur de Lilo. Il existe malgré tout plusieurs manières différentes de configurer l'amorçage de votre système. Voir le Guide de l'utilisateur de Lilo pour plus de détails. Voir la section pour l'url.

Évidement, il y a bien plus à dire sur ce que fait la partie matérielle du PC. Mais ce n'est pas l'objet de ce document. Lisez un des nombreux livres traitant de l'architecture matérielle des PC.


Configuration

La machine stocke des informations sur son propre état dans son CMOS. Cela inclut la RAM et les types de disques installés dans le système. Le BIOS de la machine contient un programme de configuration, Setup, qui vous permet de modifier ces informations. Pour savoir comment y accéder, regardez attentivement les messages qui apparaissent sur votre écran lorsque vous mettez votre machine sous tension. Sur ma machine, il faut appuyer sur la touche Suppr avant qu'elle ne commence à charger le système d'exploitation.


Exercices

Une bonne façon d'en apprendre plus sur la partie matérielle d'un PC est de monter une machine à partir de composants d'occasion. Prenez au moins un 386 pour pouvoir y installer Linux facilement. Cela ne vous coûtera pas très cher. Posez la question autour de vous, quelqu'un pourrait bien vous donner une partie des pièces qu'il vous faut.

Allez voir Unios, (ils avaient une page sur http://www.unios.org, mais elle a disparu) et téléchargez, compilez et fabriquez votre disquette amorçable. Ce n'est qu'un programme d'amorçage affichant Hello World!, contenant à peine plus de 100 lignes d'assembleur. Il serait intéressant de le voir converti en un format exploitable par l'assembleur as de GNU.

Ouvrez l'image de la disquette d'amorçage pour Unios avec un éditeur hexadécimal. Cette image fait 512 octets de long. Exactement la longueur d'un secteur. Trouvez-y le nombre magique 0xAA55. Faites la même chose pour une disquette amorçable de votre propre ordinateur.

Vous pouvez utiliser la commande dd pour la copier dans un fichier: dd if=/dev/fd0 of=secteur.d.amorcage. Faites très attention à paramétrer if (fichier source) et of (fichier destination) comme il faut!

Essayez d'en extraire le code source du chargeur de Lilo.


Aller plus loin

  • Les notions fondamentales d'Unix et d'Internet, par Eric S. Raymond, et particulièrement la section 3, Que se passe-t-il lorsque vous allumez un ordinateur?

  • Le premier chapitre du Guide de l'utilisateur de Lilo donne une excellente explication des partitions de disques sur PC et de l'amorçage. Voir la section pour l'url.

  • Peter Norton Programmer's Guide to the IBM PC & PS/2 (Guide Peter Norton du programmeur pour l'IBM PC et PS/2), par Peter Norton et Richard Wilton, Microsoft Press, 1988. Il existe un nouveau livre Norton, qui a l'air bien, mais que je ne peux m'offrir pour le moment.

  • Un des nombreux ouvrages disponibles sur la manière de faire évoluer son PC.


Lilo

Lorsque l'ordinateur charge le secteur d'amorce d'un système sous Linux normal, ce qu'il charge est en fait une partie de Lilo, appelée chargeur d'amorçage de premier niveau (first stage boot loader). Il s'agit d'un mini-programme dont la seule tâche est de charger et d'exécuter le chargeur d'amorçage de deuxième niveau (second stage boot loader).

Le chargeur d'amorçage de deuxième niveau vous donne une invite de commande (s'il a été installé de cette manière) et charge le système d'exploitation de votre choix.

Lorsque votre système est monté et en état de marche, et que vous exécutez lilo, ce que vous exécutez en réalité est l'outil de définition des localisations (map installer). Celui-ci lit le fichier de configuration /etc/lilo.conf et écrit le chargeur d'amorçage sur le disque dur, avec les informations concernant les systèmes d'exploitation qu'il peut charger.

Il y a de nombreuses manières de rendre votre système amorçable. Celle que je viens de décrire est la manière la plus évidente et normale, au moins pour une machine dont le système d'exploitation principal est Linux. Le Guide de l'utilisateur Lilo explique plusieurs exemples de méthodes d'amorçage. Cela vaut la peine de les lire, et d'en essayer quelques-uns.


Configuration

Le fichier de configuration de Lilo est /etc/lilo.conf. Il existe une page de manuel (man page) à son sujet: tapez man lilo.conf dans un shell pour l'afficher. La principale caractéristique de lilo.conf est qu'il existe une entrée pour chaque chose que Lilo doit pouvoir lancer. Pour une entrée Linux, cela inclut l'emplacement du noyau, et la partition à monter comme racine du système de fichier. Pour les autres systèmes, la principale information est la partition sur laquelle démarrer.


Exercices

DANGER: soyez prudent avec ces exercices. Il est assez facile de faire une erreur quelque part et de bloquer votre bloc de démarrage (master boot record - MBR, premier secteur du disque dur, qui contient le chargeur d'amorçage et la table des partitions) et de rendre ainsi votre système inutilisable. Assurez-vous que vous avez une disquette de réparation qui fonctionne, et que vous savez comment vous en servir pour remettre les choses en état. Voir ci-dessous un lien vers tomsrtbt, la disquette de réparation que j'utilise et recommande. La meilleure des précautions est d'utiliser une machine qui ne contienne pas de données sensibles.

Installez Lilo sur une disquette. Peu importe s'il n'y a rien d'autre sur la disquette que le noyau - vous obtiendrez un kernel panic quand le noyau sera prêt à charger init, mais au moins vous saurez que Lilo fonctionne.

Si vous le souhaitez, vous pouvez essayer de voir jusqu'à quel point vous pouvez faire tenir un système sur une disquette. C'est sûrement la deuxième meilleure activité pour apprendre Linux. Voir le Comment faire une disquette d'amorçage (url ci-dessous), et tomsrtbt (url ci-dessous) pour avoir des pistes.

Configurez Lilo afin qu'il lance Unios (voir section pour une url). Comme défi supplémentaire, voyez si vous pouvez le faire sur une disquette.

Faites une boucle d'amorçage. Configurez le Lilo du bloc de démarrage pour qu'il lance le Lilo du secteur d'amorçage d'une des partitions principales, puis configurez ce Lilo pour qu'il relance celui du bloc de démarrage. Ou alors utilisez le bloc de démarrage et vos quatre partitions principales pour faire une boucle en cinq points! Marrant!


Aller plus loin

  • La page de manuel de Lilo

  • Le paquet Lilo (ftp://lrcftp.epfl.ch/pub/linux/local/lilo/) contient le Guide l'utilisateur de Lilo lilo-u-21.ps.gz (ou une version plus récente). Il se peut que vous disposiez déjà de ce document. Regardez dans /usr/share/doc/lilo ou à un endroit similaire. La version PostScript est meilleure que la version en texte brut, car elle contient des diagrammes et des tables.

  • tomsrtbt: le Linux mono-disquette le plus cool! Constitue une excellente disquette de secours.

  • Comment faire une disquette d'amorçage (Bootdisk HOWTO).


Le noyau Linux

Le noyau (kernel) fait vraiment beaucoup de choses. Je pense qu'une bonne manière de résumer tout cela est de dire qu'il fait faire au matériel ce que les programmes veulent, proprement et efficacement.

Le processeur ne peut exécuter qu'une seule instruction à la fois, mais Linux semble faire tourner beaucoup de choses simultanément. Le noyau accomplit cela en sautant de tâche en tâche très rapidement. Il fait le meilleur usage possible du processeur en gardant trace des processus qui sont prêts à être exécutés et de ceux qui attendent quelque chose comme un enregistrement en provenance d'un disque, ou une saisie clavier quelconque. Cette tâche du noyau est appelée ordonnancement.

Si un programme ne fait rien, alors il n'a pas besoin d'être conservé en mémoire (RAM). Même un programme qui travaille peut avoir certaines parties inactives, qui n'ont donc pas besoin d'être en mémoire. L'espace adressable est divisé en pages. Le noyau garde une trace des pages les plus utilisées. Les pages qui sont moins souvent utilisées peuvent être déplacées dans la partition d'échange (swap). Lorsqu'une page est à nouveau sollicitée, une autre page inutilisée est retirée de l'espace adressable pour lui faire de la place. Cela s'appelle la gestion de la mémoire virtuelle.

Si vous avez un jour compilé votre propre noyau, vous avez remarqué qu'il y a un grand nombre d'options pour des périphériques spécifiques. Le noyau contient une grande quantité de code spécifique pour interagir avec tous types de matériels, et pouvoir les présenter d'une façon propre et uniforme aux programmes.

Le noyau prend aussi en charge la gestion des fichiers, les communications entre processus, et une grande partie du travail concernant le réseau.

Une fois le noyau chargé, la première chose qu'il fait est de rechercher un programme appelé init et l'exécuter.


Configuration

La majorité de la configuration du noyau est effectuée quand vous le construisez, en utilisant make menuconfig, ou make xconfig dans le répertoire /usr/src/linux/ (là ou se trouvent les sources de votre noyau Linux). La commande rdev vous permet réinitialiser le mode vidéo par défaut, la racine du système de fichiers, le périphérique d'échange et la taille du disque virtuel (disque RAM). Ces paramètres ainsi que d'autres peuvent aussi être passés au noyau depuis Lilo. Vous pouvez indiquer à Lilo les paramètres à passer au noyau soit dans lilo.conf, soit à l'invite de Lilo. Par exemple, si vous souhaitiez utiliser hda3 comme racine du système de fichiers plutôt que hda2, vous pourriez taper: