Les sections précédentes de ce document couvrent les bases de la création de disquettes amorce et racine, et s'appliquent à quasiment tous les noyaux jusqu'aux versions actuelles (2.0, le dernier noyau stable).
Les noyaux 1.3.48 et ultérieurs contiennent une réécriture substantielle du code du disque mémoire, rajoutant d'importantes fonctionnalités nouvelles. Ces noyaux peuvent automatiquement détecter de systèmes de fichiers compressés, les décompresser et les charger dans le disque mémoire au démarrage. Les systèmes de fichiers racine peuvent être placés sur un second disque, et à partir du noyau 1.3.98 environ, les disques mémoires peuvent être agrandis dynamiquement.
Ensemble, ces nouvelles fonctionnalités permettent aux disques d'amorce de contenir substantiellement plus de données qu'ils ne pouvaient le faire jusqu'alors. Avec de la compression, un disque de 1722 Ko contient désormais jusqu'à 3.5 Mo de fichiers. Comme tous ceux qui ont créés des disques d'amorce le savent, on passe beaucoup de temps à élaguer l'ensemble des fichiers et à trouver des versions réduites des fichiers pour que le tout tienne sur un petit système de fichiers. Les nouvelles possibilités font que cela n'a plus une importance cruciale.
Malheureusement, ces nouvelles fonctionnalités compliquent quelque peu la création de disquettes d'amorce les exploitant. Pour construire un système de fichiers compressé sur une disquette, celui-ci doit tout d'abord être créé sur un autre périphérique, puis compressé et transféré sur la disquette. Cela implique donc des étapes supplémentaires.
Schématiquement, il faut créer un système de fichiers compressé pour la racine, copier le noyau sur la disquette, dire à celui-ci où trouver le système de fichiers racine, puis copier celui-ci sur la disquette.
Voici un schéma simple en ASCII montrant la structure de la disquette :
|<--- zImage --->|<-- Systeme de fichiers racine compresse -->|
|________________|____________________________________________|
Disquette
Voici les étapes pour la création de la disquette amorce :
Le système de fichiers racine est créé en gros de la même manière qu'indiqué dans la section 4.1 de ce document. La différence principale vient du fait que vous ne pouvez plus créer le système de fichiers directement sur la disquette, mais que vous devez le créer sur un périphérique différent de plus grande taille que l'espace de la disquette qu'il va occuper.
Pour construire un tel système de fichiers pour la racine, vous avez besoin d'un périphérique en plus de taille suffisante. Vous avez plusieurs choix :
mount
et umount
spécialement
modifiés. Vous pouvez les trouver sur :
ftp://ftp.win.tue.nl:/pub/linux/util/mount-2.5X.tar.gz
où X représente la lettre de la dernière modification.
Si vous n'avez pas de fichiers spéciaux correspondants aux
périphériques loopback (/dev/loop0
, /dev/loop1
,
etc) sur votre système, vous devrez d'abord les créer. Les commandes :
mknod /dev/loop0 b 7 0
mknod /dev/loop1 b 7 1
mknod /dev/loop2 b 7 2
...
vous permettront cela. Vous n'avez sans doute besoin que de loop0
.
Une fois ces binaires spéciaux de mount
et umount
installés, créez un
fichier temporaire sur un disque dur de taille suffisante (par
exemple, /tmp/fsfile
). Vous pouvez utiliser une commande du
type :
dd if=/dev/zero of=/tmp/fsfile bs=1k count=nnn
pour créer un fichier de nnn blocs.
Utilisez le nom du fichier à la place de PERIPHERIQUE
ci-dessous. Quand vous lancez une commande mount
, vous devez y ajouter
l'option ``-o loop
'' pour lui signaler qu'il doit utiliser un
périphérique loopback. Par exemple :
mount -o loop -t ext2 /tmp/fsfile /mnt
montera /tmp/fsfile
(par périphérique loopback) sur le point de
montage /mnt
. Un ``df
'' vous le confirmera.
/dev/ram0
ou /dev/ramdisk
). Dans ce
cas, la mémoire est utilisée pour simuler un disque. Le disque mémoire
doit être assez grand pour contenir un système de fichiers de la taille
nécessaire. Cherchez dans votre fichier de configuration pour LILO
(/etc/lilo.conf
) une ligne de la forme :
RAMDISK_SIZE = nnn
qui détermine la quantité de mémoire vive à allouer. La valeur par
défaut est 4096 Ko.Après avoir choisi une de ces possibilités, préparez le périphérique avec :
dd if=/dev/zero of=PERIPHERIQUE bs=1k count=3000
Cette commande remplit de zéros le périphérique. Cette étape est importante, car le système de fichiers sur le périphérique étant compressé ultérieurement, toutes les parties inutilisées doivent être mises à zéro pour obtenir la meilleure compression possible.
Ensuite, créez le système de fichiers avec :
mke2fs -m 0 PERIPHERIQUE
(Si vous utilisez un périphérique loopback, le fichier que vous
utilisez doit être fourni à la place de PERIPHERIQUE. Mke2fs
vous
demandera alors si vous voulez vraiment faire cela ; répondez oui.)
Puis montez le périphérique :
mount -t ext2 PERIPHERIQUE /mnt
Comme précédemment, copiez les fichiers dans /mnt
, comme expliqué à la
section 4.1.
Une fois copiés les fichiers sur le système de fichiers racine, vous devez copiez celui-ci, puis le compresser. Tout d'abord, démontez le :
umount /mnt
(Techniquement, vous pouvez copiez le système de fichiers sans le démonter auparavant, mais cela peut être dangereux, et c'est de toute manière une mauvaise habitude.)
Puis, copiez les données depuis le périphérique dans un
fichier. Appelez le fichier rootfs
:
dd if=PERIPHERIQUE of=rootfs bs=1k
Puis, compressez le. Utilisez l'option ``-9
'' de gzip
pour
obtenir une compression maximale :
gzip -9 rootfs
Cela peut prendre plusieurs minutes. Une fois fini, vous aurez un
fichier rootfs.gz
qui contient votre système de fichiers racine
compressé.
Si vous manquez d'espace disque, vous pouvez combiner dd
et
gzip
:
dd if=PERIPHERIQUE bs=1k | gzip -9 > rootfs.gz
A présent, vérifiez la taille de l'ensemble afin de vérifier que le
noyau ainsi que le système de fichiers racine tiendront sur la
disquette. Un ``ls -l
'' vous montrera combien d'octets occupent
chacun ; divisez par 1024 pour obtenir le nombre de blocs dont
chacun aura besoin. Pour les fractions de bloc, arrondissez au nombre
supérieur.
Par exemple, si le noyau occupe 453281 octets, il nécessitera
ceil(453281 / 1024) = 443
blocs et occupera donc les blocs 0 à 442 sur la disquette. Le système
de fichiers racine commencera au bloc 443. Notez ce numéro de bloc
pour les commandes à suivre ; appelez le DEBUTRACINE.
Vous devez indiquer au noyau où il peut trouver le système de fichiers
racine sur la disquette. A l'intérieur de l'image du noyau se trouve
un mot pour le disque mémoire qui indique où se trouve la racine,
ainsi que d'autres options. Le mot est défini dans
/usr/src/linux/arch/i386/kernel/setup.c
et est interprété
comme suit :
bits 0-10 : Decalage pour le debut du disque memoire, en
blocs de 1024 octets (c'est DEBUTRACINE,
calcule ci-dessus)
bits 11-13 : inutilise
bit 14 : drapeau indiquant que le disque memoire doit
etre charge
bit 15 : drapeau indiquant qu'il faut demander
l'insertion de la disquette
(Si le bit 15 est positionné à 1, on vous demandera au démarrage de placer une nouvelle disquette dans le lecteur. C'est nécessaire pour un kit de démarrage en deux disquettes, décrit ci-dessous dans la section ``Fabriquer un kit sur deux disques''. Pour l'instant, considérons le à 0).
Si le système de fichiers racine doit commencer au bloc 443, le mot du disque mémoire est :
1BB (hexa) 443 (decimal) (bits 0-10)
+ 4000 (hexa) Drapeau de chargement du disque memoire (bit 14)
-----------
= 41BB (hexa)
=16827 (decimal)
Ce mot doit être positionné dans l'image du noyau en utilisant la
commande ``rdev -r
'' dans la section suivante.
Vous êtes maintenant prêt à créer la disquette d'amorce. Tout d'abord, copiez le noyau :
dd if=zImage of=/dev/fd0
Ensuite, indiquez à celui-ci où trouver son système de fichiers racine sur la disquette :
rdev /dev/fd0 /dev/fd0
Vous devez maintenant positionner le mot du disque mémoire dans
l'image du noyau située sur la disquette. On donne sa valeur au mot en
utilisant la commande ``rdev -r
''. En prenant la valeur calculée
ci-dessus dans la section intitulée ``Calcul de la taille'', cela donne :
rdev -r /dev/fd0 16827
Enfin, placez le système de fichiers racine sur la disquette derrière
le noyau. La commande dd
possède une option seek
vous
permettant d'indiquer combien de blocs sauter avant d'écrire :
dd if=rootfs.gz of=/dev/fd0 bs=1k seek=443
(Le nombre 443 correspond à DEBUTRACINE provenant de la section ``Calcul de la taille'' précédente.)
Attendez que l'écriture soit finie sur la disquette, et vous êtes prêt.
Si vous avez besoin de plus de place, vous pouvez fabriquer un kit d'amorce sur deux disques. Dans ce cas, la première disquette contiendra uniquement le noyau, et la seconde le système de fichiers racine compressé. Dans cette configuration, votre système racine compressé peut faire jusqu'à 1440 Ko.
La création d'un ensemble de deux disquettes d'amorce est réalisée de manière sensiblement identique aux étapes précédemment décrites. Tout d'abord, vous devez positionner le drapeau de demande de disquette mémoire à 1 pour indiquer au noyau qu'il faut demander la seconde disquette et attendre son insertion. Le système racine commence à l'octet 0 de la second disquette.
Comme indiqué dans la précédente section ``Calcul de la taille'', le drapeau indiquant qu'il faut demander l'insertion de la disquette (bit 15) doit être positionné à 1, et le décalage du disque mémoire sera zéro. Dans notre exemple, le calcul donnera cette fois :
4000 (hexa) drapeau de chargement du disque memoire (bit 14)
+ 8000 (hexa) drapeau demandant une invite pour le
chargement de la disquette racine (bit 15)
------------
= C000 (hexa)
=49152 (decimal)
qui sera utilisé dans le calcul pour ``rdev -r
'' comme précédemment.
Suivez les instructions de ``Copie des fichiers sur la disquette''
indiquées ci-dessus, mais après avoir lance la commande ``rdev -r
'',
insérez une nouvelle disquette dans le lecteur et lancez la commande :
dd if=rootfs.gz of=/dev/fd0
L'option seek
n'est pas nécessaire puisque le système de fichiers
racine démarre au bloc zéro.
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