3. Disques d'amorce et démarrage

Un disque d'amorce est essentiellement un système Linux miniature et auto-suffisant contenu sur une disquette. Il doit pouvoir effectuer nombre d'opérations possibles sur un système Linux de taille normale. Avant d'essayer d'en créer un, vous devez comprendre les bases du démarrage de Linux. Nous en faisons ici une présentation qui devrait suffire à la compréhension de la suite du document. Bien des détails ou des possibilités ont été omis.

Tous les PC démarrent en exécutant du code situé en mémoire morte (à savoir, le BIOS) afin de charger le secteur situé au secteur 0, cylindre 0 du disque d'amorce. Celui-ci est habituellement le premier lecteur de disquette (appelé A: sous DOS et /dev/fd0 sous Linux). Le BIOS essaye alors d'exécuter ce secteur. Sur la plupart des disques d'amorce, le secteur 0, cylindre 0 contient :

  • soit le code d'un chargeur tel que LILO, qui trouve le noyau, le charge et l'exécute pour réaliser le démarrage proprement dit,

  • soit le début du noyau d'un système d'exploitation, tel que Linux.

Si un noyau Linux a été copié directement sur une disquette, le premier secteur du disque sera le premier secteur du noyau Linux lui-même. Ce premier secteur continuera le démarrage en chargeant le reste du noyau depuis le périphérique d'amorce.

Une fois que le noyau est complètement chargé, il effectue certaines initialisations de périphériques ainsi que de ses données internes. Une fois qu'il est complètement initialisé, il consulte un endroit particulier dans son image appelé le mot disque mémoire. Ce mot précise comment et où trouver le système de fichiers racine. Un système de fichiers racine est simplement celui qui est monté en tant que « / ». Il faut dire au noyau où trouver ce système racine ; s'il ne peut trouver d'image à charger, il s'arrête.

Dans certains cas au démarrage (souvent lors du démarrage depuis une disquette), le système de fichiers racine est chargé dans un disque mémoire, auquel le système accède ensuite en mémoire comme s'il s'agissait d'un vrai disque. Il y a deux raisons à un tel chargement en mémoire. Premièrement, la mémoire vive est de plusieurs ordres de magnitude plus rapide qu'une disquette, et le système est donc rapide ; deuxièmement, le noyau peut charger un système de fichiers compressé depuis la disquette et le décompresser en mémoire, permettant ainsi de stocker plus de fichiers sur la disquette.

Une fois le système de fichiers racine chargé et monté, vous voyez un message tel que :

VFS: Mounted root (ext2 filesystem) readonly.

À ce moment, le système trouve le programme init dans le système racine (dans /bin ou /sbin) et l'exécute. init lit sa configuration dans /etc/inittab, cherche une ligne nommée sysinit, et exécute le script indiqué. Le script sysinit est en général un fichier du genre /etc/rc ou /etc/init.d/boot. Le script est un ensemble de commandes shell qui mettent en place les services de base du système, tels que :

  • Lancer fsck sur tous les disques ;

  • Charger les modules nécessaires du noyau ;

  • Lancer la pagination ;

  • Initialiser le réseau ;

  • Monter les disques indiqués dans fstab.

Ce script appelle lui-même souvent nombre d'autres scripts pour réaliser une initialisation modulaire. Par exemple, dans la structure SysVinit habituelle, le répertoire /etc/rc.d/ contient une structure complexe de sous-répertoires dont les fichiers indiquent comment lancer et arrêter la plupart des services du système. En revanche, sur un disque d'amorce, le script sysinit est souvent très simple.

Quand le script sysinit se termine, le contrôle revient à init, qui entre alors dans le niveau d'exécution par défaut, spécifié dans inittab par le mot clé initdefault. La ligne du niveau d'exécution indique en général un programme tel que getty, responsable de la gestion des communications par la console ou les tty. C'est le programme getty qui affiche l'invite habituelle login:. Lui-même exécute à son tour le programme login pour gérer la validation du login et mettre en place la session de l'utilisateur.

Après avoir revu les bases du démarrage, nous pouvons définir les différents types de disques mis en jeu. Ces disques sont classés en quatre catégories. Ça et là dans le document, on emploie le terme disque pour désigner une disquette, sauf précision contraire, bien que la majeure partie de la discussion puisse également s'appliquer à des disques durs.

Amorce

Un disque contenant un noyau pouvant être amorcé. Il peut être utilisé pour démarrer le noyau, qui pourra alors charger un système racine depuis un autre disque. Il est en général nécessaire d'indiquer au noyau où se trouve ce système racine.

Souvent un disque d'amorce charge le système racine depuis une autre disquette, mais il est possible de lui indiquer un disque dur d'où il chargera le système racine à la place. Souvent, c'est dans le but de tester un nouveau noyau (d'ailleurs, make zdisk crée un tel disque d'amorce automatiquement à partir du code source du noyau).

Racine

Un disque avec un système de fichiers contenant les fichiers nécessaires au fonctionnement d'un système Linux. Un tel disque ne contient pas forcément un noyau ou un chargeur.

Un disque racine peut être utilisé pour faire tourner le système indépendamment de tout autre disque, une fois le noyau amorcé. En général le disque racine est copié automatiquement vers un disque mémoire. Cela permet un accès au disque racine bien plus rapide, et libère le lecteur pour une disquette d'utilitaires.

Amorce/racine

Un disque contenant à la fois un noyau et un système de fichiers racine. Autrement dit, il contient tout ce qui est nécessaire au démarrage et au fonctionnement d'un système Linux sans disque dur. L'avantage de ce type de disque est sa compacité : tout ce dont on a besoin est sur un seul disque. Néanmoins, la taille toujours plus importante des programmes implique une difficulté croissante pour tout faire tenir sur une seule disquette, même avec de la compression.

Utilitaire

Un disque contenant un système de fichier non destiné à être monté en tant que racine. Il s'agit d'un disque de données supplémentaires. Vous pouvez utiliser ce genre de disque pour rajouter des utilitaires, quand vous en avez trop pour un seul disque amorce.

En général, lorsque l'on parle de « construire un disque d'amorce », c'est de la création des parties amorce (noyau) et racine (fichiers) qu'il est question, soit en un seul morceau (un seul disque amorce/racine), soit séparément (un disque amorce et un racine). L'approche la plus flexible pour des disquettes de secours est d'utiliser des disquettes amorce et racine séparées, et une ou plusieurs disquettes utilitaires pour supporter le trop-plein.