4. Composants

Contenu de cette section

4.1 Systèmes de fichiers

Le noyau Linux supporte maintenant deux types de systèmes de fichiers pour les disques racines à copier automatiquement sur disque mémoire. Ce sont minix et ext2, ext2 étant le système de fichier préféré. Ce support ext2 a été rajouté quelque part entre les versions 1.1.17 et 1.1.57, je ne sais pas exactement quand. Si vous avez un noyau parmi ces versions, éditez /usr/src/linux/drivers/block/ramdisk.c et cherchez le mot ``ext2''. Si vous ne le trouvez pas, vous aurez à utiliser un système de fichiers minix, créé au moyen de la commande mkfs. Si vous utilisez ext2, vous pourrez trouver pratique d'utiliser l'option -i pour allouer plus d'i-noeuds que par défaut ; on recommande -i 2000 pour ne pas manquer d'i-noeuds. Sinon, vous pouvez économiser des i-noeuds en supprimant les nombreux fichiers inutiles de /dev. Mke2fs créera par défaut 360 i-noeuds sur une disquette 1.44 Mo. Pour ma part, 120 i-noeuds sont suffisants sur mon actuelle disquette de secours racine, mais si vous incluez tous les périphériques dans le répertoire /dev, vous dépasserez allègrement 360. Utiliser un système de fichiers compressé pour la racine permet un système plus grand, et donc plus d'i-noeuds par défaut, mais vous pourriez cependant devoir réduire le nombre de fichiers ou bien augmenter le nombre d'i-noeuds.

Pour créer un système de fichiers ext2 sur une disquette, sur ma machine, je lance la commande suivante :

        mke2fs -m 0 /dev/fd0

La commande mke2fs va automatiquement détecter l'espace disponible et se configurer en fonction. Eventuellement, la taille de la disquette en blocs de 1Ko peut être spécifiée pour accélérer l'opération de mke2fs. Le paramètre -m 0 évite à mke2fs de réserver de la place pour root, ce qui laisse plus de place disponible sur le disque.

Une manière simple de tester le résultat est de créer un système en utilisant la commande ci-dessus ou une commande approchant, et d'essayer ensuite de monter la disquette. S'il s'agit d'un système ext2, alors la commande :

        mount -t ext2 /dev/fd0 /<point d'entree>
devrait fonctionner.

4.2 Noyau

Construire un noyau personnalisé

Dans la plupart des cas, il serait possible de copier votre noyau actuel et d'amorcer la disquette avec ça. Cependant, il peut y avoir des cas où vous souhaitez construire un noyau différent.

Une raison peut être la taille. Le noyau est un des plus gros fichiers, sur un système de taille minimale, et si vous souhaitez créer une disquette amorce/racine, vous aurez à réduire la taille du noyau autant que possible. Le noyau supporte désormais le changement de disquette après amorçage et avant de monter la racine, et comme il n'est donc plus nécessaire d'entasser le noyau sur le même disque que tout le reste, ces commentaires ne s'appliquent que si vous décidez de construire une disquette amorce/racine.

Il y a deux manières de réduire la taille du noyau :

Une fois choisi le minimum d'options à inclure dans un noyau, vous devez choisir quoi remettre dedans. L'utilisation la plus commune d'une disquette amorce/racine est probablement d'examiner et restaurer un système de fichiers racine corrompu, et cela nécessite éventuellement du support dans le noyau.

Par exemple, si vos sauvegardes sont stockées sur bandes en utilisant Ftape pour accéder au lecteur et que vous perdez votre disque racine ainsi que les disques contenant Ftape, vous ne pourrez alors pas restaurer votre système à partir des bandes de sauvegarde. Vous devrez réinstaller Linux, récupérer et réinstaller Ftape, et seulement alors essayer de relire vos sauvegardes.

Il est souhaitable de maintenir une copie des mêmes versions des utilitaires servant à écrire les sauvegardes, afin de ne pas perdre de temps à essayer d'installer des versions ne pouvant pas lire vos bandes de sauvegarde.

Ce qu'il faut comprendre, c'est que tout support d'entrées/sorties que vous avez ajouté à votre noyau pour réaliser des sauvegardes doit aussi être ajouté à votre noyau d'amorce/racine.

La procédure pour reconstruire le noyau est decrite dans la documentation accompagnant le noyau. C'est assez simple à suivre, donc commencez par regarder dans /usr/src/linux. Si vous avez des problèmes pour construire un noyau, vous ne devriez probablement pas essayer de construire des disques amorce/racine de toute manière.

4.3 Périphériques

Tout système Linux nécessite un répertoire /dev contenant un fichier spécial pour tous les périphériques utilisées par le système. Le répertoire lui-même est un répertoire normal, et peut être créé avec la commande mkdir de la manière habituelle. Les fichiers spéciaux de périphériques doivent par contre être créés d'une certaine manière, avec la commande mknod.

Il y a un raccourci cela dit - copiez votre répertoire /dev existant, et supprimez ceux dont vous n'avez pas besoin. La seule chose à faire est de copier les fichiers spéciaux de périphériques en utilisant l'option -R.

Attention : la commande cp fournie avec la plus récente version des fileutils (3.13) semble ne pas respecter l'option -R.

Cela copie le répertoire sans essayer de copier le contenu des fichiers. Si vous utilisez un r minuscule, à savoir ``-r'', le comportement sera très différent, puisque vous essaierez de copier tout le contenu de tous vos disques - ou tout au moins ce qui tiendra sur une disquette ! Faites donc attention, et utilisez la commande :

        cp -dpR /dev /mnt
en supposant que la disquette est montée sur /mnt. Les options dp conservent les liens symboliques en tant que tels lors de la copie (au lieu de copier le fichier pointé) ainsi que les attributs des fichiers originaux, préservant donc les informations de propriété.

Vous pouvez aussi utiliser l'option -p de cpio, car cpio traitera les fichiers spéciaux de périphériques correctement et n'essaiera pas d'en copier le contenu. Par exemple :

        cd /dev
        find . -print | cpio -pmd /mnt/dev
copiera tous les fichiers spéciaux de /dev sur /mnt/dev. En fait, cela copiera tous les fichiers dans l'arborescence de répertoires commençant à /dev, et créera tous les sous-répertoires nécessaires dans l'arborescence cible.

Si vous cherchez la complexité, utilisez ls -l pour connaître les numéros de périphériques majeurs et mineurs de ceux que vous voulez, et créez les sur la disquette en utilisant mknod.

De nombreuses distributions incluent un script shell appelé MAKEDEV dans le répertoire /dev. Ce script shell pourrait être utilisé les périphériques, mais il est sans doute plus facile de copier ceux existant, surtout pour un disque de secours.

Quelle que soit la manière dont le répertoire de périphériques est copié, cela vaut la peine de vérifier que tous les fichiers spéciaux dont vous avez besoin sont présents sur la disquette de secours. Par exemple, Ftape utilise des périphériques de bande, et vous devrez donc copier tous ceux-là.

Notez qu'un i-noeud est requis pour chaque fichier spécial et que les i-noeuds peuvent parfois être rares, surtout pour des systèmes de fichiers sur disquette. Il est donc utile de supprimer tous les fichiers spéciaux dont vous n'avez pas besoin dans le répertoire /dev de la disquette. De nombreux périphériques sont clairement inutiles sur des systèmes spécifiques. Par exemple, si vous n'avez pas de disques SCSI, vous pouvez supprimer sans problèmes tous les fichiers de périphériques commençant par ``sd''. De même, si vous n'avez pas l'intention d'utiliser le port série, tous les fichiers commençant par ``cua'' peuvent disparaître.

4.4 Répertoires

Il est peut-être possible de faire fonctionner un système Linux uniquement avec /dev, /proc et /etc. Je ne sais pas - je n'ai jamais essayé. Toutefois, cela risque de s'avérer difficile, car sans bibliothèques partagées tous vos exécutables devraient être compilés statiquement. Il est raisonnable d'avoir au minimum les répertoires :

/dev

Nécessaire pour les entrées/sorties avec les périphériques

/proc

Nécessaire pour la commande ps

/etc

Fichiers de configuration du système

/bin

Exécutables des utilitaires considérés comme faisant partie du système

/lib

Bibliothèques partagées nécessaires au fonctionnement

/mnt

Un point de montage pour effectuer des opérations de maintenance sur d'autres disques

/usr

Utilitaires et applications supplémentaires

L'arborescence présentée ici n'est à utiliser que sur une disquette racine. Consultez le Standard de Système de Fichiers Linux (Linux File System Standart) pour de plus amples informations sur la structure des systèmes de fichiers sur des systèmes Linux ``standards''.

Quatre de ces répertoires peuvent être créés facilement :

Les 3 répertoires restants sont décrits dans les sections suivantes.

/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 3 groupes :

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

        ls -ltru
On obtient la liste des fichiers dans l'ordre inverse de leur date de dernier lecture, et si des fichiers ne sont jamais lus, ils peuvent être omis de la disquette racine.

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

Parmi tout ça, je n'ai réellement que deux fichiers à configurer, et leur contenu est étonnamment petit.

Inittab devrait convenir tel quel, sauf si vous voulez vous assurer que les utilisateurs par port série ne peuvent pas se connecter. Pour éviter cela, commentez toutes les lignes avec /etc/getty contenant un périphérique tty ou ttyS au bout de la ligne. Laissez les ports tty pour pouvoir vous connecter sur la console.

Inittab définit ce que le système lance ou relance à différents moments, comme le démarrage, le passage en mode multi-utilisateurs, les pertes d'alimentation, etc. Il faut faire s'assurer que les commandes présentes dans inittab correspondent à des programmes présents, ainsi qu'au bon répertoire. Si vous placez vos fichiers de commandes sur le disque de secours en utilisant l'exemple de contenu de répertoires fourni dans ce HOWTO comme guide, puis copiez votre inittab sur le disque de secours sans le vérifier, il y a de fortes chances que cela ne fonctionne pas, car la moitié des lignes de l'inittab feront référence à des programmes inexistants ou placés dans le mauvais répertoire.

Il faut aussi noter que certains programmes ne peuvent être déplacés d'un répertoire vers un autre sans mal fonctionner au démarrage car ils référencent directement dans leur code le nom d'un autre programme qu'ils essayent de lancer. Par exemple sur mon système, /etc/shutdown contient directement le chemin /etc/reboot. Si je déplace reboot vers /bin/reboot puis que je lance une commande shutdown, elle ne va pas marcher puisqu'elle ne pourra pas trouver le fichier reboot.

Pour le reste, copiez simplement tous les fichiers texte dans votre répertoire /etc, ainsi que tous les exécutables dans votre répertoire /etc dont vous n'êtes pas sûr de pouvoir vous débarrasser. Pour vous guider, consultez la sortie exemple de ls dans ``Contenu des répertoires du disque racine (ls -lR)'' - c'est ce que j'ai, et ça devrait donc vous suffire si vous copiez ces fichiers - mais notez que les systèmes peuvent être très différents, et on ne peut donc pas être certain qu'un ensemble de fichiers sur votre système est équivalent au même sur le mien. La seule méthode sure est de démarrer avec inittab et déterminer 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 de fonctionnement (run levels). Le minimum absolu est un fichier rc unique, mais il sera sans doute beaucoup plus simple en pratique de copier le fichier inittab et le répertoire /etc/rc.d de votre système, et nettoyer les scripts shell dans rc.d pour supprimer tous les traitements inutiles à un environnement système sur disquette.

/bin

C'est le bon endroit pour placer les autres utilitaires dont vous avez besoin pour les opérations de base, tels que ls, mv, cat, dd, etc.

Voir la section intitulée ``Exemple de ls -lR pour amorce/racine'' pour une liste des fichiers que je place dans le répertoire /bin de ma disquette amorce/racine. Vous pourrez remarquer qu'aucun des utilitaires nécessaires à la restauration d'une sauvegarde, tels que cpio, tar, gzip, etc, ne s'y trouvent. C'est parce que je les place sur une disquette utilitaire séparée, pour garder de la place sur la disquette amorce/racine. Après avoir démarré sur ma disquette amorce/racine, son contenu est copié dans le disque mémoire, laissant le lecteur de disquette libre pour monter une autre disquette, la disquette utilitaire. Je la monte en général sur /usr.

La création d'une disquette utilitaire est décrite ci-dessous dans la section intitulée ``Ajouter des disquettes utilitaires''.

/lib

Dans /lib vous placez certaines bibliothèques partagées ainsi que les chargeurs. Si les bibliothèques nécessaires ne sont pas trouvées dans votre répertoire /lib, le système ne pourra pas démarrer. Si vous avez de la chance, vous verrez un message d'erreur vous expliquant pourquoi.

Pratiquement tous les programmes nécessitent au moins la bibliothèque libc :

        libc.so.X
où X représente le numéro de version courante. Vérifiez dans votre répertoire /lib. Notez que libc.so.4 peut être un lien symbolique vers une bibliothèque libc avec un numéro de version dans le nom. Si vous lancez la commande :
        ls -l /lib
vous obtiendrez quelque chose du genre :
        libc.so.4 -> libc.so.4.5.21

Dans ce cas, la bibliothèque libc dont vous avez besoin est libc.so.4.5.21. Ce n'est qu'un exemple - la bibliothèque libc ELF est actuellement libc.so.5.xxxx.

Pour trouver d'autres bibliothèques, vous devrez tester les dépendances de tous les binaires que vous souhaitez utiliser. La commande ldd sert à ça. Par exemple, sur mon système la commande :

        ldd /bin/mount
renvoie comme résultat :
        /bin/mount:
                libc.so.5 => /lib/libc.so.5.2.18
indiquant que /bin/mount a besoin de la bibliothèque libc.so.5, qui est un lien symbolique sur libc.so.5.2.18.

Vous devez aussi placer dans /lib un ou plusieurs chargeurs pour charger les bibliothèques. Le fichier du chargeur est soit ld.so (pour les bibliothèques au format a.out), soit ld-linux.so (pour les bibliothèques ELF). Si vous n'êtes pas sûr duquel vous avez besoin, lancez la commande ``file'' sur la bibliothèque. Par exemple, sur mon système :

        file /lib/libc.so.5.2.18
me répond :
        /lib/libc.so.5.2.18: ELF 32-bit LSB shared object ...
et par conséquent elle a besoin d'un chargeur ELF. Si vous avez une bibliothèque a.out, vous obtiendrez un résultat du genre :
        /lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC) ...

Copiez le(s) chargeur(s) spécifique(s) dont vous avez besoin.

Il faut vérifier que les bibliothèques et chargeurs correspondent bien aux binaires utilisés. Si le noyau ne peut pas charger une bibliothèque indispensable, il plantera en général sans message d'erreur.

4.5 LILO

Aperçu

Pour que l'amorce/racine soit utilisable, elle doit être amorçable. Pour ce faire, le plus simple est d'installer un chargeur, qui est un morceau de code executable stocké sur le secteur 0 du cylindre 0 de la disquette. Voir la section ci-dessus intitulée ``Disquettes de boot'' pour une description du processus.

LILO est un chargeur longuement testé et éprouvé disponible sur tout site miroir Linux. Il vous permet de configurer le chargeur, en particulier :

Exemple de configuration de LILO

Cela permet de spécifier au noyau comment il doit démarrer. Mon fichier de configuration de LILO pour l'amorce/racine, utilisé avec LILO 0.15, est :


boot = /dev/fd0
install = ./mnt/boot.b
map = ./mnt/lilo.map
delay = 50
message = ./mnt/lilo.msg
timeout = 150
compact
image = ./mnt/zImage 
        ramdisk = 1440
        root = /dev/fd0

Notez que je ne l'ai pas testé récemment, car je n'utilise plus de disquettes amorce/racine utilisant LILO. Il n'y a aucune raison de supposer que cela ne fonctionne plus, mais si vous essayez et que cela ne marche pas, vous devez lire la documentation de LILO pour savoir pourquoi.

Notez aussi que les systèmes amorce/racine n'ont plus besoin de LILO, car depuis la version 1.3.48, le noyau supporte le chargement d'un système de fichiers compressé depuis la même disquette que le noyau. Voire la section Création de disquette de démarrage élaborée pour les détails.

Si vous avez un noyau postérieur à la version 1.3.48, la ligne ``ramdisk = 1440'' est inutile et doit être retirée.

Notez que boot.b, lilo.msg et le noyau doivent préalablement avoir été copiés sur la disquette en utilisant une commande du genre :


cp /boot/boot.b ./mnt

Si cela n'est pas fait, LILO ne fonctionnera pas correctement au démarrage si le disque dur n'est pas disponible, et un disque de secours qui nécessite la présence du disque dur pour démarrer est d'une utilité douteuse.

Je lance lilo avec la commande :

        /sbin/lilo -C <fichier de configuration>

Je le lance depuis le répertoire contenant le répertoire mnt où la disquette est montée. Cela signifie que je demande à LILO d'installer un chargeur sur le périphérique de démarrage (/dev/fd0 dans ce cas), pour démarrer un noyau situé dans le répertoire racine de la disquette.

J'ai aussi spécifié que je veux utiliser la disquette comme périphérique racine, et que je veux qu'un disque mémoire de 1440 blocs de 1 Ko soit créé, à savoir la taille de la disquette. Puisque j'ai créé un système de fichiers ext2 sur la disquette, toutes les conditions sont remplies pour que Linux utilise automatiquement le disque mémoire comme périphérique racine, et y copie le contenu de la disquette.

Les possibilités de Linux concernant les disques mémoires sont décrites de manière plus poussées dans la section ci-dessus intitulée ``Disques mémoires et systèmes amorce/racine''.

On peut aussi envisager d'utiliser le paramètre ``single'' pour démarrer Linux en mode mono-utilisateur. Cela permet d'empêcher les utilisateurs de se connecter par les ports série.

J'utilise aussi les instructions ``DELAY'', ``MESSAGE'' et ``TIMEOUT'' pour que lorsque je démarre le disque, LILO me laisse la possibilité d'entrer des options en ligne de commande si je le souhaite. Je n'en ai pas besoin actuellement, mais on ne sait jamais si l'on ne souhaitera pas changer de périphérique racine ou monter un système de fichiers en lecture seule.

Le fichier de messages que j'utilise contient le message :

Disquette amorce/racine Linux
=============================

Entrez une ligne de commandes de la forme_:

        zImage [ options en ligne ]

Si rien n'est entre, Linux sera charge avec les parametres
par defaut dans 15 secondes.

Il ne s'agit que d'un aide-mémoire pour me rappeler mes options.

Les lecteurs sont invités à lire la documentation de LILO de manière attentive avant d'essayer d'installer quoi que ce soit. Il est assez facile de détruire des partitions si vous utilisez le mauvais paramètre ``boot = ''. Si vous manquez d'expérience, NE LANCEZ PAS LILO avant d'être sûr que vous le comprenez et d'avoir vérifié de nombreuses fois vos paramètres.

Notez que vous devez relancer LILO à chaque fois que vous changez le noyau, pour que LILO puisse mettre à jour sa cartographie en fonction du nouveau noyau. Il est en fait possible de remplacer le noyau par un autre quasiment identique sans relancer LILO, mais mieux vaut ne pas parier la dessus - si vous changez de noyau, relancez LILO.

Retirer LILO

Je peux aussi ajouter ceci tant que j'en suis à parler de LILO : si vous installez par erreur LILO sur un disque contenant DOS, vous pouvez toujours remplacer le secteur d'amorce par le chargeur du DOS en tapant la commande DOS :

        FDISK /MBR

où MBR signifie ``Master Boot Record''. Notez que quelques puristes ne sont pas d'accord, éventuellement avec raison, mais cela marche.

Options utiles de LILO

LILO a plusieurs options utiles qu'il est bon de se rappeler lorsque l'on crée des disques de démarrage :


Chapitre suivant, Chapitre Précédent

Table des matières de ce chapitre, Table des matières générale

Début du document, Début de ce chapitre