Disquettes d'amorce Linux

Tom Fawcett (fawcett@croftj.net)
(traduction : Frank Pavageau, pavageau@imaginet.fr)

3.5, Juillet 1999
Ce document décrit comment définir et créer vos propres disquettes d'amorce et racine pour Linux. Ces disquettes peuvent être utilisées comme disques de secours, ou pour tester de nouveaux composants du système. Si vous n'avez pas lu la FAQ Linux et autres documents du même genre, tels que le HOWTO d'installation Linux et le Guide d'Installation de Linux, vous ne devriez pas essayer de créer de disquettes d'amorce. Si vous souhaitez juste créer des disquettes pour prévenir les cas urgents, lisez l'annexe "Disques d'amorce préfabriqués".

Appendix

1. Préface

Note : ce document peut être obsolète. Si la date sur la page de titre a plus de six mois, vérifiez la page du Linux Documentation Project http://metalab.unc.edu/LDP/HOWTO/Bootdisk-HOWTO.html (et sa traduction française http://www.freenix.fr/linux/HOWTO/Bootdisk-HOWTO.html) au cas où une version plus récente s'y trouverait.

Bien que ce document doive être lisible dans sa forme texte, il a bien meilleure allure en PostScript (.ps) ou HTML en raison de la typographie utilisée. Nous vous conseillons de choisir une de ces versions. La version Info est, pour l'instant, tellement mal générée qu'elle en est inutilisable.

1.1 Notes

Graham Chapman (grahamc@zeta.org.au) a écrit le premier Bootdisk-HOWTO et en a assuré la maintenance jusqu'à la version 3.1. Tom Fawcett (fawcett@croftj.net) a ajouté beaucoup d'informations pour le support du noyau 2.0, et effectue désormais la maintenance du document, depuis la version 3.2. Il contient toujours une bonne partie écrite par Chapman.

Ce document concerne le noyau Linux 2.0 et les versions ultérieures. Si vous avez un vieux noyau (1.2.xx ou antérieur), veuillez consulter les versions précédentes du Bootdisk-HOWTO archivées sur la page de Graham Chapman.

Les informations contenues dans ce document concerne Linux sur plate-forme Intel. Bien des éléments doivent pouvoir être appliqués à Linux sur d'autres processeurs, mais nous n'en avons pas personnellement l'expérience, ni ne possédons d'informations de ce type. Si quelqu'un a expérimenté les disques d'amorce sur d'autres plate-formes, qu'il nous contacte.

1.2 Retours et remerciements

Tout retour, bon ou mauvais, sur le contenu de ce document est le bienvenu. Nous avons fait de notre mieux pour vérifier que les instructions et informations ici présentes sont précises et fiables. Merci de nous signaler toute erreur ou omission.

Nous remercions les nombreuses personnes nous ayant fourni des corrections et suggestions. Leurs contributions ont permis d'améliorer ce document bien au delà de ce que nous aurions pu réaliser seuls.

Envoyez vos commentaires, corrections et questions à l'auteur à l'adresse ci-dessus (ou au traducteur pour des problèmes dans la version française). Cela ne me dérange pas d'essayer de répondre à vos questions, mais merci de lire la section En cas de problème d'abord.

1.3 Politique de distribution

Copyright © 1995,1996,1997,1998,1999 by Tom Fawcett and Graham Chapman. This document may be distributed under the terms set forth in the Linux Documentation Project License at http://metalab.unc.edu/LDP/COPYRIGHT.html. Please contact the authors if you are unable to get the license.

This is free documentation. It is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose.

Copyright © 1995,1996,1997,1998,1999 Tom Fawcett et Graham Chapman. Ce document peut être distribué sous les termes de la Licence du Linux Documentation Project lisible à http://metalab.unc.edu/LDP/COPYRIGHT.html. Merci de contacter les auteurs si vous n'arrivez pas à récupérer la licence.

Cette documentation est libre. Elle est distribuée dans l'espoir d'être utile, mais sans aucune garantie ; sans même la garantie implicite de valeur marchande ou de correspondre à un but particulier.

Vous utilisez les informations contenues dans ce document à vos propres risques. Nous déclinons toute responsabilité quant à son contenu. L'utilisation des concepts, des exemples ou de tout autre contenu se fait entièrement à vos propres risques.

Tous les droits sont détenus par leurs propriétaires respectifs, sauf mention contraire explicite. L'utilisation d'un terme dans ce document ne constitue pas une limitation à sa validité en tant que marque.

Le fait de citer un produit ou une marque particulière ne constitue pas un endossement.

Il est fortement conseillé d'effectuer une sauvegarde de votre système avant une installation importante ainsi qu'à intervalles réguliers.

1.4 Notes du traducteur

Correspondances anglais/français utilisées dans la traduction :

2. Introduction

Les disques d'amorce Linux sont utiles dans nombre de situations, telles que :

Les disques d'amorce peuvent être obtenus de différentes manières :

Certaines personnes choisissent la dernière solution afin de tout faire eux-mêmes. Ainsi, si quelque chose ne marche plus, ils peuvent se débrouiller pour corriger le problème. Et c'est un excellent moyen pour apprendre le fonctionnement d'un système Linux.

Ce document suppose une certaine familiarité avec les concepts d'administration d'un système Linux. Par exemple, vous devez connaître les répertoires, les systèmes de fichiers, les disquettes. Vous devez savoir utiliser mount et df, à quoi servent les fichiers /etc/passwd et fstab et quelle tête ils ont. Enfin, vous devez savoir que la plupart des commandes dans ce HOWTO doivent être exécutées en tant que root.

Créer vos propres disquettes d'amorce à partir de zéro peut être compliqué. Si vous n'avez pas lu la FAQ Linux et autres documents du même genre, tels que le HOWTO d'installation Linux et le Guide d'Installation de Linux, vous ne devriez pas essayer de créer de disques d'amorce. Si vous souhaitez juste créer des disques pour prévenir les cas urgents, il est bien plus simple d'en récupérer des préfabriqués. Lisez l'appendice Disques d'amorce préfabriqués ci-dessous pour savoir où en trouver.

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.

3.1 Démarrage

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 :

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. Il essaye ensuite de charger et monter un système de fichiers racine depuis un périphérique quelconque. 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 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.

A 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 :

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. Par contre, 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 ttys. 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.

3.2 Types de disques

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.

4. Construire un système racine

Pour créer un système racine, il faut sélectionner les fichiers nécessaires au système pour fonctionner. Dans cette section nous décrivons comment créer un système racine compressé. Une option moins courante est de créer un système non compressé sur une disquette que l'on monte directement ; cette alternative est décrite dans la section Système racine sans disque mémoire.

4.1 Aperçu

Un système racine doit contenir tout ce qui est nécessaire au bon fonctionnement d'un système Linux complet. Pour cela, le disque doit contenir un système Linux minimum :

Bien sûr, n'importe quel système devient utile dès que l'on peut faire tourner quelque chose dessus, et une disquette racine ne devient en général utilisable que lorsque vous pouvez faire quelque chose du genre :

Nous décrirons comment construire un système compressé, ainsi appelé car il est compressé sur disque et qu'une fois démarré, le noyau le décompresse dans un disque mémoire. Avec un système compressé vous pouvez faire tenir beaucoup de fichiers (à peu près six mégaoctets) sur une disquette standard de 1440K. Puisque le système de fichiers est bien plus gros que la disquette, il ne peut être construit directement sur la disquette. Il nous faut le construire ailleurs et le compresser avant de le copier sur la disquette.

4.2 Création du système de fichiers

Pour créer un tel système racine, il vous faut un autre périphérique capable de stocker tous les fichiers avant leur compression. Ce périphérique doit pouvoir contenir à peu près quatre mégaoctets. Plusieurs solutions s'offrent à vous :

Après avoir choisi une de ces options, préparez le PÉRIPHÉRIQUE avec :

        dd if=/dev/zero of=PÉRIPHÉRIQUE bs=1k count=3000

Cette commande initialise à zéro le périphérique. Cette étape est importante pour la compression ultérieure du système de fichiers, afin que toutes les portions inutilisées soient remplies de zéro pour une compression maximum.

Ensuite, créez le système de fichiers. Le noyau Linux sait charger automatiquement deux types de système de fichiers dans un disque mémoire : minix et ext2, avec une préférence pour ext2. Si vous le choisissez, vous voudrez peut-être utiliser l'option -i afin de créer plus d'i-noeuds que par défaut ; -i 2000 est une bonne valeur qui vous évitera de tomber à court d'i-noeuds. Vous pouvez sinon économiser des i-noeuds en supprimant pas mal de fichiers /dev/ inutiles. mke2fs crée par défaut 360 i-noeuds sur une disquette de 1,44 Mo. Je trouve 120 i-noeuds largement suffisants sur mon actuelle disquette racine de secours, mais si vous conservez tous les périphériques dans le répertoire /dev vous dépasserez facilement les 360. L'utilisation d'un système racine compressé permet de créer un système de fichiers plus grand, contenant donc plus d'i-noeuds par défaut, mais vous pourrez quand même vouloir réduire le nombre de fichiers ou augmenter le nombre d'i-noeuds.

Vous allez donc taper une commande du genre :

        mke2fs -m 0 -i 2000 PÉRIPHÉRIQUE

(Si vous utilisez un périphérique de boucle, le fichier que vous utilisez doit être indiqué à la place de ce PÉRIPHÉRIQUE. mke2fs vous demandera alors si vous voulez vraiment faire cela ; répondez oui.)

La commande mke2fs détectera automatiquement l'espace disponible et se configurera selon. Le paramètre -m 0 permet de ne pas réserver d'espace pour root, et laisse donc plus d'espace disponible sur le disque.

Ensuite, montez le périphérique :

        mount -t ext2 PÉRIPHÉRIQUE /mnt

(Vous devez créer un point de montage /mnt s'il n'existe pas encore.) Dans les sections suivantes, tous les répertoires destination sont supposés relatifs à /mnt.

4.3 Remplissage du système de fichiers

Voici un minimum raisonnable de répertoires à créer sur votre système racine :

(La structure de répertoires présentée ici concerne uniquement les disquettes racines. Les vrais systèmes Linux ont une politique plus complexe et disciplinée, appelée la Hiérarchie Standard de Système de Fichiers (Filesystem Hierarchy Standard), qui détermine où les fichiers doivent se trouver.)

Trois de ces répertoires resteront vides sur les systèmes racine, il suffit donc de les créer avec mkdir. Le répertoire /proc n'est qu'une base sous laquelle le système proc est placé. /mnt et /usr ne sont que des points de montage utilisés une fois que le système amorce/racine tourne. Encore une fois, il suffit de créer ces répertoires.

Les quatre autre répertoires sont décrits dans les sections suivantes.

/dev

Tous les systèmes Linux ont besoin d'un répertoire /dev contenant un fichier spécial par périphérique accessible au système. Le répertoire en lui-même est normal, et peut être créé avec mkdir de la manière habituelle. Les fichiers spéciaux de périphérique doivent par contre être créés différemment, à l'aide de la commande mknod.

Il y a un raccourci par contre : copiez le contenu de votre répertoire /dev existant, puis supprimez ceux dont vous n'avez pas besoin. Il suffit juste de copier les fichiers spéciaux avec l'option -R. Cela copie le répertoire sans tenter de copier le contenu des fichiers. Attention à bien utiliser un R en majuscule ! Si vous utilisez l'option en minuscule -r, vous allez vous retrouver en train de copier le contenu complet de votre disque dur -- ou au moins tout ce que pourra en contenir une disquette ! Prenez donc vos précautions, et utilisez la commande :

        cp -dpR /dev /mnt

en supposant que la disquette est montée sur /mnt. Les options dp demandent la copie des liens symboliques en tant que lien, plutôt que celle du fichier qui se trouve au bout de celui-ci, et la conservation des attributs originaux des fichiers, pour garder les bons propriétaires.

Si vous voulez le faire vous-mêmes, utilisez ls -l pour afficher les numéros majeurs et mineurs des périphériques qui vous intéressent, et créez-les sur la disquette en utilisant mknod.

Quelle que soit la manière retenue pour copier les périphériques, il faut vérifier que tous les périphériques dont vous aurez besoin sont bien présents sur la disquette de secours. Par exemple, ftape utilise les périphériques de bande, qu'il vous faudra donc tous copier si vous comptez utiliser votre lecteur de bande depuis le disque amorce.

A noter qu'un i-noeud est nécessaire pour chaque fichier de périphérique, et que les i-noeuds sont parfois une ressource rare, spécialement sur les systèmes de fichiers sur disquette. Il n'est donc pas idiot d'enlever tous les fichiers de périphérique dont vous n'avez pas besoin du répertoire /dev de la disquette. Bien des périphériques ne sont clairement pas nécessaires sur des systèmes spécifiques. Par exemple, si vous n'avez pas de disques SCSI vous pouvez tranquillement enlever tous les fichiers commençant par sd. De même, si vous ne comptez pas utiliser de port série vous pouvez supprimer tous les fichiers commençant par cua.

N'oubliez pas d'inclure les fichiers suivants dans le répertoire : console, kmem, mem, null, ram, tty1.

/etc

Ce répertoire doit contenir un certain nombre de fichiers de configuration. Sur la plupart des systèmes, on peut les répartir en trois groupes :

  1. Nécessaires à tout moment, par exemple rc, fstab, passwd ;
  2. Peut-être nécessaires, mais on n'en est pas sûr ;
  3. Du bazar oublié là.

Les fichiers non essentiels peuvent être identifiés avec la commande :

        ls -ltru

Les fichiers sont classés dans l'ordre inverse de dernière date d'accès, donc tout fichier qui n'est jamais lu peut être exclu d'une disquette racine.

Sur mes disquettes racine, je n'ai que 15 fichiers de configuration. Mon travail se réduit alors à gérer trois groupes de fichiers :

  1. Ceux que je dois configurer pour un système d'amorce et racine :
    1. rc.d/* : scripts de démarrage du système et de changement de niveau d'exécution ;
    2. fstab : liste des systèmes de fichiers à monter ;
    3. inittab : paramètres pour le processus init, le premier à être lancé au démarrage.
  2. Ceux que je dois nettoyer pour un système d'amorce et racine :
    1. passwd : liste des utilisateurs, des répertoires utilisateurs, etc ;
    2. group : groupes d'utilisateurs ;
    3. shadow : mots de passe cachés des utilisateurs. Il se peut que vous n'ayez pas ce fichier ;
    4. termcap : la base de données de fonctionnalités des terminaux.
    Si la sécurité est importante, passwd et shadow doivent être nettoyés pour ne pas copier de mots de passe d'utilisateurs hors du système et pour qu'en cas de démarrage sur disquette, les logins indésirables soient rejetés. Assurez-vous que passwd contienne au moins root. Si vous comptez donner accès à d'autres utilisateurs, vérifiez l'existence de leurs répertoires utilisateurs et de leurs shells. termcap, la base de données de terminaux, fait en général plusieurs centaines de kilo-octets. Vous devrez faire du ménage dans la version de votre disquette d'amorce/racine pour ne conserver que le ou les terminaux que vous utilisez, ce qui se réduit en général à l'entrée linux-console.
  3. Le reste. Ils fonctionnent très bien tels quel, je ne les modifie donc pas.

Parmi tout cela, je n'ai en réalité que deux fichiers à configurer, et ils ne doivent contenir qu'étonnamment peu de choses.

Votre inittab doit être modifié pour que la ligne sysinit lance rc ou quelque autre script basique d'amorce. De plus, si vous ne souhaitez pas que les utilisateurs se loguent sur les ports série, commentez toutes les entrées getty qui référencent des périphériques ttys ou ttyS à la fin de la ligne. Laissez les ports tty pour pouvoir vous loguer sur la console.

Un fichier inittab minimal contient cela :

        id:2:initdefault
        si::sysinit:/etc/rc
        1:2345:respawn:/sbin/getty 9600 tty1
        2:23:respawn:/sbin/getty 9600 tty2

Le fichier inittab décrit ce que va lancer le système dans divers états, dont le démarrage, le passage en mode multi-utilisateurs, etc. Attention aux noms de fichiers référencés dans inittab ; si init ne peut trouver le programme, le disque d'amorce s'arrêtera, et vous n'aurez peut-être même pas de message d'erreur.

Notez que certains programmes ne peuvent être déplacés en raison d'autres programmes qui référencent en dur leur position. Par exemple sur mon système, /etc/shutdown référence en dur /etc/reboot. Si je déplace reboot vers /bin/reboot, et que je lance une commande shutdown, elle va échouer en ne trouvant pas le fichier reboot.

Pour le reste, copiez juste tous les fichiers texte de votre répertoire /etc, ainsi que tous les exécutables présents dans /etc dont vous n'êtes pas sûr de pouvoir vous passer. Basez-vous sur l'exemple de la section Exemple de contenu des répertoires d'un disque racine. Il vous suffira probablement de copier ces fichiers, mais les systèmes pouvant être très différents, il n'est pas certain que le même ensemble de fichiers sur votre système soit équivalent aux fichiers listés. La seule méthode sure est de partir d'inittab et d'en déduire ce qui est nécessaire.

La plupart des systèmes utilisent maintenant un répertoire /etc/rc.d/ contenant des scripts shell pour les différents niveaux d'exécution. Il faut au minimum avoir un script rc unique, mais il peut être plus simple de carrément copier inittab et le répertoire /etc/rc.d depuis votre système puis de nettoyer les scripts shell dans le répertoire rc.d pour enlever tous les traitements inutiles pour un système sur disquette.

/bin et /sbin

Le répertoire /bin est un endroit pratique pour tous les utilitaires nécessaires aux opérations de base, tels que ls, mv, cat et dd. Voir l'appendice Exemple de contenu des répertoires d'un disque racine pour un exemple d'ensemble de fichiers pouvant aller dans les répertoires /bin et /sbin. Il ne contient aucun des utilitaires nécessaires à la récupération d'une sauvegarde, tels que cpio, tar et gzip. C'est parce que je place ceux-ci sur une disquette utilitaire séparée, pour conserver de la place sur la disquette d'amorce et racine. Une fois la disquette d'amorce/racine démarrée, elle est copiée sur le disque mémoire, laissant ainsi le lecteur de disquette libre pour en monter une autre, la disquette utilitaire. En général je la monte sur /usr.

La création d'une disquette utilitaire est décrite ci-dessous dans la section Construire un disque utilitaire. Il est probablement souhaitable d'y maintenir une copie des mêmes versions d'utilitaires de sauvegarde que ceux utilisés pour écrire les sauvegardes, histoire de ne pas perdre de temps en essayant d'installer des versions qui ne peuvent pas lire vos bandes de sauvegarde.

Vérifiez que vous mettez les programmes suivants : init, getty ou un équivalent, login, mount, un shell capable de faire tourner votre script rc, un lien de sh vers le shell en question.

/lib

Vous mettez dans /lib les bibliothèques partagées et chargeurs nécessaires. Si les bibliothèques nécessaires ne sont pas trouvées dans /lib, le système ne pourra pas démarrer. Avec de la chance, un message vous expliquera pourquoi.

Pratiquement tous les programmes ont au moins besoin de la bibliothèque libc, libc.so.N, N étant le numéro de version courant. Vérifiez votre répertoire /lib, libc.so.N est en général un lien symbolique vers un fichier avec un numéro de version complet :

% ls -l /lib/libc.so*
-rwxr-xr-x   1 root     root      4016683 Apr 16 18:48 libc-2.1.1.so*
lrwxrwxrwx   1 root     root           13 Apr 10 12:25 libc.so.6 -> libc-2.1.1.so*

Dans le cas présent, il vous faut libc-2.1.1.so. Pour trouver les autres bibliothèques nécessaires, il faut lancer la commande ldd sur tous les exécutables que vous prévoyez de mettre sur la disquette. Par exemple :

        % ldd /sbin/mke2fs
        libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000)
        libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000)
        libuuid.so.1 => /lib/libuuid.so.1 (0x40028000)
        libc.so.6 => /lib/libc.so.6 (0x4002c000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Tous les fichiers à droite sont nécessaires. Le fichier peut en réalité être un lien symbolique.

Notez que certaines bibliothèques sont assez grosses et ne tiendront pas facilement sur votre système racine. Par exemple, la libc.so citée précédemment fait environ 4 mégas. Vous devrez probablement nettoyer les bibliothèques en les copiant sur votre système racine. Reportez-vous à la section Réduire la taille du système racine pour plus d'informations.

Il faut également inclure dans /lib un chargeur pour les bibliothèques. Il s'agira soit de ld.so (pour les bibliothèques a.out), soit de ld-linux.so (pour les bibliothèques ELF). Les versions récentes de ldd vous indiquent de quel chargeur vous avez besoin, comme dans l'exemple ci-dessus, mais de plus anciennes versions ne le font pas forcément. Si vous ne savez pas duquel vous avez besoin, utilisez la commande file sur la bibliothèque. Par exemple :

        % file/lib/libc.so.4.7.2 /lib/libc.so.5.4.33 /lib/libc-2.1.1.so
        /lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped
        /lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
        /lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped

Le mot QMAGIC indique que 4.7.2 est pour les bibliothèques a.out, et ELF que 5.4.33 et 2.1.1 sont pour les ELF.

Copiez le ou les chargeurs dont vous avez besoin sur le système racine que vous êtes en train de construire. Les bibliothèques et chargeurs doivent être testés attentivement avec les exécutables inclus. Si le noyau ne peut charger une bibliothèque nécessaire, il s'arrêtera en général net, sans message d'erreur.

4.4 Utilisation de PAM et NSS

Votre système peut utiliser des bibliothèques chargées dynamiquement mais invisible à ldd.

PAM (Pluggable Authentication Modules)

Si votre système utilise PAM (Pluggable Authentication Modules, soit Modules Externes d'Authentification), tenez-en compte dans la construction de votre disque d'amorce, sans quoi vous ne pourrez pas vous loguer. En quelques mots, PAM est une méthode modulaire sophistiquée pour authentifier les utilisateurs et contrôler leur accès aux services. Pour déterminer simplement si votre système utilise PAM, cherchez dans le répertoire /etc de votre disque dur un fichier pam.conf ou un répertoire pam.d ; si l'un des deux existe, vous devez prévoir un minimum de support pour PAM. (Vous pouvez aussi lancer ldd sur votre exécutable login ; si la sortie contient libpam.so, vous avez besoin de PAM.)

Heureusement, la sécurité est rarement un problème avec les disques d'amorce étant donné que quiconque avec un accès physique à la machine peut en général faire tout ce qu'il veut dessus. Vous pouvez donc complètement désactiver PAM en créant un fichier /etc/pam.conf simple sur votre système racine contenant :


OTHER   auth       optional     /lib/security/pam_permit.so
OTHER   account    optional     /lib/security/pam_permit.so
OTHER   password   optional     /lib/security/pam_permit.so
OTHER   session    optional     /lib/security/pam_permit.so

Copiez également le fichier /lib/security/pam_permit.so sur votre système racine. Cette bibliothèque ne fait qu'environ 8 Ko et ne coûte donc pas grand chose.

Notez bien que cette configuration donne à tous un accès complet aux fichiers et services de votre machine. Si vous avez des impératifs de sécurité sur votre disque d'amorce pour une raison ou une autre, vous devrez copier une partie, voire l'ensemble de la configuration PAM de votre disque dur vers le système racine. Lisez bien attentivement la documentation de PAM, et copiez toutes les bibliothèques nécessaires depuis /lib/security vers votre système racine.

Vous devez aussi inclure /lib/libpam.so sur le disque racine. Mais vous le saviez déjà puisque vous avez lancé ldd sur /bin/login qui vous a montré la dépendance.

NSS (Name Service Switch)

Si vous utilisez glibc (appelée aussi libc6), vous devez tenir compte des services de noms sans quoi vous ne pourrez pas vous loguer. Le fichier /etc/nsswitch.conf contrôle les recherches dans les bases de données pour divers services. Si vous ne comptez pas accéder à des services du réseau (tels que des recherches DNS ou NIS), un simple fichier nsswitch.conf comme suit suffit :


        passwd:     files
        shadow:     files
        group:      files
        hosts:      files
        services:   files
        networks:   files
        protocols:  files
        rpc:        files
        ethers:     files
        netmasks:   files
        bootparams: files
        automount:  files
        aliases:    files
        netgroup:   files
        publickey:  files

Ce fichier spécifie que tous les services ne sont fournis que par des fichiers locaux à la machine. Vous devez aussi inclure le fichier /lib/libnss_files.so.1 qui est chargé dynamiquement pour gérer les recherches dans les fichiers.

Si vous comptez accéder au réseau depuis votre disque d'amorce, vous pouvez créer un fichier nsswitch.conf plus complet. Voir la page de manuel de nsswitch pour plus de détails. N'oubliez pas d'inclure un fichier /lib/libnss_service.so.1 pour chaque service que vous ajoutez.

4.5 Modules

Si votre noyau est modulaire, vous devez savoir quels modules vous voudrez charger depuis votre disque d'amorce une fois le système démarré. Il vous faudra inclure les modules ftape et zftape si vos sauvegardes sont sur bandes, les modules pour périphériques SCSI si vous en avez, et éventuellement ceux pour le support PPP ou SLIP si vous souhaitez accéder au réseau en cas d'urgence.

Ces modules doivent être placés dans /lib/modules. Vous devez aussi inclure insmod, rmmod et lsmod. Si vous souhaitez charger les modules automatiquement, prenez modprobe, depmod et swapout. Et si vous utilisez kerneld, prenez le avec son fichier de configuration /etc/conf.modules.

Néanmoins, le principal avantage à utiliser les modules est que vous pouvez déplacer les modules non essentiels sur un disque utilitaire et ne les charger que lorsque nécessaire, ce qui prend alors moins de place sur le disque racine. Si vous devez gérer beaucoup de périphériques, il vaut mieux procéder de cette manière plutôt que de construire un seul gros noyau contenant tous les gestionnaires.

Attention, pour démarrer avec un système de fichiers ext2 compressé, vous devez avoir inclus le support pour disque mémoire et ext2. Ils ne peuvent être installés par modules.

4.6 Quelques ultimes détails

Certains programmes, tels que login, se plaignent si le fichier /var/run/utmp et le répertoire /var/log n'existent pas. Donc :

        mkdir -p /mnt/var/{log,run}
        touch /mnt/var/run/utmp

Enfin, après avoir installé toutes les bibliothèques dont vous avez besoin, lancez ldconfig pour refabriquer /etc/ld.so.cache sur le système racine. Le cache indique au loader où trouver les bibliothèques. Pour refabriquer ld.so.cache, lancez les commandes suivantes :

        chdir /mnt; chroot /mnt /sbin/ldconfig

La commande chroot est nécessaire car ldconfig reconstruit toujours le cache pour le système racine courant.

4.7 C'est dans la poche

Une fois le système racine construit, démontez-le, copiez-le dans un fichier et compressez-le :

        umount /mnt
        dd if=PÉRIPHÉRIQUE bs=1k | gzip -v9 > rootfs.gz

Une fois cette étape effectuée, vous obtenez un fichier rootfs.gz contenant votre système racine compressé. Vérifiez sa taille pour être sûr qu'il tient sur une disquette. Si ça n'est pas le cas vous devrez y retourner pour supprimer certains fichiers. La section Réduire la taille du système racine vous donnera des astuces pour y arriver.

5. Choisir un noyau

Vous avez maintenant un système de fichiers racine complet et compressé. La prochaine étape consiste à construire ou choisir un noyau. Dans la plupart des cas, vous pouvez copier votre noyau courant et démarrer la disquette avec. Cependant dans certains cas, vous voudrez peut-être construire un noyau différent.

La taille peut jouer. Si vous faites une disquette d'amorce/racine unique, le noyau va être un des plus gros fichiers de la disquette et il vaut donc mieux essayer d'en réduire la taille au maximum. Pour ce faire, construisez-le avec le minimum de fonctionnalités nécessaires au bon fonctionnement du système cible. Cela implique de retirer tout ce dont vous n'avez pas besoin. Le support réseau est un bon candidat, tout comme le support pour tout type de disque et de périphérique dont vous n'avez pas l'usage sur un système lancé par disquette. Comme indiqué précédemment, votre noyau doit contenir le support pour disque mémoire et ext2.

Une fois les fonctionnalités nécessaires déterminées, vous devez trouver ce qu'il faut rajouter. L'utilisation la plus courante d'une disquette d'amorce/racine est l'examen et la récupération d'un système racine endommagé, ce qui peut nécessiter le support de certaines fonctionnalités supplémentaires dans le noyau. Par exemple, si vos sauvegardes sont stockées sur bande avec Ftape pour gérer l'accès au lecteur de bande et que vous perdez votre disque racine ainsi que ceux contenant Ftape, vous ne pourrez plus récupérer vos sauvegardes depuis les bandes. Vous devrez réinstaller Linux, rapatrier et réinstaller ftape, puis essayer de lire vos sauvegardes.

Ce que je veux dire, c'est que quelle que soit la méthode d'E/S que vous utilisez au niveau du noyau pour les sauvegardes, elle doit se trouver aussi sur votre noyau d'amorce.

La procédure de construction d'un noyau est décrite dans la documentation fournie avec celui-ci. C'est assez simple à suivre, vous pouvez donc commencer par faire un tour dans /usr/src/linux. Si vous avez des problèmes pour construire un noyau, vous ne devriez probablement pas essayer de faire de disquette d'amorce/racine de toute manière. Pensez à compresser le noyau avec "make zImage".

6. Assemblage et fabrication de la ou des disquettes

Vous avez maintenant un noyau et un système de fichiers compressé. Si vous construisez un disque d'amorce/racine unique, vérifiez que leur taille ne dépasse pas celle du disque. Si vous avez un découpage sur deux disquettes, vérifiez que la taille du système racine ne dépasse pas celle de la disquette.

Il vous faut choisir entre l'utilisation de LILO pour démarrer le noyau du disque d'amorce et la copie du noyau directement sur la disquette d'amorce, sans LILO. L'avantage de LILO est la possibilité de passer des paramètres au noyau, ce qui peut être nécessaire pour initialiser votre matériel (Regardez le fichier /etc/lilo.conf sur votre machine. S'il existe et contient une ligne du type "append=...", vous avez besoin de passer des paramètres). Son inconvénient est une complexité accrue dans la construction du disque d'amorce, ainsi qu'une place occupée sur la disquette légèrement plus importante. Vous devrez configurer un petit système de fichier séparé que nous appellerons le système noyau, où vous transférerez le noyau ainsi que quelques autres fichiers nécessaires à LILO.

Si vous décidez d'utiliser LILO, continuez la lecture ; si par contre vous voulez copier le noyau directement sur la disquette, passez directement à la section Transfert du noyau sans LILO.

6.1 Transfert du noyau avec LILO

La première chose à faire est de créer un petit fichier de configuration pour LILO. Il doit ressembler à :


        boot      =/dev/fd0
        install   =/boot/boot.b
        map       =/boot/map
        read-write
        backup    =/dev/null
        compact
        image     = NOYAU
        label     = Bootdisk
        root      =/dev/fd0

Pour la signification de ces paramètres, voir la documentation utilisateur de LILO. Il vous faudra probablement aussi rajouter une ligne append=... à ce fichier, comme dans le fichier /etc/lilo.conf de votre disque dur.

Sauvez-le en tant que bdlilo.conf.

Vous devez maintenant créer un petit système de fichier, que nous appellerons système noyau, pour le différencier du système racine.

Tout d'abord, calculez la taille que celui-ci doit faire. Prenez la taille de votre noyau en blocs (la taille donnée par "ls -l NOYAU" divisée par 1024 et arrondie au chiffre supérieur), et ajoutez 50. Cinquante blocs sont en gros la taille nécessaire aux i-noeuds ainsi qu'aux autres fichiers. Vous pouvez calculer le nombre exact si vous voulez, ou simplement utiliser 50. Si vous créez un ensemble avec deux disques, vous pouvez carrément surestimer l'espace nécessaire puisque le disque n'est utilisé que par le noyau de toute manière. Appelez ce nombre BLOCS_NOYAU.

Mettez une disquette dans le lecteur (pour simplifier, supposons qu'il s'agit de /dev/fd0) et créez le système noyau ext2 dessus :

        mke2fs -i 8192 -m 0 /dev/fd0 BLOCS_NOYAU

L'option "-i 8192" indique que l'on souhaite un i-noeud pour 8192 octets. Ensuite, montez le système, supprimez le répertoire lost+found et créez des répertoire dev et boot pour LILO :

        mount /dev/fd0 /mnt
        rm -rf /mnt/lost+found
        mkdir /mnt/{boot,dev}

Ensuite, créez les périphériques /dev/null et /dev/fd0. Au lieu de chercher leurs numéros de périphériques, vous pouvez simplement les copier depuis votre disque dur avec l'option -R :

        cp -R /dev/{null,fd0} /mnt/dev

LILO a besoin d'une copie de son chargeur d'amorce, boot.b, que vous pouvez trouver sur votre disque dur. Il est d'habitude dans le répertoire /boot.

        cp /boot/boot.b /mnt/boot

Enfin, copiez le fichier de configuration de LILO que vous avez créé précédemment, avec votre noyau. Les deux peuvent être placés dans le répertoire racine :

        cp bdlilo.conf NOYAU /mnt

Tout ce dont LILO a besoin est maintenant sur le système noyau, vous pouvez donc le lancer. Le paramètre -r de LILO est utilisé pour installer le chargeur sur une autre racine que la courante :

        lilo -v -C bdlilo.conf -r /mnt

LILO doit s'exécuter sans erreur, après quoi le système noyau devrait ressembler à :


total 361
  1 -rw-r--r--   1 root     root          176 Jan 10 07:22 bdlilo.conf
  1 drwxr-xr-x   2 root     root         1024 Jan 10 07:23 boot/
  1 drwxr-xr-x   2 root     root         1024 Jan 10 07:22 dev/
358 -rw-r--r--   1 root     root       362707 Jan 10 07:23 vmlinuz
boot:
total 8
  4 -rw-r--r--   1 root     root         3708 Jan 10 07:22 boot.b
  4 -rw-------   1 root     root         3584 Jan 10 07:23 map
dev:
total 0
  0 brw-r-----   1 root     root       2,   0 Jan 10 07:22 fd0
  0 crw-r--r--   1 root     root       1,   3 Jan 10 07:22 null

Ne vous inquiétez pas si la taille des fichiers n'est pas exactement la même que la votre.

Laissez maintenant le disque dans le lecteur et allez à la section Mise en place du mot disque mémoire.

6.2 Transfert du noyau sans LILO

Si vous n'utilisez pas LILO, transférez le noyau sur le disque d'amorce avec la commande dd :

        % dd if=NOYAU of=/dev/fd0 bs=1k
        353+1 records in
        353+1 records out

Dans ce exemple, dd a écrit 353 enregistrements complets, plus 1 partiel, ce qui signifie que le noyau occupe les 354 premiers blocs de la disquette. Appelez ce nombre BLOCS_NOYAU et pensez à l'utiliser dans la section suivante.

Enfin, indiquez que le périphérique racine doit être la disquette elle-même, et que le noyau doit être chargé en lecture/écriture.

        rdev /dev/fd0 /dev/fd0
        rdev -R /dev/fd0 0

Attention à bien utiliser un -R majuscule dans la seconde commande rdev.

6.3 Mise en place du mot disque mémoire

Le mot disque mémoire situé dans l'image du noyau permet de spécifier où se trouve le système racine, ainsi que d'autres options. Le mot peut être lu et modifié avec la commande rdev, et sa valeur s'interprète de la manière suivante :

        bits  0-10 :    Décalage jusqu'au début du disque mémoire, en blocs
                        de 1024 octets
        bits 11-13 :    Inutilisé
        bit     14 :    Drapeau indiquant s'il faut charger un disque mémoire
        bit     15 :    Drapeau pour faire une pause avant de charger le
                        système racine

Si le bit 15 est mis à 1, le noyau vous demandera au moment du démarrage de changer la disquette dans le lecteur. C'est nécessaire si vous utilisez un ensemble de deux disques.

Il y a deux cas, suivant que vous créez une disquette d'amorce/racine unique ou un ensemble "amorce+racine" séparé.

  1. Si vous créez un disque unique, le système racine compressé sera placé juste après le noyau, et donc le décalage sera le premier bloc libre (qui doit être au même endroit que BLOCS_NOYAU). Le bit 14 sera mis à 1, et le bit 15 à 0. Supposons par exemple que vous construisez un disque unique dont le système racine doit commencer au bloc 253 (valeur décimale). Le mot disque mémoire devrait valoir 253 (toujours en décimal) avec le bit 14 à 1 et le bit 15 à 0. Pour calculer sa valeur vous pouvez simplement additionner les valeurs décimales. 253 + (2^14) = 253 + 16384 = 16637. Si vous ne comprenez pas d'où sort ce nombre, entrez-le dans une calculatrice scientifique et convertissez-le en binaire.
  2. Si vous créez par contre un ensemble de deux disques, le système racine sera au bloc zéro du second disque, et le décalage sera donc zéro. Le bit 14 sera mis à 1 tout comme le bit 15. La valeur décimale sera donc de 2^14 + 2^15 = 49152 dans ce cas.

Après avoir bien calculé la valeur du mot disque mémoire, écrivez-le avec rdev -r. Attention à utiliser la valeur décimale. Si vous utilisez LILO, l'argument de rdev doit être le chemin d'accès au noyau monté, c'est à dire /mnt/vmlinuz ; si vous avez copié le noyau avec dd, utilisez à la place le nom du périphérique du lecteur de disquette (c'est à dire /dev/fd0).

        rdev -r NOYAU_OU_LECTEUR_DE_DISQUETTE VALEUR

Si vous avez utilisé LILO, démontez maintenant la disquette.

6.4 Transfert du système racine

La dernière étape concerne le transfert du système racine.

Bravo, vous avez fini ! Vous devriez toujours tester un disque d'amorce avant de le ranger jusqu'à la prochaine urgence ! S'il n'arrive pas à démarrer, continuez à lire.

7. En cas de problème, ou L'agonie de la défaite

Lorsque l'on crée des disques d'amorce, les premiers essais n'amorcent souvent pas la machine. En général, la méthode utilisée consiste à construire le disque racine à partir de composants de votre système actuel pour essayer d'obtenir que le système de la disquette commence à afficher des messages sur la console. Une fois qu'il a commencé à vous parler, la bataille est presque gagnée puisque vous pouvez voir de quoi il se plaint et corriger les problèmes un à un jusqu'à ce que le système fonctionne normalement. Si le système s'arrête brutalement sans explication, il peut être difficile d'en trouver la cause. Pour que le système en arrive au point où il commence à afficher ses messages, un certain nombre de composants doivent être présents et bien configurés. La procédure à suivre pour déterminer les raisons du silence de votre système est la suivante :

Une fois ces points généraux vérifiés, vous pouvez vous pencher sur ces points plus précis :

  1. Vérifiez qu'init est présent en tant que /sbin/init ou /bin/init, et qu'il est exécutable ;
  2. Lancez ldd init pour vérifier les bibliothèques d'init. Il n'y a normalement que libc.so, mais sait-on jamais... Vérifiez que vous avez bien inclus les bibliothèques et leurs chargeurs ;
  3. Vérifiez que vous avez le bon chargeur pour vos bibliothèques : ld.so pour a.out et ld-linux.so pour ELF ;
  4. Vérifiez le contenu de /etc/inittab sur la disquette d'amorce et ses éventuels appels à getty (ou tout autre programme du genre, tel que agetty, mgetty ou getty_ps). Comparez-le plusieurs fois avec l'inittab de votre disque dur. Vérifiez les pages de manuel du programme que vous utilisez pour être sûr de sa cohérence. inittab peut être le morceau le plus difficile en raison de sa syntaxe et du contenu qui dépendent de la version d'init utilisée et de la nature du système. La seule manière de s'en débarrasser, c'est de lire les pages de manuel d'init et inittab afin de comprendre exactement ce que fait le système lorsqu'il démarre. Vérifiez que /etc/inittab contient bien une entrée concernant l'initialisation du système. Elle doit contenir une commande lançant le script d'initialisation du système, qui doit lui aussi exister ;
  5. Comme pour init, lancez ldd sur votre getty pour voir ses besoins, et vérifiez que les bibliothèques et chargeurs nécessaires sont présents sur le système racine ;
  6. Assurez-vous d'avoir inclus un exécutable de shell (par exemple bash ou ash) capable de faire tourner tous vos scripts rc ;
  7. Si vous avez un fichier /etc/ld.so.cache sur le disque de secours, refabriquez-le (le fichier, pas le disque).

Si init démarre mais vous obtenez un message du type :

        Id xxx respawning too fast: disabled for 5 minutes

il provient d'init et indique généralement que getty ou login meurt aussitôt après son lancement. Vérifiez les exécutables de getty et login, et les bibliothèques dont ils dépendent. Vérifiez que les appels depuis /etc/inittab sont corrects. Si vous obtenez d'étranges messages de getty, cela peut signifier que les arguments dans /etc/inittab sont faux. Les options des programmes getty sont variables ; on signale que les arguments sont parfois incompatibles entre deux versions d'agetty.

Si vous obtenez une invite de login et qu'après avoir entré un nom de login valide, le système vous en demande un autre aussitôt, le problème peut venir de PAM ou NSS. Lisez la section Utilisation de PAM et NSS. Le problème peut aussi venir du fait que vous utilisez les mots de passe cachés et que vous n'avez pas copié le fichier /etc/shadow sur votre disque d'amorce.

Si vous essayez de lancer un exécutable tel que df présent sur votre disque de secours, mais n'obtenez qu'un message du type : df: not found, vérifiez deux chose : (1) que le répertoire contenant le binaire est bien dans votre PATH, et (2) que vous avez les bibliothèques (et chargeurs) nécessaires au programme.

8. Sujets divers

8.1 Réduire la taille du système racine

Parfois un système racine est trop gros pour tenir sur une disquette, même après compression. Voici quelques techniques pour réduire sa taille, citées par ordre décroissant d'efficacité :

Augmentez la densité du disque

Par défaut, les disquettes sont formattées à 1440 Ko, mais des formats plus denses existent. fdformat peut formatter des disques avec les tailles suivantes : 1600, 1680, 1722, 1743, 1760, 1840 et 1920. La plupart des lecteurs 1440 Ko peuvent supporter 1722 Ko, et c'est ce que j'utilise toujours pour les disques d'amorce. Lisez la page de manuel de fdformat ainsi que /usr/src/linux/Documentation/devices.txt.

Changez de shell

Certains shells populaires sous Linux, tels que bash et tcsh, sont gros et nécessitent de nombreuses bibliothèques. D'autres options plus légères existent, telles que ash, lsh, kiss et smash, bien plus petites et nécessitant peu (ou pas) de bibliothèques. La plupart de ces shells de remplacement sont disponibles sur http://metalab.unc.edu/pub/Linux/system/shells/. Vérifiez que le shell que vous utilisez sait faire tourner les commandes de tous les scripts rc que vous incluez sur le disque d'amorce.

Nettoyez les bibliothèques et binaires

De nombreux binaires et bibliothèques restent non nettoyés (ils contiennent les informations pour le debogage). Si vous lancez 'file' sur ces fichiers, il vous indiquera 'not stripped' si c'est le cas. Lorsque vous copiez des binaires sur votre système racine, une bonne habitude à prendre est d'utiliser :

        objcopy --strip-all ORIGINE DESTINATION

Et lorsque vous copiez des bibliothèques :

        objcopy --strip-debug ORIGINE DESTINATION

Déplacez les fichiers non essentiels vers un disque utilitaire

Si certains binaires ne sont pas immédiatement nécessaires au démarrage ou au login, vous pouvez les déplacer sur un disque utilitaire. Lisez la section Construire un disque utilitaire pour les détails. Vous pouvez aussi déplacer les modules vers un disque utilitaire.

8.2 Système racine sans disque mémoire

La section Construire un système racine explique comment construire un système racine compressé chargé en mémoire lors du démarrage du système. Cette méthode qui présente beaucoup d'avantages est souvent utilisée. Néanmoins, certains systèmes possédant peu de mémoire ne peuvent se permettre d'utiliser de la RAM pour un disque mémoire, et doivent donc utiliser un système racine monté directement depuis la disquette.

De tels systèmes sont en réalité plus facile à construire que les systèmes racines compressés car on peut les créer directement sur disquette plutôt qu'en passant par un autre périphérique intermédiaire, et ne nécessitent pas de compression. Nous indiquerons les différences de procédure par rapports aux instructions précédentes. Si vous choisissez cette méthode, rappelez-vous bien que vous aurez beaucoup moins d'espace disque disponible.

  1. Calculez la taille disponible pour les fichiers racines. Si vous construisez un système d'amorce/racine unique, vous devez arriver à faire tenir tous les blocs du noyau ainsi que tous les blocs du système racine sur un seul disque.
  2. A l'aide de mke2fs, créez un système racine de la bonne taille sur une disquette.
  3. Remplissez le système comme décrit précédemment.
  4. Après cela, démontez le système et transférez-le vers un fichier sur le disque, mais sans le compresser.
  5. Transférez le noyau sur une disquette comme décrit précédemment. Lorsque vous calculerez le mot disque mémoire, mettez le bit 14 à 0 pour indiquer que le système racine ne doit pas être chargé en mémoire. Lancez la commande rdev indiquée.
  6. Transférez le système racine comme précédemment.

Vous pouvez prendre quelques raccourcis. Si vous construisez un système avec deux disques, vous pouvez construire le système de fichiers racine directement sur le second disque au lieu de le transférer sur le disque dur puis à nouveau sur la disquette. De même, si vous construisez un disque d'amorce/racine unique et si vous utilisez LILO, vous pouvez créer un système de fichiers unique sur toute la disquette contenant le noyau, les fichiers de LILO et les fichiers racine, avant de simplement lancer LILO comme dernière étape.

8.3 Construire un disque utilitaire

Construire un disque utilitaire est assez facile : créez simplement un système de fichiers sur une disquette formattée et copiez les fichiers dessus. Pour l'utiliser depuis un disque d'amorce, montez-le manuellement une fois le système démarré.

Les instructions précédentes indiquent qu'un disque utilitaire peut être monté en tant que /usr. Dans ce cas, les binaires doivent être placés dans un répertoire /bin du disque utilitaire, afin d'être référencés si vous mettez /usr/bin dans votre chemin. Les bibliothèques supplémentaires nécessaires aux binaires sont à placer dans /lib sur le disque utilitaire.

Il faut penser à plusieurs choses lorsque l'on crée un disque utilitaire :

  1. Ne placez pas de binaires ou de bibliothèques essentiels au système sur le disque utilitaire, puisqu'il ne sera montable qu'une fois le système démarré ;
  2. Vous ne pouvez pas utiliser de lecteur de disquette et de lecteur de bande sur port disquette en même temps. Ce qui veut dire que si votre lecteur de bande est sur un port disquette, vous ne pourrez pas y accéder tant que votre disque utilitaire sera monté ;
  3. L'accès aux fichiers du disque utilitaire sera lent.

L'annexe Exemple de contenu de disque utilitaire montre ce que peut contenir un tel disque. Voici quelques idées de fichiers qui peuvent vous être utiles : programmes de diagnostic et de manipulation de disques (format, fdisk) et systèmes de fichiers (mke2fs, fsck, debugfs, isofs.o), un éditeur de texte léger (elvis, jove), des utilitaires de compression et archivage (gzip, tar, cpio, afio), de gestion de bande (mt, tob, taper), de communication (ppp.o, slip.o, minicom) et de gestion de périphériques (setseriad, mknod).

9. La méthode des pros

Vous avez peut-être remarqué comme les disques d'amorce utilisés par les principales distributions comme Slackware, RedHat ou Debian paraissent plus sophistiqués que ce que décrit ce document. Les disques d'amorce de distribution professionnelles se basent sur les mêmes principes que ceux décrits ici, mais utilisent diverses astuces pour satisfaire aux besoins supplémentaires de leurs disques d'amorce. Tout d'abord, ils doivent pouvoir fonctionner sur une grande variété de matériel et doivent donc pouvoir interagir avec l'utilisateur et charger divers gestionnaires de périphériques. Ensuite, ils doivent pouvoir travailler avec beaucoup d'options d'installation différentes, de manière plus ou moins automatique. Enfin, les disques d'amorce des distributions combinent en général la possibilité d'installer le système avec celle de le réparer.

Certains disques d'amorce utilisent une fonctionnalité appelée initrd (initial ramdisk, ou disque mémoire initial). Cette fonctionnalité est apparue aux alentours de la version 2.0.x et permet au noyau de démarrer en deux étapes. Quand le noyau commence son démarrage, il charge une première image de disque mémoire depuis le disque d'amorce. Ce disque mémoire initial est un système racine contenant un programme à exécuter avant le chargement du vrai système racine. Ce programme inspecte en général l'environnement et/ou demande à l'utilisateur de sélectionner diverses options de démarrage, telles que le périphérique sur lequel on va trouver le vrai disque racine. En général, il charge des modules supplémentaires ne faisant pas partie du noyau. Quand ce programme initial se termine, le noyau charge la vraie image racine et continue son démarrage normalement. Pour plus d'information sur initrd, lisez /usr/src/linux/Documentation/initrd.txt et ftp://elserv.ffm.fgan.de/pub/linux/loadlin-1.6/initrd-example.tgz.

Vous trouverez ci-dessous des résumés sur la manière dont les disques d'installation de chaque distribution semblent marcher, après étude de leurs systèmes de fichiers et/ou code source. Nous ne garantissons pas l'exactitude des informations, ni qu'elles n'ont pas changé depuis les versions indiquées.

Slackware (v.3.1) utilise un démarrage direct avec LILO semblable à la description de la section Transfert du noyau avec LILO. Le disque d'amorce de la Slackware affiche un message de démarrage ("Welcome to the Slackware Linux bootkernel disk!") en utilisant le paramètre message de LILO. Ce message indique à l'utilisateur d'entrer une ligne de paramètres de démarrage si nécessaire. Après le démarrage, un système racine est chargé depuis une seconde disquette. L'utilisateur lance un script de configuration (setup) qui démarre l'installation. Au lieu d'utiliser un noyau modulaire, Slackware fournit un certain nombre de noyaux différents, et c'est à l'utilisateur de fournir celui qui correspond à sa configuration matérielle.

RedHat (v.4.0) utilise aussi un démarrage avec LILO. Il charge un disque mémoire compressé sur le premier disque, qui fait tourner une version personnalisée d'init. Ce programme demande quels gestionnaires utiliser puis charge des fichiers supplémentaires depuis un autre disque si nécessaire.

Debian (v.1.3) possède probablement le groupe de disques d'installation le plus sophistiqué. Il utilise le chargeur SYSLINUX pour choisir différentes options de chargement, puis utilise une image initrd pour guider l'utilisateur dans l'installation. Il semble utiliser à la fois des versions personnalisées d'init et du shell.

10. Foire Aux Questions (FAQ)

Q. Je démarre depuis mes disques d'amorce/racine et rien ne se passe. Que faire ?

Voir la section précédente En cas de problèmes.

Q. Comment fonctionne le disque d'amorce Slackware/Debian/RedHat ?

Voir la section précédente La méthode des pros.

Q. Comment faire un disque d'amorce avec un gestionnaire pour XYZ ?

Le plus simple est d'obtenir un noyau Slackware depuis le site miroir de Slackware le plus proche. Les noyaux Slackware sont des noyaux génériques contenant le plus de gestionnaires pour le plus de périphériques différents possibles. Si vous avez un contrôleur SCSI ou IDE, vous avez de bonnes chances de trouver un gestionnaire correspondant dans le noyau Slackware.

Allez dans le répertoire a1 et sélectionnez un noyau SCSI ou IDE suivant votre type de contrôleur. Vérifiez dans le fichier xxxxkern.cfg correspondant au noyau choisi qu'il contient bien les gestionnaires que vous voulez. Si c'est le cas, le noyau correspondant devrait pouvoir démarrer votre ordinateur. Récupérez le fichier xxxxkern.tgz et copiez-le sur votre disquette d'amorce comme indiqué dans la section sur la fabrication des disques d'amorce.

Vous devez ensuite vérifier le périphérique racine indiqué dans le noyau, en utilisant la commande :

        rdev zImage

rdev vous montrera alors le périphérique actuellement configuré dans le noyau. Si ce n'est pas celui que vous voulez, utilisez rdev pour le changer. Par exemple, le noyau que j'ai essayé pointait sur /dev/sda2, mais ma partition racine SCSI est sur /dev/sda8. Pour utiliser une disquette racine, vous devrez lancer la commande :

        rdev zImage /dev/fd0

Si vous voulez aussi savoir comment configurer un disque racine Slackware, cela dépasse le cadre de ce HOWTO, et je vous suggère donc de consulter le Guide d'Installation de Linux ou de récupérer la distribution Slackware. Voir la section Références de ce HOWTO.

Q. Comment mettre à jour le noyau de ma disquette d'amorce ?

Copiez simplement le noyau sur votre disquette d'amorce à l'aide de la commande dd s'il s'agit d'une disquette d'amorce sans système de fichier, ou par la commande cp pour un disque d'amorce/racine. Reportez-vous à la section Démarrage de ce HOWTO pour les détails de création d'un disque d'amorce. Le processus décrit s'applique aussi bien à la mise à jour d'un noyau sur le disque d'amorce.

Q. Comment mettre à jour ma disquette racine avec de nouveaux fichiers ?

Le plus simple est de recopier le système de fichiers depuis le disque racine vers le PÉRIPHÉRIQUE que vous avez utilisé (comme dans la section précédente Création du système racine). Montez ensuite le système de fichiers et modifiez-le. Vous devez vous souvenir d'où partait votre système racine et du nombre de blocs qu'il occupait :

        dd if=/dev/fd0 bs=1k skip=DEBUTRACINE count=BLOCS | \
                gunzip > PÉRIPHÉRIQUE
        mount -t ext2 PÉRIPHÉRIQUE /mnt

Une fois les modifications effectuées, recommencez comme précédemment (dans la section C'est dans la poche) et retransférez le système racine sur le disque. Vous ne devriez pas avoir à retransférer le noyau ou à recalculer le mot disque mémoire si vous ne changez pas la position de départ du nouveau système de fichiers.

Q. Comment retirer LILO pour pouvoir redémarrer DOS ?

Ce n'est pas réellement un problème de disque d'amorce, mais il est souvent posé. Sous Linux, vous pouvez lancer :

        /sbin/lilo -u

Vous pouvez aussi utiliser la commande dd pour copier la sauvegarde effectuée par LILO sur le secteur d'amorce. Reportez-vous à la documentation de LILO si vous voulez essayer.

Sous DOS et Windows vous pouvez utiliser la commande DOS :

        FDISK /MBR

MBR signifie Master Boot Record (Enregistrement d'Amorce Maître), et il remplace le secteur de démarrage avec une version propre du DOS, sans modifier la table de partitions. Certains puristes n'apprécient pas cette méthode, mais même l'auteur de LILO, Werner Almesberger, le suggère. C'est facile et ça marche.

Q. Comment puis-je démarrer si j'ai perdu mon noyau et mon disque d'amorce ?

Si vous n'avez pas de disque d'amorce sous la main, le plus simple est d'obtenir un noyau Slackware pour votre type de contrôleur de disque (IDE ou SCSI) comme décrit précédemment dans "Comment faire un disque d'amorce avec un gestionnaire pour XYZ ?". Vous pouvez alors démarrer votre ordinateur avec ce noyau, puis réparer les dommages éventuels.

Le noyau que vous récupérerez peut ne pas avoir comme périphérique racine ce que vous souhaitez comme disque et partition. Par exemple, le noyau générique SCSI de Slackware utilise /dev/sda2 comme périphérique racine, alors que ma partition racine Linux se trouve être /dev/sda8. Dans ce cas il faut changer le périphérique racine.

Vous pouvez changer les paramètres de périphérique racine et disque mémoire du noyau même si vous n'avez que le noyau, et un autre système d'exploitation tel que DOS.

rdev modifie les paramètres du noyau en changeant les valeurs à un décalage fixé dans le fichier du noyau, et vous pouvez donc faire de même si vous avez un éditeur hexadécimal disponible sous quelque système d'exploitation fonctionnant encore -- par exemple, Norton Utilities Disk Editor sous DOS. Vous devez alors vérifier puis éventuellement modifier les valeurs dans le noyau, aux décalages suivants :

HEX     DEC  DESCRIPTION
0x01F8  504  Octet de poids faible du mot disque mémoire
0x01F9  505  Octet de poids fort du mot disque mémoire
0x01FC  508  Numéro mineur du périphérique racine : voir ci-dessous
0X01FD  509  Numéro majeur du périphérique racine : voir ci-dessous

L'interprétation du mot disque mémoire était décrite dans la précédente section Mise en place du mot disque mémoire.

Les numéros majeurs et mineurs de périphérique doivent correspondre au périphérique à partir duquel le système racine sera monté. Certaines valeurs utiles parmi lesquelles vous pouvez choisir sont :

DEVICE        MAJEUR MINEUR
/dev/fd0           2      0   1er lecteur de disquette
/dev/hda1          3      1   partition 1 sur le 1er disque IDE
/dev/sda1          8      1   partition 1 sur le 1er disque SCSI
/dev/sda8          8      8   partition 8 sur le 1er disque SCSI

Une fois ces valeurs mises en place, vous pouvez écrire le fichier sur une disquette en utilisant soit Norton Utilities Disk Editor, soit un programme appelé rawrite.exe. Ce programme est inclus dans toutes les distributions. C'est un programme DOS qui écrit directement un fichier sur le disque, en commençant à partir du secteur d'amorce, au lieu de l'écrire dans le système de fichiers. Si vous utilisez Norton Utilities, vous devez écrire le fichier un disque physique en commençant au début du disque.

Q. Comment faire des copies supplémentaires des disquettes d'amorce/racine ?

Les supports magnétiques se détériorant avec le temps, vous devriez conserver plusieurs copies de votre disque de secours, au cas où l'original n'est plus lisible.

Le plus simple pour copier une disquette quelle qu'elle soit, y compris une disquette d'amorce ou utilitaire, est d'utiliser la commande dd pour copier le contenu de la disquette originale vers un fichier de votre disque dur, puis de réutiliser la même commande pour recopier le fichier vers une nouvelle disquette. Notez que vous n'avez pas besoin de monter la disquette, et ne devriez pas le faire, car dd utilise l'interface directe du périphérique.

Pour copier l'original, entrez la commande :

        dd if=NOMPÉRIPHÉRIQUE of=NOMFICHIER
        où NOMPÉRIPHÉRIQUE est le nom du périphérique du lecteur de disquette
        et NOMFICHIER le nom du fichier de sortie (sur le disque dur)

Ne pas mettre le paramètre count permet à dd de copier la disquette en entier (2880 blocs en haute densité).

Pour recopier le fichier résultant sur une nouvelle disquette, insérez celle-ci et entrez la commande inverse :

        dd if=NOMFICHIER of=NOMPÉRIPHÉRIQUE

A noter que la discussion précédente suppose que vous n'avez qu'un seul lecteur de disquette. Si vous en avez deux du même type, vous pouvez copier les disquettes à l'aide d'une commande du type :

        dd if=/dev/fd0 of=/dev/fd1

Q. Comment puis-je démarrer sans avoir à taper "ahaxxxx=nn,nn,nn" à chaque fois ?

Quand un périphérique disque ne peut pas être détecté automatiquement, il faut fournir au noyau une chaîne de paramètres de commande du périphérique, telle que :

        aha152x=0x340,11,3,1

Cette chaîne peut être fournie de différentes manières grâce à LILO :

Par exemple, une ligne de commande utilisant la chaîne ci-dessus serait :

        zImage  aha152x=0x340,11,3,1 root=/dev/sda1 lock

Cela passerait la chaîne de paramètres pour le périphérique tout en demandant au noyau d'utiliser /dev/sda1 comme périphérique racine et de sauvegarder la ligne de commande pour la réutiliser pour tous les démarrages futurs.

Un exemple de directive APPEND peut être :

        APPEND = "aha152x=0x340,11,3,1"

Attention, la chaîne de paramètres ne doit PAS être entourée de guillemets sur la ligne de commande, mais DOIT l'être dans la directive APPEND.

Notez aussi que pour que la chaîne de paramètres soit utilisée, le noyau doit contenir le gestionnaire pour ce type de disque. Si ce n'est pas le cas, personne n'écoute la chaîne de paramètres, et vous devrez reconstruire le noyau pour inclure le gestionnaire requis. Pour plus de détails sur la reconstruction du noyau, rendez-vous dans /usr/src/linux et lisez le README, et lisez la FAQ Linux et le HOWTO Installation. Vous pouvez aussi obtenir un noyau générique pour votre type de disque et l'installer.

Il est fortement recommandé aux lecteurs de lire la documentation de LILO avant de faire des expériences d'installation de LILO. Une utilisation imprudente de la directive BOOT peut endommager des partitions.

Q. Au démarrage, j'obtiens l'erreur "A: cannot execute B". Pourquoi ?

Il existe plusieurs utilitaires qui référencent en dur le nom d'autres programmes. Ça n'arrive pas tout le temps, mais cela peut expliquer pourquoi un exécutable peut ne pas être trouvé sur votre système même si vous l'y voyez. Vous pouvez vérifier si un programme donné est référence en dur dans un autre en utilisant la commande strings et en passant son résultat par grep.

On trouve comme exemples connus de référence en dur :

Pour corriger ces problèmes, vous pouvez soit déplacer les programmes vers le répertoire attendu, soit changer les fichiers de configuration (par exemple inittab) pour référencer le bon répertoire. En cas de doute, mettez les programmes dans le même répertoire que sur votre disque dur, et utilisez les mêmes fichiers inittab et /etc/rc.d que sur celui-ci.

Q. Mon noyau gère les disques mémoires, mais les initialise à 0 Ko

Quand cela arrive, un message du noyau apparaîtra au moment du démarrage, du type :

        Ramdisk driver initialized : 16 ramdisks of 0K size

C'est probablement parce que la taille a été fixée par les paramètres du noyau à 0 au moment du démarrage. Cela peut être dû à un paramètre oublié dans le fichier de configuration de LILO :

        ramdisk= 0

Certaines vieilles distributions l'incluaient dans des exemples de fichiers de configuration de LILO, et servaient à écraser les paramètres antérieurs du noyau. Si vous trouvez une telle ligne, supprimez-la.

Attention, si vous essayez d'utiliser un disque mémoire dont la taille est de 0 Ko, le comportement est imprévisible et peut conduire à une panique (panic) du noyau.

11. Ressources et pointeurs

Lorsque vous récupérez un paquetage, prenez toujours la dernière version, sauf si vous avez de bonnes raisons pour ne pas le faire.

11.1 Disques d'amorce préfabriqués

Ce sont les sources des disques d'amorce des distributions. Merci d'utiliser un site miroir pour réduire la charge sur ces machines.

En plus des disques d'amorce des distributions, les images de disques de secours suivantes sont disponibles. Sauf précision contraire, elles sont disponibles dans le répertoire http://metalab.unc.edu/pub/Linux/system/recovery/!INDEX.html.

11.2 Paquetages de secours

Plusieurs paquetages de création de disques de secours existent sur metalab.unc.edu. Vous précisez à ces paquetages un ensemble de fichiers à inclure, et le logiciel automatise (à divers degrés) la création d'un disque d'amorce. Voir http://metalab.unc.edu/pub/Linux/system/recovery/!INDEX.html pour plus d'informations. Vérifiez bien les dates des fichiers : certains paquetages n'ont pas été mis à jour depuis des années et ne supportent pas la création d'un système racine compressé sur disque mémoire. A notre connaissance, Yard est le seul paquetage le permettant.

11.3 Scripts shell et Graham Chapman

Graham Chapman a écrit un ensemble de scripts pouvant être utiles comme exemple sur la manière de créer des disques d'amorce. Dans les précédentes versions de ce HOWTO, les scripts apparaissaient en annexe, mais ils ont été supprimés du document et placés sur une page web :

http://www.zeta.org.au/~grahamc/linux.html

Vous pourrez trouver ces scripts utiles, mais si oui, lisez attentivement les instructions : par exemple, si vous précisez le mauvais périphérique de pagination, vous verrez votre système racine se faire complètement et définitivement effacer. Vérifiez que vous l'avez bien configuré avant de le lancer !

11.4 LILO : le chargeur Linux

Ecrit par Werner Almesberger. Excellent chargeur d'amorce, dont la documentation comprend des informations sur le contenu du secteur d'amorce et les premières étapes du processus de démarrage.

Ftp depuis ftp://tsx-11.mit.edu/pub/linux/packages/lilo/. Il est aussi disponible sur Metalab et ses miroirs.

11.5 FAQ Linux et HOWTOs

Ils sont disponibles depuis de nombreuses sources. Jetez un coup d'oeil au forum Usenet news.answers et comp.os.linux.announce (et fr.comp.os.linux.annonces) pour une version française).

La FAQ est disponible sur http://metalab.unc.edu/pub/Linux/docs/faqs/linux-faq et les HOWTOs sur http://metalab.unc.edu/pub/Linux/docs/HOWTO (en français, sur http://www.freenix.fr/linux/HOWTO/).

La plupart des documentations sur Linux peuvent être trouvées sur la page principale du Linux Documentation Project http://metalab.unc.edu/LDP/.

Si vous êtes désespéré, envoyez un courrier électronique à mail-server@rtfm.mit.edu avec le mot "help" dans le message, puis suivez les instructions.

11.6 Utilisation du disque mémoire

La documentation fournie avec le noyau Linux contient une excellente description de la manière dont fonctionne le nouveau code de disque mémoire. Voir /usr/src/linux/Documentation/ramdisk.txt. C'est écrit par Paul Gortmaker, et comprend une section sur la création d'un disque mémoire compressé.

11.7 Le processus de démarrage de Linux

Pour plus de détails sur le processus de démarrage de Linux, voici quelques pointeurs :

12. Codes d'erreur du démarrage de LILO

Les questions sur ces erreurs sont posées si souvent sur Usenet que nous les incluons ici en tant que service public. Ce résumé est extrait de la Documentation Utilisateur de LILO de Werner Almesberger, disponible sur http://metalab.unc.edu/pub/Linux/system/boot/lilo/lilo-u-21.ps.gz.

Quand LILO se charge, il affiche le mot "LILO". Chaque lettre est imprimée avant ou après l'exécution d'une action spécifique. Si LILO échoue à un moment donné, les lettres affichées jusque là peuvent être utilisées pour identifier le problème.

(rien)

Aucun morceau de LILO n'a été chargé. Soit LILO n'est pas installé, soit la partition sur laquelle son secteur d'amorce se trouve n'est pas active.

L

Le premier morceau du chargeur d'amorce a été chargé et démarré, mais il ne peut charger le second morceau. Les codes d'erreur à deux chiffres indiquent le type de problème. (Voir également la section "Codes d'erreur disque".) Ce cas indique en général une panne de périphérique ou une incohérence de géométrie (c'est à dire de mauvais paramètres disques).

LI

Le premier morceau du chargeur d'amorce a pu charger le second morceau, mais n'a pas réussi à l'exécuter. Cela peut être causé par une incohérence de géométrie ou par le déplacement de /boot/boot.b sans lancer l'installateur de carte.

LIL

Le second morceau du chargeur d'amorce a été démarré, mais il ne trouve pas la table de descripteurs dans le fichier carte. C'est en général dû à une panne de périphérique ou une incohérence de géométrie.

LIL?

Le second morceau du chargeur d'amorce a été chargé à un adresse incorrecte. C'est en général causé par une subtile incohérence de géométrie, ou par le déplacement de /boot/boot.b sans lancer l'installateur de carte.

LIL-

La table de descripteurs est corrompue. Cela peut être dû à une incohérence de géométrie ou au déplacement de /boot/map sans lancer l'installeur.

LILO

Tous les éléments de LILO ont été correctement chargés.

Si le BIOS signale une erreur lorsque LILO essaye de charger une image d'amorce, le code d'erreur correspondant est affiché. Ces codes vont de 0x00 à 0xbb. Reportez-vous au Guide Utilisateur de LILO pour leur explication.

13. Exemple de contenu de répertoires sur un disque racine

Voici le contenu d'un exemple de système racine et d'une disquette utilitaire.

Répertoire racine:
drwx--x--x   2 root     root         1024 Nov  1 15:39 bin
drwx--x--x   2 root     root         4096 Nov  1 15:39 dev
drwx--x--x   3 root     root         1024 Nov  1 15:39 etc
drwx--x--x   4 root     root         1024 Nov  1 15:39 lib
drwx--x--x   5 root     root         1024 Nov  1 15:39 mnt
drwx--x--x   2 root     root         1024 Nov  1 15:39 proc
drwx--x--x   2 root     root         1024 Nov  1 15:39 root
drwx--x--x   2 root     root         1024 Nov  1 15:39 sbin
drwx--x--x   2 root     root         1024 Nov  1 15:39 tmp
drwx--x--x   7 root     root         1024 Nov  1 15:39 usr
drwx--x--x   5 root     root         1024 Nov  1 15:39 var

/bin:
-rwx--x--x   1 root     root        62660 Nov  1 15:39 ash
-rwx--x--x   1 root     root         9032 Nov  1 15:39 cat
-rwx--x--x   1 root     root        10276 Nov  1 15:39 chmod
-rwx--x--x   1 root     root         9592 Nov  1 15:39 chown
-rwx--x--x   1 root     root        23124 Nov  1 15:39 cp
-rwx--x--x   1 root     root        23028 Nov  1 15:39 date
-rwx--x--x   1 root     root        14052 Nov  1 15:39 dd
-rwx--x--x   1 root     root        14144 Nov  1 15:39 df
-rwx--x--x   1 root     root        69444 Nov  1 15:39 egrep
-rwx--x--x   1 root     root          395 Nov  1 15:39 false
-rwx--x--x   1 root     root        69444 Nov  1 15:39 fgrep
-rwx--x--x   1 root     root        69444 Nov  1 15:39 grep
-rwx--x--x   3 root     root        45436 Nov  1 15:39 gunzip
-rwx--x--x   3 root     root        45436 Nov  1 15:39 gzip
-rwx--x--x   1 root     root         8008 Nov  1 15:39 hostname
-rwx--x--x   1 root     root        12736 Nov  1 15:39 ln
-rws--x--x   1 root     root        15284 Nov  1 15:39 login
-rwx--x--x   1 root     root        29308 Nov  1 15:39 ls
-rwx--x--x   1 root     root         8268 Nov  1 15:39 mkdir
-rwx--x--x   1 root     root         8920 Nov  1 15:39 mknod
-rwx--x--x   1 root     root        24836 Nov  1 15:39 more
-rws--x--x   1 root     root        37640 Nov  1 15:39 mount
-rwx--x--x   1 root     root        12240 Nov  1 15:39 mt
-rwx--x--x   1 root     root        12932 Nov  1 15:39 mv
-r-x--x--x   1 root     root        12324 Nov  1 15:39 ps
-rwx--x--x   1 root     root         5388 Nov  1 15:39 pwd
-rwx--x--x   1 root     root        10092 Nov  1 15:39 rm
lrwxrwxrwx   1 root     root            3 Nov  1 15:39 sh -> ash
-rwx--x--x   1 root     root        25296 Nov  1 15:39 stty
-rws--x--x   1 root     root        12648 Nov  1 15:39 su
-rwx--x--x   1 root     root         4444 Nov  1 15:39 sync
-rwx--x--x   1 root     root       110668 Nov  1 15:39 tar
-rwx--x--x   1 root     root        19712 Nov  1 15:39 touch
-rwx--x--x   1 root     root          395 Nov  1 15:39 true
-rws--x--x   1 root     root        19084 Nov  1 15:39 umount
-rwx--x--x   1 root     root         5368 Nov  1 15:39 uname
-rwx--x--x   3 root     root        45436 Nov  1 15:39 zcat

/dev:
lrwxrwxrwx   1 root     root            6 Nov  1 15:39 cdrom -> cdu31a
brw-rw-r--   1 root     root      15,   0 May  5  1998 cdu31a
crw-------   1 root     root       4,   0 Nov  1 15:29 console
crw-rw-rw-   1 root     uucp       5,  64 Sep  9 19:46 cua0
crw-rw-rw-   1 root     uucp       5,  65 May  5  1998 cua1
crw-rw-rw-   1 root     uucp       5,  66 May  5  1998 cua2
crw-rw-rw-   1 root     uucp       5,  67 May  5  1998 cua3
brw-rw----   1 root     floppy     2,   0 Aug  8 13:54 fd0
brw-rw----   1 root     floppy     2,  36 Aug  8 13:54 fd0CompaQ
brw-rw----   1 root     floppy     2,  84 Aug  8 13:55 fd0D1040
brw-rw----   1 root     floppy     2,  88 Aug  8 13:55 fd0D1120
brw-rw----   1 root     floppy     2,  12 Aug  8 13:54 fd0D360
brw-rw----   1 root     floppy     2,  16 Aug  8 13:54 fd0D720
brw-rw----   1 root     floppy     2, 120 Aug  8 13:55 fd0D800
brw-rw----   1 root     floppy     2,  32 Aug  8 13:54 fd0E2880
brw-rw----   1 root     floppy     2, 104 Aug  8 13:55 fd0E3200
brw-rw----   1 root     floppy     2, 108 Aug  8 13:55 fd0E3520
brw-rw----   1 root     floppy     2, 112 Aug  8 13:55 fd0E3840
brw-rw----   1 root     floppy     2,  28 Aug  8 13:54 fd0H1440
brw-rw----   1 root     floppy     2, 124 Aug  8 13:55 fd0H1600
brw-rw----   1 root     floppy     2,  44 Aug  8 13:55 fd0H1680
brw-rw----   1 root     floppy     2,  60 Aug  8 13:55 fd0H1722
brw-rw----   1 root     floppy     2,  76 Aug  8 13:55 fd0H1743
brw-rw----   1 root     floppy     2,  96 Aug  8 13:55 fd0H1760
brw-rw----   1 root     floppy     2, 116 Aug  8 13:55 fd0H1840
brw-rw----   1 root     floppy     2, 100 Aug  8 13:55 fd0H1920
lrwxrwxrwx   1 root     root            7 Nov  1 15:39 fd0H360 -> fd0D360
lrwxrwxrwx   1 root     root            7 Nov  1 15:39 fd0H720 -> fd0D720
brw-rw----   1 root     floppy     2,  52 Aug  8 13:55 fd0H820
brw-rw----   1 root     floppy     2,  68 Aug  8 13:55 fd0H830
brw-rw----   1 root     floppy     2,   4 Aug  8 13:54 fd0d360
brw-rw----   1 root     floppy     2,   8 Aug  8 13:54 fd0h1200
brw-rw----   1 root     floppy     2,  40 Aug  8 13:54 fd0h1440
brw-rw----   1 root     floppy     2,  56 Aug  8 13:55 fd0h1476
brw-rw----   1 root     floppy     2,  72 Aug  8 13:55 fd0h1494
brw-rw----   1 root     floppy     2,  92 Aug  8 13:55 fd0h1600
brw-rw----   1 root     floppy     2,  20 Aug  8 13:54 fd0h360
brw-rw----   1 root     floppy     2,  48 Aug  8 13:55 fd0h410
brw-rw----   1 root     floppy     2,  64 Aug  8 13:55 fd0h420
brw-rw----   1 root     floppy     2,  24 Aug  8 13:54 fd0h720
brw-rw----   1 root     floppy     2,  80 Aug  8 13:55 fd0h880
brw-rw----   1 root     disk       3,   0 May  5  1998 hda
brw-rw----   1 root     disk       3,   1 May  5  1998 hda1
brw-rw----   1 root     disk       3,   2 May  5  1998 hda2
brw-rw----   1 root     disk       3,   3 May  5  1998 hda3
brw-rw----   1 root     disk       3,   4 May  5  1998 hda4
brw-rw----   1 root     disk       3,   5 May  5  1998 hda5
brw-rw----   1 root     disk       3,   6 May  5  1998 hda6
brw-rw----   1 root     disk       3,  64 May  5  1998 hdb
brw-rw----   1 root     disk       3,  65 May  5  1998 hdb1
brw-rw----   1 root     disk       3,  66 May  5  1998 hdb2
brw-rw----   1 root     disk       3,  67 May  5  1998 hdb3
brw-rw----   1 root     disk       3,  68 May  5  1998 hdb4
brw-rw----   1 root     disk       3,  69 May  5  1998 hdb5
brw-rw----   1 root     disk       3,  70 May  5  1998 hdb6
crw-r-----   1 root     kmem       1,   2 May  5  1998 kmem
crw-r-----   1 root     kmem       1,   1 May  5  1998 mem
lrwxrwxrwx   1 root     root           12 Nov  1 15:39 modem -> ../dev/ttyS1
lrwxrwxrwx   1 root     root           12 Nov  1 15:39 mouse -> ../dev/psaux
crw-rw-rw-   1 root     root       1,   3 May  5  1998 null
crwxrwxrwx   1 root     root      10,   1 Oct  5 20:22 psaux
brw-r-----   1 root     disk       1,   1 May  5  1998 ram
brw-rw----   1 root     disk       1,   0 May  5  1998 ram0
brw-rw----   1 root     disk       1,   1 May  5  1998 ram1
brw-rw----   1 root     disk       1,   2 May  5  1998 ram2
brw-rw----   1 root     disk       1,   3 May  5  1998 ram3
brw-rw----   1 root     disk       1,   4 May  5  1998 ram4
brw-rw----   1 root     disk       1,   5 May  5  1998 ram5
brw-rw----   1 root     disk       1,   6 May  5  1998 ram6
brw-rw----   1 root     disk       1,   7 May  5  1998 ram7
brw-rw----   1 root     disk       1,   8 May  5  1998 ram8
brw-rw----   1 root     disk       1,   9 May  5  1998 ram9
lrwxrwxrwx   1 root     root            4 Nov  1 15:39 ramdisk -> ram0
***  Je n'ai inclus de périphériques que pour les partitions IDE que
***  j'utilise. Si vous utilisez du SCSI, prenez les périphériques
***  /dev/sdXX à la place.
crw-------   1 root     root       4,   0 May  5  1998 tty0
crw--w----   1 root     tty        4,   1 Nov  1 15:39 tty1
crw-------   1 root     root       4,   2 Nov  1 15:29 tty2
crw-------   1 root     root       4,   3 Nov  1 15:29 tty3
crw-------   1 root     root       4,   4 Nov  1 15:29 tty4
crw-------   1 root     root       4,   5 Nov  1 15:29 tty5
crw-------   1 root     root       4,   6 Nov  1 15:29 tty6
crw-------   1 root     root       4,   7 May  5  1998 tty7
crw-------   1 root     tty        4,   8 May  5  1998 tty8
crw-------   1 root     tty        4,   9 May  8 12:57 tty9
crw-rw-rw-   1 root     root       4,  65 Nov  1 12:17 ttyS1
crw-rw-rw-   1 root     root       1,   5 May  5  1998 zero

/etc:
-rw-------   1 root     root          164 Nov  1 15:39 conf.modules
-rw-------   1 root     root          668 Nov  1 15:39 fstab
-rw-------   1 root     root           71 Nov  1 15:39 gettydefs
-rw-------   1 root     root          389 Nov  1 15:39 group
-rw-------   1 root     root          413 Nov  1 15:39 inittab
-rw-------   1 root     root           65 Nov  1 15:39 issue
-rw-r--r--   1 root     root          746 Nov  1 15:39 ld.so.cache
***  ld.so.cache est créé par ldconfig et garde en cache les
***  emplacements des bibliothèques. Beaucoup de choses ne
***  fonctionnent pas au démarrage si ld.so.cache n'est pas là.
***  Vous pouvez soit le régénérer après création du disque d'amorce,
***  soit inclure ldconfig sur le disque d'amorce et le lancer
***  dans un script rc.x pour mettre le cache à jour.
-rw-------   1 root     root           32 Nov  1 15:39 motd
-rw-------   1 root     root          949 Nov  1 15:39 nsswitch.conf
drwx--x--x   2 root     root         1024 Nov  1 15:39 pam.d
-rw-------   1 root     root          139 Nov  1 15:39 passwd
-rw-------   1 root     root          516 Nov  1 15:39 profile
-rwx--x--x   1 root     root          387 Nov  1 15:39 rc
-rw-------   1 root     root           55 Nov  1 15:39 shells
-rw-------   1 root     root          774 Nov  1 15:39 termcap
-rw-------   1 root     root           78 Nov  1 15:39 ttytype
lrwxrwxrwx   1 root     root           15 Nov  1 15:39 utmp -> ../var/run/utmp
lrwxrwxrwx   1 root     root           15 Nov  1 15:39 wtmp -> ../var/log/wtmp

/etc/pam.d:
-rw-------   1 root     root          356 Nov  1 15:39 other

/lib:
*** J'ai un système ELF avec glibc qui nécessite donc le chargeur ld-2.so.
-rwxr-xr-x   1 root     root        45415 Nov  1 15:39 ld-2.0.7.so
lrwxrwxrwx   1 root     root           11 Nov  1 15:39 ld-linux.so.2 -> ld-2.0.7.so
-rwxr-xr-x   1 root     root       731548 Nov  1 15:39 libc-2.0.7.so
lrwxrwxrwx   1 root     root           13 Nov  1 15:39 libc.so.6 -> libc-2.0.7.so
lrwxrwxrwx   1 root     root           17 Nov  1 15:39 libcom_err.so.2 -> libcom_err.so.2.0
-rwxr-xr-x   1 root     root         6209 Nov  1 15:39 libcom_err.so.2.0
-rwxr-xr-x   1 root     root       153881 Nov  1 15:39 libcrypt-2.0.7.so
lrwxrwxrwx   1 root     root           17 Nov  1 15:39 libcrypt.so.1 -> libcrypt-2.0.7.so
-rwxr-xr-x   1 root     root        12962 Nov  1 15:39 libdl-2.0.7.so
lrwxrwxrwx   1 root     root           14 Nov  1 15:39 libdl.so.2 -> libdl-2.0.7.so
lrwxrwxrwx   1 root     root           16 Nov  1 15:39 libext2fs.so.2 -> libext2fs.so.2.4
-rwxr-xr-x   1 root     root        81382 Nov  1 15:39 libext2fs.so.2.4
-rwxr-xr-x   1 root     root        25222 Nov  1 15:39 libnsl-2.0.7.so
lrwxrwxrwx   1 root     root           15 Nov  1 15:39 libnsl.so.1 -> libnsl-2.0.7.so
-rwx--x--x   1 root     root       178336 Nov  1 15:39 libnss_files-2.0.7.so
lrwxrwxrwx   1 root     root           21 Nov  1 15:39 libnss_files.so.1 -> libnss_files-2.0.7.so
lrwxrwxrwx   1 root     root           14 Nov  1 15:39 libpam.so.0 -> libpam.so.0.64
-rwxr-xr-x   1 root     root        26906 Nov  1 15:39 libpam.so.0.64
lrwxrwxrwx   1 root     root           19 Nov  1 15:39 libpam_misc.so.0 -> libpam_misc.so.0.64
-rwxr-xr-x   1 root     root         7086 Nov  1 15:39 libpam_misc.so.0.64
-r-xr-xr-x   1 root     root        35615 Nov  1 15:39 libproc.so.1.2.6
lrwxrwxrwx   1 root     root           15 Nov  1 15:39 libpwdb.so.0 -> libpwdb.so.0.54
-rw-r--r--   1 root     root       121899 Nov  1 15:39 libpwdb.so.0.54
lrwxrwxrwx   1 root     root           19 Nov  1 15:39 libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x   1 root     root        12041 Nov  1 15:39 libtermcap.so.2.0.8
-rwxr-xr-x   1 root     root        12874 Nov  1 15:39 libutil-2.0.7.so
lrwxrwxrwx   1 root     root           16 Nov  1 15:39 libutil.so.1 -> libutil-2.0.7.so
lrwxrwxrwx   1 root     root           14 Nov  1 15:39 libuuid.so.1 -> libuuid.so.1.1
-rwxr-xr-x   1 root     root         8039 Nov  1 15:39 libuuid.so.1.1
drwx--x--x   3 root     root         1024 Nov  1 15:39 modules
drwx--x--x   2 root     root         1024 Nov  1 15:39 security

/lib/modules:
drwx--x--x   4 root     root         1024 Nov  1 15:39 2.0.35

/lib/modules/2.0.35:
drwx--x--x   2 root     root         1024 Nov  1 15:39 block
drwx--x--x   2 root     root         1024 Nov  1 15:39 cdrom

/lib/modules/2.0.35/block:
-rw-------   1 root     root         7156 Nov  1 15:39 loop.o

/lib/modules/2.0.35/cdrom:
-rw-------   1 root     root        24108 Nov  1 15:39 cdu31a.o

/lib/security:
-rwx--x--x   1 root     root         8771 Nov  1 15:39 pam_permit.so

***  Répertoires bases pour les montages
/mnt:
drwx--x--x   2 root     root         1024 Nov  1 15:39 SparQ
drwx--x--x   2 root     root         1024 Nov  1 15:39 cdrom
drwx--x--x   2 root     root         1024 Nov  1 15:39 floppy

/proc:

/root:
-rw-------   1 root     root          176 Nov  1 15:39 .bashrc
-rw-------   1 root     root          182 Nov  1 15:39 .cshrc
-rw-------   1 root     root           47 Nov  1 15:39 .glintrc
-rwx--x--x   1 root     root          455 Nov  1 15:39 .profile
-rw-------   1 root     root         4014 Nov  1 15:39 .tcshrc

/sbin:
-rwx--x--x   1 root     root        23976 Nov  1 15:39 depmod
-rwx--x--x   2 root     root       274600 Nov  1 15:39 e2fsck
-rwx--x--x   1 root     root        41268 Nov  1 15:39 fdisk
-rwx--x--x   1 root     root         9396 Nov  1 15:39 fsck
-rwx--x--x   2 root     root       274600 Nov  1 15:39 fsck.ext2
-rwx--x--x   1 root     root        29556 Nov  1 15:39 getty
-rwx--x--x   1 root     root         6620 Nov  1 15:39 halt
-rwx--x--x   1 root     root        23116 Nov  1 15:39 init
-rwx--x--x   1 root     root        25612 Nov  1 15:39 insmod
-rwx--x--x   1 root     root        10368 Nov  1 15:39 kerneld
-rwx--x--x   1 root     root       110400 Nov  1 15:39 ldconfig
-rwx--x--x   1 root     root         6108 Nov  1 15:39 lsmod
-rwx--x--x   2 root     root        17400 Nov  1 15:39 mke2fs
-rwx--x--x   1 root     root         4072 Nov  1 15:39 mkfs
-rwx--x--x   2 root     root        17400 Nov  1 15:39 mkfs.ext2
-rwx--x--x   1 root     root         5664 Nov  1 15:39 mkswap
-rwx--x--x   1 root     root        22032 Nov  1 15:39 modprobe
lrwxrwxrwx   1 root     root            4 Nov  1 15:39 reboot -> halt
-rwx--x--x   1 root     root         7492 Nov  1 15:39 rmmod
-rwx--x--x   1 root     root        12932 Nov  1 15:39 shutdown
lrwxrwxrwx   1 root     root            6 Nov  1 15:39 swapoff -> swapon
-rwx--x--x   1 root     root         5124 Nov  1 15:39 swapon
lrwxrwxrwx   1 root     root            4 Nov  1 15:39 telinit -> init
-rwx--x--x   1 root     root         6944 Nov  1 15:39 update

/tmp:

/usr:
drwx--x--x   2 root     root         1024 Nov  1 15:39 bin
drwx--x--x   2 root     root         1024 Nov  1 15:39 lib
drwx--x--x   3 root     root         1024 Nov  1 15:39 man
drwx--x--x   2 root     root         1024 Nov  1 15:39 sbin
drwx--x--x   3 root     root         1024 Nov  1 15:39 share
lrwxrwxrwx   1 root     root           10 Nov  1 15:39 tmp -> ../var/tmp

/usr/bin:
-rwx--x--x   1 root     root        37164 Nov  1 15:39 afio
-rwx--x--x   1 root     root         5044 Nov  1 15:39 chroot
-rwx--x--x   1 root     root        10656 Nov  1 15:39 cut
-rwx--x--x   1 root     root        63652 Nov  1 15:39 diff
-rwx--x--x   1 root     root        12972 Nov  1 15:39 du
-rwx--x--x   1 root     root        56552 Nov  1 15:39 find
-r-x--x--x   1 root     root         6280 Nov  1 15:39 free
-rwx--x--x   1 root     root         7680 Nov  1 15:39 head
-rwx--x--x   1 root     root         8504 Nov  1 15:39 id
-r-sr-xr-x   1 root     bin          4200 Nov  1 15:39 passwd
-rwx--x--x   1 root     root        14856 Nov  1 15:39 tail
-rwx--x--x   1 root     root        19008 Nov  1 15:39 tr
-rwx--x--x   1 root     root         7160 Nov  1 15:39 wc
-rwx--x--x   1 root     root         4412 Nov  1 15:39 whoami

/usr/lib:
lrwxrwxrwx   1 root     root           17 Nov  1 15:39 libncurses.so.4 -> libncurses.so.4.2
-rw-r--r--   1 root     root       260474 Nov  1 15:39 libncurses.so.4.2

/usr/sbin:
-r-x--x--x   1 root     root        13684 Nov  1 15:39 fuser
-rwx--x--x   1 root     root         3876 Nov  1 15:39 mklost+found

/usr/share:
drwx--x--x   4 root     root         1024 Nov  1 15:39 terminfo

/usr/share/terminfo:
drwx--x--x   2 root     root         1024 Nov  1 15:39 l
drwx--x--x   2 root     root         1024 Nov  1 15:39 v

/usr/share/terminfo/l:
-rw-------   1 root     root         1552 Nov  1 15:39 linux
-rw-------   1 root     root         1516 Nov  1 15:39 linux-m
-rw-------   1 root     root         1583 Nov  1 15:39 linux-nic

/usr/share/terminfo/v:
-rw-------   2 root     root         1143 Nov  1 15:39 vt100
-rw-------   2 root     root         1143 Nov  1 15:39 vt100-am

/var:
drwx--x--x   2 root     root         1024 Nov  1 15:39 log
drwx--x--x   2 root     root         1024 Nov  1 15:39 run
drwx--x--x   2 root     root         1024 Nov  1 15:39 tmp

/var/log:
-rw-------   1 root     root            0 Nov  1 15:39 wtmp

/var/run:
-rw-------   1 root     root            0 Nov  1 15:39 utmp

/var/tmp:

14. Exemple de contenu des répertoires d'un disque utilitaire

total 579
-rwxr-xr-x   1 root     root        42333 Jul 28 19:05 cpio*
-rwxr-xr-x   1 root     root        32844 Aug 28 19:50 debugfs*
-rwxr-xr-x   1 root     root       103560 Jul 29 21:31 elvis*
-rwxr-xr-x   1 root     root        29536 Jul 28 19:04 fdisk*
-rw-r--r--   1 root     root       128254 Jul 28 19:03 ftape.o
-rwxr-xr-x   1 root     root        17564 Jul 25 03:21 ftmt*
-rwxr-xr-x   1 root     root        64161 Jul 29 20:47 grep*
-rwxr-xr-x   1 root     root        45309 Jul 29 20:48 gzip*
-rwxr-xr-x   1 root     root        23560 Jul 28 19:04 insmod*
-rwxr-xr-x   1 root     root          118 Jul 28 19:04 lsmod*
lrwxrwxrwx   1 root     root            5 Jul 28 19:04 mt -> mt-st*
-rwxr-xr-x   1 root     root         9573 Jul 28 19:03 mt-st*
lrwxrwxrwx   1 root     root            6 Jul 28 19:05 rmmod -> insmod*
-rwxr-xr-x   1 root     root       104085 Jul 28 19:05 tar*
lrwxrwxrwx   1 root     root            5 Jul 29 21:35 vi -> elvis*