Peut-être avez-vous un vieil ordinateur qui traîne dans la cave et dont le disque dur ne marche plus. Vous pouvez lui redonner une seconde vie en l'utilisant comme terminal, en le connectant à votre ordinateur et en construisant la disquette de boot nécessaire. Voici quelques explications.
Le matériel que j'ai utilisé est un vieil ordinateur dont le processeur est un 386 SX, avec 4 Mo de mémoire vive, ainsi qu'un lecteur de disquette, un clavier français (azerty) et un port série. Je pense que c'est le strict minimum pour pouvoir lancer un Linux. En fait, ça devrait marcher avec 2 Mo de RAM, en modifiant un peu la procédure. Je précise que le port série est géré par un UART 16450 qui ne peut monter qu'à 38400 bps et ce, théoriquement (disons utopiquement

Je vais présenter deux solutions. La première est basée sur un OS du type DOS (on pourra utiliser MSDOS ou l'équivalent libre FreeDOS) et Telix, un programme shareware d'émulation de terminal. L'autre possibilité ne met en jeu que des logiciels libres et utilise un noyau Linux ainsi que le programme minicom.
Les deux configurations proposées ont le même fonctionnement schématique. Seule la méthode de fabrication de la disquette de boot change. En gros, le vieux 386 va démarrer la disquette bootable et exécuter ce qui se trouve dans le secteur de boot. Ce petit quelque chose va lancer le système d'exploitation puis ce dernier va finalement lancer le programme d'émulation de terminal choisi.
Pour tester rapidement vos disquettes de boot, vous pourrez utiliser l'émulateur de PC qemu qui fonctionne sous Linux. Par exemple, avec la disquette dans votre lecteur, vous pouvez lancer qemu par la commande
Code: Select all qemu -monitor stdio -fda /dev/fd0 |
Configuration de votre système
Pour que votre système Linux (ou n'importe quel UNIX) puisse gérer le terminal, il faut faire un petit changement de configuration très simple. Par défaut, au démarrage, votre système Linux lance un certain nombre de consoles à partir desquelles vous pouvez vous logguer. Le lancement de ces consoles se fait grâce au fichier /etc/inittab. Il vous suffit de rajouter dans ce fichier une ligne du type
Code: Select all c7:2345:respawn:/sbin/agetty -h -L ttyS0 38400 vt102 |
Première solution : DOS + Telix
L'avantage de cette solution est la facilité de mise en oeuvre mais aussi les meilleures performances. En effet, les performances du port série controllé par un UART 8250 ou 16450 dépendent fortement de la vitesse à laquelle le processeur gère les caractères arrivant ou partant. Un OS léger comme DOS permettra alors un gain de performance qui reste cependant minime.
D'un autre côté, cette solution présente l'inconvénient majeur de faire tourner un shareware qu'il faut en toute légitimité payer au bout de quelques semaines. De plus, DOS utilise un encodage différent du très courant iso8859-1. En conséquence, les caractères accentués ne passent pas du tout correctement, et c'est assez embêtant pour les personnes qui, comme moi, ont un mot de passe contenant des "à" ou des "é".
Pour construire la disquette de boot, c'est très simple. Prenez un système DOS, mettez une disquette vierge dans votre lecteur (A: dans l'exemple) et tapez la commande
Code: Select all format /s a: |
Code: Select all KEYB.COM FR,,KEYBOARD.SYS |
Pour finir, installer Telix sur un système DOS, dans C:\TELIX par exemple. Puis copier ce répertoire sur la disquette en ayant pris soin d'enlever les fichiers inutiles pour que le tout tiennent sur la disquette. Par exemple, les fichiers de documentation (les fichiers *.DOC) ne sont pas nécessaires et prennent beaucoup de place inutilement. Rajoutez enfin à la fin du fichier AUTOEXEC.BAT de votre disquette les lignes suivantes :
Code: Select all SET TELIX=A:\TELIX A:\TELIX.EXE |
Deuxième solution : Linux + minicom
Même si cette solution est très légèrement moins performante que la première et plus difficile à mettre en place, elle présente l'avantage indéniable de n'utiliser que des logiciels libres.
Je suppose que dans toute la suite vous travaillez sous root (c'est nécessaire pour créer et monter les systèmes de fichier). Le répertoire de travail sera le $HOME de root, abrégé par ~.
Mise en place du chargeur : syslinux
Le chargeur utilisé sera syslinux pour sa facilité de configuration. Pour cela, formatez au format VFAT une disquette avec
Code: Select all mkfs -t vfat /dev/fd0 |
Code: Select all syslinux /dev/fd0 |
Code: Select all mount -t vfat /dev/fd0 /mnt/floppy |
Code: Select all default monlinux display message.txt label monlinux kernel vmlinuz append initrd=initrd.gz root=/dev/ram |
Mise en place du noyau
Décompressez les sources du noyau et entrez dans la racine de l'arborescence des sources :
Code: Select all cd ~ tar xfjv linux-2.4.28.tar.bz2 cd linux-2.4.28 |
Code: Select all make xconfig |
- CONFIG_M386 : compiler le noyau pour un processeur 386 (si vous avez un 486, choisissez... 486 !)
- CONFIG_MATH_EMULATION : si vous avez un 386 sans coprocesseur comme c'est mon cas, il faudrait activer cette option. En fait, elle n'est peut-être pas nécessaire, mais je n'ai pas essayé.
- CONFIG_VT, CONFIG_VT_CONSOLE : pour que votre noyau puisse utiliser votre écran. La deuxième option n'est pas strictement nécessaire, mais ça ne coûte rien de l'activer : celà affiche les messages de démarrages du noyau à l'écran.
- CONFIG_SERIAL : gestion du port série
- CONFIG_RAMFS, CONFIG_PROC_FS, CONFIG_EXT2_FS, CONFIG_BLK_DEV_RAM, CONFIG_BLK_DEV_RAM_SIZE=1024 : nécessaire pour que le noyau puisse démarrer avec un initrd. Notez que j'ai mis 1024 Ko comme taille par défaut du ramdisk, ce qui est suffisant puisque ce ramdisk ne contiendra que quelque fichier de périphériques, de configuration, et le binaire statique de minicom.
Et puis, si comme moi vous avez un clavier azerty (ou tout autre clavier non américain), il faudra faire une manipulation supplémentaire pour que le clavier par défaut du noyau soit le votre. Pour celà, il faut remplacer le fichier drivers/char/defkeymap.map présent dans l'arborescence des fichiers sources du noyau par le fichier .map qui est celui de votre clavier. Par exemple, j'y ai mis le contenu du fichier /usr/share/keymaps/i386/azerty/fr-latin1.map.gz, après l'avoir décompressé bien sûr. Il faut aussi remplacer les include de ce fichier fr-latin1.map par les fichiers qu'ils appellent.
Voilà, vous pouvez maintenant compiler votre noyau avec
Code: Select all make dep bzImage |
Code: Select all cp arch/i386/boot/bzImage /mnt/floppy/vmlinuz |
Maintenant, votre disquette est prête à démarrer votre noyau au clavier francisé, mais il manque le principal : minicom. Ce dernier a besoin d'un certain environnement pour fonctionner : un ficher /etc/minird.dfl ou encore un /dev/ttyS0 par exemple.
Créons donc le fichier ramdisk qui contiendra l'arborescence. Ce fichier devra faire exactement 1024 Ko comme spécifié dans les options du noyau :
Code: Select all dd if=/dev/zero of=~/initrd |
Code: Select all mke2fs -m 0 -N 256 ~/initrd |
Code: Select all mkdir ~/ramdisk mount ~/initrd ~/ramdisk -o loop |

Je vous donne quand même un aperçu de ce qu'il faut faire. Tout d'abord créer les répertoires :
Code: Select all cd ~/ramdisk mkdir bin mkdir dev mkdir etc mkdir proc mkdir tmp ln -s bin sbin mkdir var |
Code: Select all cd dev mknod console c 5 1 mknod null c 1 3 mknod ram b 1 1 mknod tty c 5 0 mknod tty0 c 4 0 mknod zero c 1 5 |
Code: Select all pr port /dev/ttyS0 pu baudrate 38400 pu bits 8 pu parity N pu stopbits 1 pu rtscts Yes pu xonxoff Yes pu mdialpre pu mdialsuf pu mdialpre2 pu mdialsuf2 pu mdialpre3 pu mdialsuf3 pu escape-key ^Z pu statusline disabled pu mfcolor GREEN pu mbcolor BLACK pu sfcolor GREEN pu sbcolor BLACK |
Compilation de minicom
Décompressez les sources de minicom et entrez dans la racine de l'arborescence des fichiers sources :
Code: Select all cd ~ tar xfzv minicom-2.1.tar.gz cd minicom-2.1 |
Il faut aussi supprimer ou plutôt remplacer tous les appels aux fonctions getpwuid() à partir de la ligne 1189 de src/minicom.c, sinon minicom refuse de se lancer et affiche l'humoristique message d'erreur You don't exist. Go away. (encore heureux qu'il y ait eu ce messaye d'erreur, sans quoi je pense que je n'aurai jamais réussi à compiler un minicom qui marche !). Il faut alors remplacer en dur les appels de ces fonctions par ce qu'elles retournent dans le cas de l'utilisateur root. Je me retrouve ainsi, par exemple, à la ligne 1199 avec :
Code: Select all strncpy(homedir, "/root", sizeof(homedir)); |
Code: Select all CFLAGS="-Os -march=i386 -static" ./configure --disable-socket --disable-nls |
Maintenant, il faut savoir que ça marche si vous avez vos librairie de la libc compilées pour un processeur 386. Si ce n'est pas le cas, comme moi, vous devez installer un environnement de cross-compilation pour i386. Comme c'est assez compliqué, j'ai choisi de télécharger un environnement de développement pour i386 tout fait, et livré avec la µlibc (qui est un remplaçant de la libc mais en plus petit et donc spécialement adaptée aux manipulations comme la nôtre)
Retour sur notre initrd
Maintenant que minicom est compilé, il faut copier le binaire statique obtenu dans le /bin de votre initrd. Créer ensuite dans votre initrd un lien symbolique nommé init (que le noyau cherchera et lancera) pointant sur minicom :
Code: Select all cp ~/minicom-2.1/src/minicom ~/ramdisk/bin/minicom cd ~/ramdisk/bin ln -s minicom init |
Code: Select all cd ~ umount initrd gzip -9 initrd |
Code: Select all cp initrd.gz /mnt/floppy |
Voilà, si vous n'avez eu aucun problème, alors vous êtes soit très fort (auquel cas je me demande pourquoi vous êtes en train de lire ce document), soit très chanceux. Sinon, je suis certain que vous aurez beaucoup appris en essayant de construire votre disquette, comme ça a été le cas pour moi.
Au niveau des problèmes, je constate que la vitesse de mon terminal est en pratique aux alentours des 9600 bps. Je ne sais pas si c'est un problème de configuration ou si c'est parce que le 386 est trop lent pour les "haut-débits".
Quoi qu'il en soit, bon courage et bon bidouillage !
Liens
Sont regroupés ici quelques liens vers des resources qui vous seront utiles pour la confection de votre disquette.
Les programmes
- FreeDOS, une implémentation libre de DOS
- Telix, le programme shareware d'émulation de terminal, fonctionnant sous DOS
- Syslinux, le chargeur de système d'exploitation
- kernel.org est le site où vous trouverez les sources du noyau Linux.
- Minicom, un émulateur de terminal libre, pour systèmes UNIX
- SmallLinux, une distribution Linux minimale tenant sur deux disquettes.
- µlibc, une implémentation plus petite de la libc. Dans la rubrique Toolchains, vous trouverez le lien pointant vers un environnement complet de développement pour la µlibc
- Qemu, un programme qui simule totalement un PC. Il vous permettra de tester rapidement votre disquette de boot
- Le Bootdisk-HOWTO en français explique comment construire des disquettes de boot.
- Le Text-Terminal-HOWTO vous explique tout ce que vous devez savoir sur les terminaux et Linux.