Win3x.Org

Windows & DOS Community

Un 386 recyclé en terminal

Post Reply   Page 1 of 1  [ 2 posts ]
Author Message
kdntl
Post subject: Un 386 recyclé en terminal
Posted: 08 Apr 2005 22:16
Membre inscrit
Offline
 
Posts: 7
Joined: 26 Oct 2004 12:53
 
Un 386 recyclé en terminal

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
qemu -monitor stdio -fda /dev/fd0
Mais avant d'aborder la lecture de cette page, je vous conseille de lire auparavant les Terminal-Text-HOWTO et Bootdisk-HOWTO dont les liens (vers les versions françaises) sont donnés à la fin de ce présent document.


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
c7:2345:respawn:/sbin/agetty -h -L ttyS0 38400 vt102
Pour plus d'informations, reportez-vous à man inittab et à man agetty. A noter que vous pouvez aussi utiliser getty à la place de agetty.


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
format /s a:
Cela aura pour effet de mettre en place sur la diquette : le bootloader qui démarrera le noyau du DOS qui lui même va ensuite lire les fichier CONFIG.SYS et AUTOEXEC.BAT. Peut-être aurez-vous besoin de rajouter dans ce dernier fichier une ligne du genre
KEYB.COM FR,,KEYBOARD.SYS
Pour que votre clavier azerty soit correctement géré. Le cas échéant, n'oubliez pas de copier les fichiers KEYB.COM et KEYBOARD.SYS à la racine de la disquette.

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 :
SET TELIX=A:\TELIX
A:\TELIX.EXE
Voilà, la disquette est fin prête. Il ne vous reste plus qu'à la démarrer sur votre vieil ordinateur et à configurer votre Telix.


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
mkfs -t vfat /dev/fd0
Puis installez syslinux :
syslinux /dev/fd0
Vous pouvez alors monter la disquette
mount -t vfat /dev/fd0 /mnt/floppy
Maintenant, il faut configurer syslinux pour qu'il trouve le noyau qu'on y mettra. Celà se fait via un fichier de configuration sur la disquette. Créez ainsi sur la disquette un fichier nommé syslinux.cfg contenant
default monlinux
display message.txt
label monlinux
kernel vmlinuz
append initrd=initrd.gz root=/dev/ram
Mettez ensuite le message d'accueil que vous voulez dans le fichier message.txt. Pour plus d'informations sur les options de syslinux, reportez-vous au fichier d'aide fourni (habituellement dans /usr/share/doc/syslinux-x.xx/syslinux.doc). Notez qu'avec ce fichier syslinux.cfg, le noyau que nous compilerons devra être présent dans le fichier vmlinuz sur la disquette. De même, le système de fichier compressé devra être dans le fichier initrd.gz.


Mise en place du noyau

Décompressez les sources du noyau et entrez dans la racine de l'arborescence des sources :
cd ~
tar xfjv linux-2.4.28.tar.bz2
cd linux-2.4.28
Le noyau sera compilé avec le strict minimum pour que le chargement soit plus rapide. Il vaut mieux ici tout mettre en dur dans le noyau et ne pas compiler de modules. Voilà les options qu'il faudra nécessairement choisir après avoir fait un
make xconfig
ou un make menuconfig :
  • 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.
Remarque : vous n'êtes même pas obligé d'activer le support du lecteur de disquette, puisque le noyau n'y accède pas. C'est syslinux lui-même qui s'occupe de lire le noyau et le initrd de la disquette.

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
make dep bzImage
Copiez ensuite le noyau obtenu sur la disquette en le nommant vmlinuz (comme spécifié dans votre syslinux.cfg) :
cp arch/i386/boot/bzImage /mnt/floppy/vmlinuz
Le système de fichier placé en ramdisk : initrd.gz

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 :
dd if=/dev/zero of=~/initrd
Créons maintenant dans ce ramdisk un système de fichier ext2 :
mke2fs -m 0 -N 256 ~/initrd
L'option "-N 256" permet la création d'au plus 256 fichiers (plus exactment des inodes) dans le ramdisk, le nombre par défaut étant de seulement 128 pour un système de fichier d'1 Mo, ce qui est trop peu. Jetez un coup d'oeil à man mke2fs pour plus d'informations. Pour utiliser le système de fichier, il faut le monter :
mkdir ~/ramdisk
mount ~/initrd ~/ramdisk -o loop
Pour créer l'arborescence minimale, je me suis inspiré de la distribution smalllinux. J'ai exactement repris la disquette contenant le système de fichier puis ai effacé tous les fichiers dans /bin et /lib. Ce qui va suivre n'est donc peut-être pas exhaustif car je l'écrit sans l'avoir réellement fait. Je m'en sort en écrivant le classique : la création de l'arborescence et des fichiers de périphériques sera laissée en exercice au lecteur :)

Je vous donne quand même un aperçu de ce qu'il faut faire. Tout d'abord créer les répertoires :
cd ~/ramdisk
mkdir bin
mkdir dev
mkdir etc
mkdir proc
mkdir tmp
ln -s bin sbin
mkdir var
puis les fichiers de périphériques :
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
N'oubliez pas de copier le fichier de configuration de minicom dans le etc du ramdisk. Voici le contenu du mien :
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
J'ai mis Ctrl-Z comme touche principale car Ctrl-A est utilisé par défaut avec le très pratique programme screen.


Compilation de minicom

Décompressez les sources de minicom et entrez dans la racine de l'arborescence des fichiers sources :
cd ~
tar xfzv minicom-2.1.tar.gz
cd minicom-2.1
J'ai dû modifier le code source de minicom pour qu'il se lance par défaut avec les options -c (pour activer la couleur) et -o (pour ne pas initialiser un éventuel modem). Pour cela, dans le fichier src/minicom.c, dans la section d'initialisation des variables globales (ligne 929 pour la version 2.1 de minicom), j'ai remplacé la ligne usecolor = 0; par usecolor = 1;. J'ai de même remplacé à la ligne 880 doinit = 1; par doinit = 0;.

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 :
strncpy(homedir, "/root", sizeof(homedir));
Pour compiler minicom, lancez le script configure de la façon suivante :
CFLAGS="-Os -march=i386 -static" ./configure --disable-socket --disable-nls
N'oubliez pas de faire un strip -s src/minicom pour réduire sa taille avant de le copier dans le système de fichier du initrd

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 :
cp ~/minicom-2.1/src/minicom ~/ramdisk/bin/minicom
cd ~/ramdisk/bin
ln -s minicom init
Voilà, il ne vous reste plus qu'à démonter votre initrd, et à le compresser :
cd ~
umount initrd
gzip -9 initrd
puis à copier le fichier initrd.gz obtenu sur la disquette :
cp initrd.gz /mnt/floppy
Conclusion

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
La documentation
  • 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.

Last edited by Big Monstro on 29 Oct 2018 21:24, edited 7 times in total.

Top
Profile Quote
BENARIAC
Post subject:
Posted: 09 Apr 2005 19:50
 
 
Ça tiens sur une disquette 720 ko?
Mon T1100 + n'a que cela (à l'époque de sa sortie, deux lecteurs de disquettes, c'était du luxe, alors imaginez le prix de l'option HDD !!!)

Edit : Rien à signaler :)


Top
Display: Sort by: Direction:
Post Reply   Page 1 of 1  [ 2 posts ]
Return to “Documentations et tutoriels”
Jump to: