8. Construction de la disquette

8.1. Principe

Le principe de notre disquette est le suivant. L'ordinateur boote sur la disquette grâce au chargeur installé par syslinux. Le boot consiste à récupérer, décompresser et lancer le noyau, puis à récupérer, décompresser et mettre en place un ram-disque. Ensuite, la racine est positionnée sur le ram-disque, et on exécute un fichier appelé linuxrc présent sur le ram-disque. Nous allons donc mettre ce qu'il faut sur la disquette, dont le noyau et le ram-disque, et ensuite construire notre ram-disque contenant entre autres ce linuxrc.

Passons aux choses sérieuses: la disquette. Il y a plusieurs méthodes pour créer la disquette, dont la plus évidente: formatter la disquette et installer ce qu'il faut dessus ensuite. Allons-y!

8.2. Création de la disquette bootable

Formattons une disquette. Je préfère utiliser le format vfat car une partie de la suite est mieux documentée pour ce format. Ainsi, en cas de difficulté, ce sera moins dur pour vous de chercher de la documentation supplémentaire. Mais voici comment formatter la disquette:

/sbin/mkfs -t vfat /dev/fd0

Pour rendre la disquette bootable, nous avons besoin de syslinux. Vous pouvez utiliser le syslinux installé (ou que vous pouvez installer) sur votre machine. Mais il est aussi simple de récuperer la derniere version et de faire make clean puis make. De plus, le syslinux de Mandrake est patché et si les développeurs de syslinux ne déconseillent pas cette version patchée, ils indiquent quand même qu'elle n'est pas supportée. Bref, utilisez la dernière version, tel est mon conseil!

syslinux /dev/fd0

A partir de maintenant, vu que les accès disques sont lents avec une disquette, nous allons travailler avec une image. Récupérons celle de la disquette:

dd if=/dev/fd0 of=ghlmf.floppy bs=512k

Cela vous crée un fichier ghlmf.floppy que vous allez monter (avec les droits root cette fois), par exemple dans /mnt/ghlmf avec

mount -o loop ghlmf.floppy /mnt/ghlmf

Vous devriez trouver un fichier ldlinux.sys déjà présent dans /mnt/ghlmf.

8.3. Mise en place du strict minimum sur la disquette

Ceci est la partie la plus rébarbative de la création de la disquette. Heureusement, on ne la fait qu'une seule fois. Il faut créer l'arborescence minimale de la disquette et y copier les fichiers aux bons endroits. Pour ceux qui ont déjà joué avec un Linux From Scratch, c'est quand même moins rébarbatif, tellement moins que cela ne vaut pas le coup de créer un script qui nous fait tout cela. Le premier fichier est bien entendu le noyau que vous avez compilé plus haut:

cp /usr/src/linux/arch/i386/boot/bzImage /mnt/ghlmf/vmlinuz

Le second fichier est le fichier de configuration de boot. Il s'appelle syslinux.cfg. Voici le contenu du mien:

default ghlmf
display ghlmf.msg
label ghlmf
 kernel vmlinuz
 append initrd=initrd.gz root=/dev/fd0 ether=0,0,0,eth0

Si vous avez deux cartes réseau, ce qui n'est pas rare puisque ce genre de disquettes servent souvent de routeur, voyez ce qui suit:

default ghlmf
display ghlmf.msg
label ghlmf
 kernel vmlinuz
 append initrd=initrd.gz root=/dev/fd0 ether=0,0,0,eth0 ether=0,0,0,eth1

Vous pouvez ajouter d'autres cartes réseau de la même manière, et toutes les autres options que vous voudrez. Pour de plus amples informations sur le format de ce fichier, lisez le fichier syslinux.doc qui se trouve dans l'archive de syslinux. Quelques explications tout de même: l'unique configuration de boot est baptisée ghlmf (label ghlmf). Et c'est celle par défaut grâce au mot-clef default ghlmf de la première ligne. La seconde ligne indique un fichier dont il faut afficher le contenu. Nous nous en occuperons quelques lignes plus bas. Dans la configuration ghlmf, le noyau s'appelle vmlinuz. Et nous indiquons, outre la/les carte(s) réseau, que nous avons, un ram-disque s'appelant initrd.gz dont nous allons nous occuper plus bas, et la racine pour booter, qui est /dev/fd0.

J'ai parlé de ghlmf.msg. Mettez le texte que vous voulez dans ce fichier, que vous placez dans /mnt/ghlmf. Par exemple:

echo Bienvenue sur la disquette ghlmf >/mnt/ghlmf/ghlmf.msg

Enfin, le ram-disque va faire l'office de la sous-section suivante.

8.4. Le ram-disque

Le ram-disque est un système de fichier que l'on va placer en mémoire vive, d'où son nom. Et ce sera le système de fichier utilisé par le système d'exploitation. Pour créer ce ram-disque, je m'inspire du fichier initrd.txt de la documentation du noyau. Voici la procédure:

dd if=/dev/zero of=initrd bs=1k count=4096
/sbin/mke2fs -vFm0 initrd 4096

La première ligne crée le fichier image, d'une taille de 4 Méga-octets. Vous n'avez pas le choix ici de la taille du ram-disque: vous devez prendre la taille que vous avez spécifiée lors de la configuration du noyau. La seconde crée un système de fichier à l'intérieur du fichier image. L'option -v demande à mke2fs d'avoir la langue pendue. Et l'option -m0 demande qu'aucun espace ne soit réservé au super-utilisateur. mke2fs aurait du se plaindre que initrd n'est pas un périphérique comme il le désirerait. Normal puisque c'est un fichier! L'option -F confirme automatiquement (force) le formattage puisque nous faisons cela en toute connaissance de cause. Il nous reste à remplir ce système de fichier, et il faut donc le monter, comme précédement, mais par exemple dans un répertoire /mnt/initrd. En tant que root:

mount -o loop initrd /mnt/initrd

Vous trouverez dans /mnt/initrd un seul répertoire existant: lost+found. Pour ajouter la base:

cd /ghlmf
mkdir /mnt/initrd/ghlmf
tar cvf - lib/ld-uClibc* lib/libc.so* lib/libuClibc* | tar x -C /mnt/initrd/ghlmf
tar cvf - bin/busybox | tar x -C /mnt/initrd
cd /mnt/initrd
mkdir dev
mkdir etc
mkdir lib
mkdir mnt
mkdir /mnt/fd0
mkdir proc
mkdir sbin
mkdir usr
mkdir usr/bin usr/lib usr/sbin
mkdir var
mkdir var/log var/db var/run var/state

Nos répertoires sont créés et les bibliothèques et binaires en place.

Attaquons-nous aux périphériques. Voyez la page de manuel de mknod pour de plus amples précisions. Si vous voulez recopier ce que vous avez dans /dev sur votre machine, le principe est simple: faites un ls -l /dev et utilisez mknod:

mknod [ -m permissions ] nom mode majeur mineur
  • permissions: les permissions, comme pour chmod

  • nom: le nom, par exemple fd0.

  • mode: la première lettre de la ligne du ls -l, un b ou un c.

  • le numéro majeur (le premier nombre): 2 pour fd0

  • le numéro mineur (le second nombre, avant la date): 0 pour fd0.

Allons-y pour le minimum qui nous intéresse:

cd /mnt/initrd/dev
mknod -m 600 console c 5 1
mknod -m 664 fd0 b 2 0
mknod -m 644 null c 1 3
mknod -m 640 ram b 1 1
mknod -m 666 tty c 5 0
mknod -m 600 tty0 c 4 0
mknod -m 666 zero c 1 5

Et maintenant, que nous manque-t-il encore? Init! Eh non, pas init. Linux veut lancer un exécutable appelé linuxrc si vous ne spécifiez pas dans syslinux.cfg ce que vous voulez lancer. A vous de mettre ce que vous voulez comme exécutable en tant que linuxrc. Mais pour vous montrer ce que nous pouvons faire, cet exécutable sera un script shell dans cet article. En voici un exemple de contenu, largement inspiré de celui de la distribution floppyfw:

#!/bin/sh

# la base
PATH="/bin:/sbin:/usr/bin:/usr/sbin"
TERM=linux
ignoreeof=10
no_exit_on_failed_exec=yes
export PATH TERM ignoreeof
umask 022

# montage de /proc
/bin/busybox mount -t proc /proc /proc

# creation des liens symboliques vers busybox
/bin/busybox --install -s

mount -t vfat /dev/fd0 /mnt/fd0

[ -f /mnt/fd0/ghlmf.ini ] && cat /mnt/fd0/ghlmf.ini >/ghlmf.ini
[ -f /ghlmf.ini] && chmod 777 /ghlmf.ini
[ -f /ghlmf.ini] && exec /ghlmf.ini

# si l'execution de ghlmf.ini a echoue, on lance un shell
exec sh

N'oubliez pas que ce script doit être exécutable ( chmod 777 linuxrc). Je pense que ce script est assez simple à comprendre. Il prépare le système de fichier pour la bonne exécution de la suite. Notez l'intérêt d'avoir activé la possibilité d'utiliser l'installation automatique des liens via busybox --install -s! Enfin, ce script passe la main au ghlmf.ini qui devra se trouver sur la disquette et dont je parlerai dans la section suivante. Ainsi, plus besoin de toucher à linuxrc: tout se fera dans ghlmf.ini!

Si vous avez bien suivi jusqu'ici, vous devriez avoir noté quelque chose qui cloche. En effet, le script linuxrc utilise /bin/sh (ligne 1). Or /bin/sh n'est pas installé! Installons le tout de suite:

cd /mnt/initrd/bin
ln -s busybox sh

C'est aussi simple que cela.

Enfin, il n'y a plus qu'à mettre l'image du ram-disque sur la disquette et à écrire la disquette si vous n'utilisez pas bochs. Démontez /mnt/initrd. C'est important, sinon au boot, linux se plaindra toujours que initrd a mal été démonté la fois précédente! Puis compressez le fichier initrd. Et copiez le résultat sur la disquette:

umount /mnt/initrd
gzip -9 initrd
cp initrd.gz /mnt/ghlmf

Vous pouvez rencontrer un problème avec la compression de initrd, ou plutôt de sa copie dans l'image de la disquette. En effet, initrd.gz peut être trop grand. Si cela vous arrive, c'est probablement que vous avez copié des choses dans le ram-disque et que vous les avez supprimées ensuite. La suppression signifie en réalite que les fichiers disparaissent du disque, mais le contenu reste en place. La conséquence est que l'espace libre n'est plus initialisée à quelque chose qui se compresse facilement: le taux de compression devient vite mauvais. Une solution est dans ce cas de créer un nouveau ram-disque comme précédemment, puis de copier le contenu du premier dans le second. Il n'y aura aucune différence au niveau des fichiers. La différence sera invisible mais existera bel et bien, là où justement, il n'y a pas de fichiers!

Ensuite, plusieurs solutions s'offrent a vous après avoir démonté /mnt/ghlmf. Soit vous copiez l'image disque sur la disquette (dd if=ghlmf.floppy of=/dev/fd0 bs=512k), soit vous utilisez un émulateur pour booter, par exemple bochs.

création est mise à disposition sous un contrat Creative Commons