Floppy Linux From Scratch

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

L'article original se trouve sur http://ymettier.free.fr/articles_lmag/.

Article publié dans le numéro 43 (octobre 2002) de GNU/Linux France Magazine


Table des matières

1. Introduction
2. Pré-requis
3. La base
4. La libc
5. Environnement de compilation
6. Busybox
7. Le noyau
8. Construction de la disquette
8.1. Principe
8.2. Création de la disquette bootable
8.3. Mise en place du strict minimum sur la disquette
8.4. Le ram-disque
9. Les premiers tests
10. Bochs
11. Complétons la disquette
11.1. /etc/fstab
11.2. /etc/passwd
11.3. /etc/group
11.4. Autres
12. Configuration, extensions
12.1. Configuration
13. Paquetages
13.1. Qu'est-ce qu'un paquetage?
13.2. Création d'un paquetage
13.3. La gestion des paquetages
14. Applications
14.1. Un routeur/mur pare-feu
14.2. Un autoradio
14.3. Lire son courrier électronique partout
15. Conclusion
16. Références

Résumé

Floppy Linux From Scratch n'est pas une distribution. Ce n'est pas non plus une copie de la méthode d'installation Linux From Scratch qui permet d'installer Linux à partir de rien. Floppy Linux From Scratch n'est rien d'autre que cet article qui va vous permettre de créer vous-même votre propre disquette Linux et de la bricoler ensuite selon vos envies du moment.

1. Introduction

A quoi sert une disquette GNU/Linux? Elle peut servir à beaucoup de tâches. Les trois plus évidentes sont la disquette d'installation de GNU/Linux, qui est maintenant plutôt abandonnée au profit du CD bootable, la disquette de secours qui vous permet de récupérer votre Linux quand il ne veut plus booter, et le routeur/mur pare feu. Mais vous pouvez aussi utiliser une disquette pour de nombreuses utilisations. Pourquoi ne pas booter une disquette qui dispose d'un lecteur ogg (ou mp3) pour faire chaîne stéréo ou même autoradio dans la voiture? Pourquoi ne pas booter une disquette pour lire son courrier électronique sans toucher à l'installation du PC de votre hôte? Nombreuses autres utilisations sont surement possibles, à condition d'y penser et de savoir faire. Savoir faire, c'est le but de cet article.

2. Pré-requis

Les pré-requis sont un ordinateur avec GNU/Linux dessus (peu importe la distribution), disposant d'un lecteur de disquette, et une disquette forcément. De plus, pour vous faciliter la tâche, un accès root à la machine est préférable pour installer l'un ou l'autre logiciel, et surtout pour monter l'image de la disquette en loopback.

Vous n'avez pas besoin de savoir cross-compiler, et nous n'installerons pas d'environnement de cross-compilation. Donc cet article ne vous permettra en gros que de créer une disquette ix86 pour booter sur un ix86. Nous ne ferons pas non plus d'installation dangereuse comme l'installation de deux glibc et d'un environnement permettant de choisir la bonne glibc. Nous allons en fait travailler sans toucher à quoi que ce soit de ce qui fait fonctionner correctement votre GNU/Linux. Et tout ce que nous allons faire pourra être défait sans conséquense aucune, à l'aide de quelques rm -rf bien placés.

Dernier pré-requis: il faut un nom à votre Linux. Ce nom nous servira par la suite. Le nom que je choisis dans cet article est ghlmf. Devinez pourquoi!

3. La base

Les quatre paquets dont nous allons avoir besoin pour démarrer sont:

  • Le noyau Linux. Allez le chercher sur http://www.kernel.org. Prenez celui qui vous convient, le 2.4.x si vous voulez! Le 2.4.18 me sert pour l'article.

  • La libc. Glibc2.1 est énorme. Glibc2.2 ne tient pas sur la disquette. Tournons-nous vers une autre libc moins connue: µClibc: http://www.uclibc.org. Je prends la version 0.9.12 pour cet article.

  • Les programmes de base (ls, cp, sh...). Grâce à busybox, nous n'avons besoin de recompiler qu'un seul programme qui contient tout ce dont nous avons besoin dans un binaire: http://www.busybox.net. Ici, mon choix est la 0.60.3.

  • Le système de démarrage: syslinux. http://syslinux.zytor.com/ Mon choix se porte sur la version 1.75.

4. La libc

La première étape est de recompiler la libc. Avant de vraiment commencer, veuillez décompresser votre noyau: la libc aura besoin de certains fichiers du noyau. Le mieux est de décompresser le noyau comme d'habitude, dans /usr/src/linux. Décompressez la libc dans le répertoire de votre choix. Copiez le fichier extras/Configs/Config.* dans le répertoire courant. Contrairement à ce qui est indiqué dans le fichier INSTALL copier au lieu de déplacer permet de garder le fichier Config.* original intact. Renommez la copie Config et éditez-la.

La seule modification que j'apporte est une des dernières lignes:

DEVEL_PREFIX = /ghlmf

Profitez-en pour créer ce répertoire, en tant que root.

Etape suivante: la compilation. make devrait suffire. Puis repassez en root et faites make install.

5. Environnement de compilation

A partir de maintenant, tout programme qui doit aller sur la disquette doit être recompilé, avec µClibc. Sinon, il doit être compilé statiquement, ce qui signifie un binaire énorme. Donc utilisons µClibc qui a été compilée pour cela! Le principe est d'utiliser le lien de gcc qui se trouve dans /ghlmf/usr/bin. Nous allons appliquer cela à busybox, et nous reverrons cela ensuite avec de petits logiciels ensuite.

6. Busybox

Busybox, c'est quoi? Busybox, c'est le couteau suisse du Linux Embarqué, tel que le site web de Busybox le prétend. Et en plus, c'est vrai! En quoi est-ce un couteau suisse? Tout simplement parce que c'est un seul binaire qui fait tout, le shell, les outils de base de gestion de fichiers comme ls, cp, mv, rm, find..., et d'autres outils encore. Le tout tient dans quelques octets! Bon, 191812 chez moi, mais franchement, c'est loin d'être énorme, surtout que cela sera compressé sur la disquette.

Décompressez Busybox là ou vous le voulez, puis éditez le fichier Config.h. Ce fichier contient une liste énorme de #define qui indique tout ce que le binaire busybox sera capable de faire. Plus vous en mettez, plus le binaire sera gros, mais on ne parle bien souvent qu'en octets lorsqu'on vous dit que telle fonctionnalité augmente la taille de busybox. Pour simplifier la lecture de l'article, j'ai préféré faire un minimum de changements que je vais vous citer. A vous d'adapter le fichier à vos besoins. En fait, j'ai seulement ajouté #define BB_IFCONFIG, #define BB_ROUTE et #define BB_FEATURE_INSTALLER: cette fonctionnalité permet de créer en live et automatiquement des liens pointant vers busybox et portant les noms des binaires à émuler. Je vous conseille d'étudier vos besoins plutôt que de me suivre ici, surtout que pour la disquette que je me suis faite hors du cadre de cet article, j'ai apporté d'autres modifications moi aussi!

Pour compiler, le fichier INSTALL dit de simplement taper make. Si nous faisons cela, busybox sera lié à la glibc. Or il doit être lié à µClibc. Donc nous devons faire make CC=/ghlmf/usr/bin/i386-uclibc-gcc. C'est aussi simple que cela! Et lorsque la compilation est terminée, voyons si busybox est bien lié à la bonne libc. L'outil listant les bibliothèques nécessaires à un binaire pour sa bonne exécution est ldd. Si vous faites ldd busybox Attendez-vous à avoir aussi bien un résultat escompté qu'un résultat surprenant. En fait, il ne faut pas utiliser le ldd du chemin d'exécution, mais /ghlmf/bin/ldd. Chez moi, cela donne:

$ /ghlmf/bin/ldd busybox
	libc.so.0 => /ghlmf/lib/libc.so.0
	/ghlmf/lib/ld-uClibc.so.0 => /ghlmf/lib/ld-uClibc.so.0

Tout va donc très bien.

Le fichier INSTALL vous indique de faire make install ensuite. Si vous le faites, vous allez créer de nombreux liens vers busybox. Cela est strictement inutile dans le cadre de la construction de notre disquette. L'important, c'est de ne pas oublier de mettre busybox sur la disquette ensuite.

Amusons nous un peu avec busybox. Faites: busybox ls -l. Avez-vous la liste des fichiers? Et avec busybox date, avez-vous l'heure? Si vous lancez busybox sans argument, vous obtenez la liste de ce qu'est capable d'exécuter busybox.

Busybox se lance avec comme premier argument le nom du programme à émuler, suivi des options habituelles du programme. Mais si vous faites un lien symbolique vers busybox, par exemple ln -s busybox ls, vous pouvez utiliser le lien en oubliant qu'il pointe sur busybox. Dans notre cas, busybox ls -l et ./ls -l auront le même effet!

7. Le noyau

Pour le noyau, rien de plus facile si vous avez déjà recompilé votre noyau, ou plutôt si vous savez le faire. Vous donner des explications détaillées sur ce sujet sort de cet article. Je vais être rapide et court sur ce point. Première étape: sauvegardez votre configuration actuelle contenue dans le fichier .config. Puis faites make mrproper. Cela fait le grand nettoyage. Pour qu'il n'y ait pas d'interférences avec votre noyau courant, éditez le fichier Makefile: la quatrième ligne EXTRAVERSION est vide. Mettez un numéro, ou mieux, un nom, par exemple ghlmf. Configurez ensuite le noyau avec make menuconfig ou make xconfig. Je ne vais pas vous expliquer la configuration du noyau: des articles ont déjà été écrits sur le sujet, et de nombreux sites vous expliqueront comment le faire sur internet. Simplement, dites-vous deux choses: le Linux embarqué que vous construisez est un Linux qui n'a rien de spécifique, ou plutôt dont la seule spécificité est qu'il doit être le plus petit possible, et dites-vous aussi que la disquette a un but spécifique, donc pas besoin de compiler des options "que je pense utiliser plus tard": cela prend de la place inutilement.

Je vous demanderai quand même une option importante: mettez un ram-disque de 4096 kilo-octets. Nous nous servirons d'un ram-disque de 4Mo par la suite! Et pour faire simple, dans le cadre de l'article, je vous demanderai de ne pas faire de modules. Vous pourrez compiler des modules ensuite, lorsque vous aurez bien compris le principe de la construction de la disquette.

La compilation se fait avec make deps &&make clean &&make bzImage si vous faites cela sans les modules, et make deps &&make clean &&make bzImage &&make modules &&make modules_install si vous les utilisez. Vous récupèrerez votre noyau arch/i386/boot/bzImage (sur un PC) par la suite, et une copie des modules dans /lib/modules/2.4.18-ghlmf sera peut-être nécessaire lors de la création de la disquette si vous avez quand même tenu à faire des modules.

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.

9. Les premiers tests

Pour nos premiers tests, nous allons utiliser un fichier ghlmf.ini des plus simples. Il contiendra:

#!/bin/sh
while [ 1 -gt 0 ]; do
 date
 sleep 1
done

Vous pouvez maintenant booter votre disquette. Si un problème survient lors du boot, il va falloir faire appel à toutes vos ressources de hacker. En effet, le problème peut venir de nombreuses origines. Un fichier mal placé, des permissions mal données, un noyau mal configuré ou une option manquante quelque part... la liste des sources des problèmes que vous pouvez rencontrer ici est longue. J'espère que cela marchera du premier coup pour vous, et je regrette de ne pas pouvoir mettre ici les problèmes et leur résolution: cela pourrait faire un roman! Je vous indique quand même l'un ou l'autre piège dans lesquels je suis tombé ou j'aurais failli tomber. Pensez à bien mettre le support du ram-disque, et que sa taille corresponde bien à celle que vous avez choisie pour le ram-disque). j'ai aussi voulu désactiver le support de disques durs IDE/ATAPI, ma machine de test n'ayant pas de disque dur. Je ne sais pour quelle obscure raison ne pas avoir de support pour le disque dur empeche le système de booter sur la disquette. Mais j'ai du activer cela pour que ça marche.

10. Bochs

Bochs permet d'émuler un PC depuis le boot. C'est un outil qui malgré sa lenteur vous fera gagner beaucoup de temps en vous évitant de rebooter votre PC à chaque modification

Installez bochs de la manière que vous préférez, en recompilant les sources, avec apt-get, urpmi et les concurrents. La configuration se fait soit en éditant le fichier de configuration ${HOME}/.bochsrc, soit en lançant bochs sans options et en répondant aux questions.

J'ai utilisé la version 1.4 (paquetage Mandrake dans les contribs de cooker), et si cela peut vous faire gagner un peu de temps, voici mon fichier de configuration. Adaptez-le à votre propre configuration.

# configuration file generated by Bochs
floppya: 1_44="/tmp/ghlmf.floppy", status=inserted
# no floppyb
# no diskc
# no diskd
# no cdromd
romimage: file=/usr/bochs/1.4/BIOS-bochs-latest, address=0xf0000
vgaromimage: /usr/bochs/1.4/VGABIOS-lgpl-0.3a
megs: 32
# no parport #1
# no sb16
boot: a
vga_update_interval: 30000
keyboard_serial_delay: 20000
keyboard_paste_delay: 100000
floppy_command_delay: 50000
ips: 500000
mouse: enabled=0
private_colormap: enabled=0
i440fxsupport: enabled=0
time0: 0
# no ne2k
newharddrivesupport: enabled=1
# no loader
log: /tmp/bochs.log
panic: action=ask
error: action=report
info: action=report
debug: action=ignore
keyboard_mapping: enabled=0, map=
keyboard_type: mf

Un test se fait ensuite en lançant bochs sans argument, mais en chargeant le fichier de configuration qui connait le nom du fichier image de notre disquette. Je vous laisse jouer un peu avec ce bochs qui en émerveillera surement plus d'un. Ou alors, bootez sur la disquette si vous ne voulez pas utiliser bochs.

11. Complétons la disquette

Nous avons un linux qui marche. Cependant, pour le compléter, certaines applications font appel à certains fichiers. En voici quelques uns, à mettre dans le fichier initrd:

11.1. /etc/fstab

/dev/ramdisk / ext2 defaults 1 1
none /proc proc defaults 0 0

11.2. /etc/passwd

root::0:0:root:/:/bin/sh
nobody::65534:65534:nobody:/:/bin/sh

11.3. /etc/group

root::0:
nogroup::65534:

11.4. Autres

D'autres fichiers, que vous pouvez aussi prendre dans le répertoire /etc/ de votre GNU/Linux, peuvent se retrouver dans le répertoire du même nom de la disquette. C'est le cas de /etc/resolv.conf si vous avez besoin des services d'un serveur de noms; c'est le cas de /etc/services si vous avez besoin de la table de correspondance entre les numéros de ports et leurs noms.

12. Configuration, extensions

Vous venez de booter sur votre disquette, et vous avez eu la date qui s'affichait toutes les secondes, comme programmé dans notre script ghlmf.ini. Nous allons maintenant passer à la configuration de la machine.

12.1. Configuration

La configuration consiste en fait en deux parties, l'initialisation des périphériques, et le lancement des programmes résidents. Sur un Unix classique, cela se fait habituellement avec les scripts rc (/etc/rc.d/...). Ici, nous allons suivre le même principe, mais en très simplifié. En fait, nous allons juste mettre la configuration dans un fichier séparé, par exemple config.ini, qui sera appelé depuis ghlmf.ini. Dans ce script config.ini, mettez ce dont vous avez besoin, typiquement la configuration du réseau avec ifconfig:

#!/bin/sh

IP=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS=10.11.12.13
DOMAIN=mondomaine.fr

ifconfig eth0 ${IP} netmask ${NETMASK} up
route add -net default gw ${GATEWAY} eth0
echo search ${DOMAIN} >/etc/resolv.conf
echo nameserver ${DNS} >>/etc/resolv.conf

Complétez comme bon vous semble la configuration. C'est ici aussi que vous pouvez lancer des programmes résidents, comme par exemple un serveur dhcp, web ou ssh.

Et ensuite, dans votre script ghlmf.ini, appelez ce script config.ini avant de rentrer dans la boucle infinie. Vous pouvez aussi appeler ce script depuis linuxrc qui se trouve sur le ram-disque. C'est selon ce que vous préférez, et pour si peu, il n'y a pas vraiment d'arguments pour le mettre dans linuxrc ou ghlmf.ini.

13. Paquetages

13.1. Qu'est-ce qu'un paquetage?

Ajouter un programme sur la disquette, dans son état actuel, doit se faire en décompressant le ram-disque, en le montant en loopback avec les droits root, en plaçant le programme au bon endroit, en démontant le ram-disque, en compressant le ram-disque (n'oubliez pas que toute modification du ram-disque diminue le taux de compression de celui-ci) et en le mettant sur la disquette. C'est assez compliqué. Il vaut donc mieux utiliser des paquetages, c'est-à-dire des tarballs (fichiers .tar.gz) qui se trouvent sur la disquette, à côté du ram-disque et non pas dedans, et qui sont installés au vol par linuxrc ou ghlmf.ini.

13.2. Création d'un paquetage

Pour un exemple de paquetage, j'ai choisi le programme pcd qui est un simple lecteur de CD en ligne de commande, et je vais vous montrer du début à la fin comment l'installer.

Récupérez les sources (http://hocwp.free.fr/pcd.html). Décompressez-les. La compilation se fait comme avec busybox mais il faut juste pense que l'on va compiler le programme pour qu'il soit dans /bin mais qu'il s'installe dans /ghlmf/bin:

./configure --prefix=/
make CC=/ghlmf/usr/bin/i386-uclibc-gcc
strip pcd
/ghlmf/bin/ldd pcd
make -n install prefix=/ghlmf
su -
make install prefix=/ghlmf

Notez que j'ai testé que le binaire pcd créé était bien lié à µClibc, et que j'ai fait une simulation d'installation avec le make -n pour vérifier que le programme s'installait bien comme je voulais. Vu que ce projet ne contient qu'un seul binaire, j'aurais pu faire plus simple en ne copiant que le binaire au bon endroit, et à la main. Mais vous avez ainsi la méthode complète pour des projets un peu plus gros. N'oubliez pas de faire un strip <binaire> sur tous les binaires: vous gagnerez beaucoup de place ainsi. Le gain est de 75% avec pcd!

Revenons à notre paquetage, que nous allons appeler pcd.tar.gz. Allez dans /ghlmf et essayez ceci:

tar cvzf /tmp/pcd.tar.gz bin/pcd

Vous créez ainsi un tarball dans /tmp qui doit contenir tous les fichiers du paquetage, de telle manière que si vous décompressez ce tarball à la racine, les fichiers s'installent au bon endroit. C'est cela, un paquetage: un tarball contenant tous les fichiers nécessaires à une application, prêts à être installés au bon endroit lorsque le ram-disque sera en place.

Au fait, si vous voulez utiliser pcd, pensez à créer le périphérique correspondant au lecteur CD avec mknod!

13.3. La gestion des paquetages

Loin de moi l'idée de vouloir faire de la concurrence au format .deb ou au format .rpm. Le principe est d'avoir une manière simple d'ajouter des paquetages à la disquette avec un minimum de modifications.

Le principe est d'avoir sur la disquette un répertoire ne contenant que des paquetages, portant par exemple le nom joli et bien approprié packages. Ce répertoire sera accessible après via /mnt/fd0/packages. Pour installer tous les paquetages de la disquette, un petit script comme le suivant suffit:

cd /
packages=`ls /mnt/fd0/packages`
for p in $packages;
do
 tar xzf $p
done

Avec un tel bout de script que vous pouvez ajouter dans linuxrc, tout paquetage disposé dans le répertoire packages de la disquette sera installé lors du boot de la disquette. Simple, n'est-il pas?

Pour aller plus loin, nous pourrions même prévoir une procédure d'initialisation de certaines applications ou de lancement de programmes résidents contenus dans les paquetages. Une idée serait d'avoir un/des script(s) dans etc/init dans chaque paquetage. Après l'installation du paquetage, il suffirait donc d'exécuter tous les scripts de /etc/init avec ceci par exemple:

cd /
scripts=`ls -t /etc/init`
for s in $scripts;
do
 chmod 755 $s;
 $s
done

Notez l'option -t pour le ls, qui trie les scripts par ordre alphabétique, ce qui permet de donner une priorité d'exécution des scripts sans se casser la tête.

14. Applications

Une fois arrivé là, de nombreuses applications s'ouvrent à vous. En voici trois dont j'ai parlé en introduction. Je les aborde ici, à vous de les mettre en oeuvre en détail.

14.1. Un routeur/mur pare-feu

Pour faire un routeur, vous n'avez qu'à activer le routage avec

echo 1 >/proc/sys/net/ipv4/ip_forward

Si vous voulez un mur pare-feu, vous devez utiliser un logiciel adapté, iptable étant à mon avis le plus approprié ici. Allez le chercher sur http://www.iptables.org. Et transformez les sources en un paquetage comme nous l'avons vu pour pcd. Ayez ensuite un script, par exemple firewall.ini que vous appelez depuis ghlmf.ini et qui fait tous les appels à iptables pour configurer le mur pare-feu. Un petit rappel de sécurité sur les murs pare-feu: on commence par tout interdire puis on autorise ce dont on a besoin. Ne faites surtout pas le contraire en interdisant ce sont vous n'avez pas besoin: vous louperez surement des morceaux.

Un mur pare-feu sur disquette a un gros avantage sur un mur pare-feu sur disque dur: vous protégez votre disquette et si le système est violé, une simple coupure de courant réinitialise tout. Si votre système se trouve sur un disque dur, et que votre système est violé, vous devez tout réinstaller.

Inversement, un mur pare-feu ayant un support réinscriptible vous permettra de garder des log de tout ce qui se passe. Cela est très intéressant pour une analyse ultérieure, ou tout simplement une surveillance logicielle continue.

A vous de voir ce que vous préférez, et peut-être même de mixer les deux solutions? De mon côté, je suis en train d'opter pour un système avec support NFS pour avoir le répertoire des logs sur une autre machine, afin de les exploiter. Attention dans ce cas: µClibc et busybox ont besoin de quelques options supplémentaires pour supporter le NFS!

14.2. Un autoradio

L'autoradio concerne plus les hackers-électroniciens que d'autres lecteurs. En effet, il faut savoir brancher l'ordinateur sur la batterie de la voiture et non pas sur le 230V du secteur. Et surtout, il faut un petit montage électronique avec quelques interrupteurs pour piloter le lecteur CD/ogg/mp3 puisque vous n'allez pas transporter le clavier et l'écran 21 pouces dans la voiture!

L'idée étant lancée, il ne reste plus qu'à installer les logiciels, par exemple pcd pour les CD, ogg123 pour les fichiers ogg, et mpg321 pour les mp3. Et à faire un script ou un binaire capable d'interpréter l'action de l'utilisateur sur le bloc d'interrupteurs et de lancer la musique en fonction.

14.3. Lire son courrier électronique partout

Ceci est un assez bon défi. Il y a plusieurs choix à faire. Allez-vous utiliser pop3 ou imap, avec un lecteur de courrier électronique? Ou alors allez-vous préférer un navigateur web pour aller visiter les interfaces email des différents fournisseurs d'accès? J'ai fait ce second choix. Ensuite quel logiciel de navigation choisir? Les plus connus sont lynx, links, w3m. Je n'ai pas essayé de recompiler lynx. Et je n'ai pas réussi à recompiler w3m avec µClibc. Mon choix s'est porté sur links (version 2.1pre2) dont la compilation n'a pas posé de problème une fois que j'avais tout désactivé.

Un autre choix est de savoir si vous voulez vous contenter d'une machine connectée au réseau, ou si vous voulez aussi pouvoir utiliser un modem (et donc ppp). Dans le premier cas, c'est facile: il n'y a qu'a configurer le réseau avec ifconfig pour l'interface réseau, route pour spécifier la passerelle vers internet, et echo nameserver ${DNS} >/etc/resolv.conf pour le DNS. Dans le second cas, il faut aussi ajouter tout ce qu'il faut pour se connecter au fournisseur d'accès. N'ayant pas ce qu'il fallait pour tester cette solution jusqu'au bout, je vais juste vous indiquer comment compiler pppd et en faire un paquetage.

Récupérez pppd (version 2.4.1 pour moi), décompressez l'archive. Lancez ./configure qui n'est pas un script configure habituel: pas besoin de spécifier des options. Ensuite, pour recompiler, make CC=/ghlmf/usr/bin/i386-uclibc-gcc n'a pas suffi: j'ai obtenu deux erreurs dans auth.c concernant deux fonctions manquante: getspnam et endspent. Un petit coup d'oeil dans pppd/auth.c nous montre tout de suite qu'il suffit de désactiver les shadow-passwords. La ligne de commande pour compiler est donc make CC=/ghlmf/usr/bin/i386-uclibc-gcc HAS_SHADOW=. Pour l'installation, vous devez la faire en tant que root, par exemple avec make install DESTDIR=/tmp/ppp. La suite est simple:

cd /tmp/ppp
tar cvf /tmp/ppp.tar etc/ppp usr/sbin
cd /tmp
gzip -9 ppp.tar

Et votre paquetage s'appelle ppp.tar.gz et fait 116011 octets chez moi. Mais pppd utilise plus de bibliothèques que nous n'en avons mises dans le ram-disque au tout début. Ajoutez celles qui manquent: elles se trouvent dans /ghlmf/lib et vous en avez la liste avec /ghlmf/bin/ldd /tmp/ppp/usr/sbin/pppd.

N'ayant pas ce qu'il faut pour tester plus en avant cette solution, je vais me refugier derrière le prétexte que cet article est destiné aux hackers et que vous en savez maintenant assez pour hacker cette disquette. A vous de créer les bons périphériques dans /dev, de créer l'utilisateur pppuser, d'écrire en dur ou configurable par l'utilisateur la configuration réseau. A vous de jouer!

15. Conclusion

Après un article sur les linux embarqués qui citait la distribution sur disquette µClinux (qui utilise d'ailleurs uCLinux), après un article sur comment construire son "rescue disk", qui utilisait la distribution disquette Timo's rescue set, vous avez maintenant non pas un nouvel article sur une distribution sur disquette, mais les entrailles d'un linux sur disquette. Je ne vous encourage pas vraiment à chercher à faire une nouvelle distribution sur disquette car il en existe beaucoup plus qu'on ne croit. Au contraire, je vous encourage maintenant à développer votre propre disquette, et à la maintenir à jour, car cela est très facile, autrement plus facile que de tenir à jour une distribution classique. Les avantages sont que vous la maintenez à jour comme vous le voulez en toute liberté, et que vous la configurez à votre sauce en ayant un contrôle total sur ce que vous mettez dedans.

16. Références

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