Accueil > Documentation technique > télécommunications > Damn Small Linux sur Soekris 4801
Damn Small Linux sur Soekris 4801
par
L’installation d’une distribution Linux sur un pc sans clavier, ni écran, ni lecteur de quoi que ce soit peut dérouter. Nous proposons ici une méthode accessible à la plupart des utilisateurs sans obligatoirement comprendre tout ce qu’il y a derrière.
Le pc Soekris de type net4801 n’est pas forcément la panacée, mais il m’a permis de comprendre ce que j’attendais d’un pc embarqué en le comparant à d’autres disponibles sur le marché. Il est fait pour être router ou passerelle dans un réseau. Sa première application est la communication et c’est bien ce que nous demandons aux pc que nous installons sur le terrain. Nous n’avons aucun problème de temps réel au sens embarqué du terme (à savoir une tâche s’effectuant par exemple toutes les 20msec pour afficher des paramètres de navigation au pilote d’un avion de chasse). Il n’est pas question non plus de faire des calculs sur le terrain. Mais nous voulons pouvoir transférer les données depuis le récepteur GPS vers une destination qui peut nécessiter, selon les sites, des méthodes de transport bien différentes.
Le net4801 dispose d’un port USB pour la récupération « à pied » ou la connexion vers un périphérique USB de communication, d’un port série DB9 standard pour aller vers un modem (RTC, GSM, GPRS ou satellite style Iridium) ou vers le récepteur (il y a un second port série en interne qu’on peut faire sortir de la boîte), et de 3 ports Ethernet pour aller sur un router à partir du premier, éventuellement sur le récepteur à partir du second, voire sur le pc portable du visiteur à partir du troisième. Il y a encore moyen d’ajouter une carte d’extension sur le port mini-pci interne (carte wifi ?). Cette carte est maintenant annoncée en fin de vie par Soekris mais les nouveaux produits de la gamme présentent des caractéristiques similaires et le travail fait sur cette carte sera transposable immédiatement sur ces petites soeurs.
Avant de découvrir Damn Small Linux (lire Linux embarqué pour les nuls), j’avais trouvé pas mal d’articles sur l’implémentation de différents Linux sur cette carte, que ce soit à partir de rien (article Linux Magazine 74 sur la coupe de robotique EUROBOT) ou à partir de distributions officielles comme Ubuntu ou Redhat. Dans le premier cas, je trouvais la solution « sur mesure » (dite « from scratch »)un peu limitative car je n’y trouverai jamais que ce que j’aurai pensé ou su y mettre. Dans le second cas je trouvais, d’une part, ces distributions un peu monstrueuses pour la net4801, et la méthode d’installation pas accessible à tout le monde d’autre part.
En effet, la méthode s’appuyait sur une possibilité par ailleurs très intéressante du BIOS des Soekris : le démarrage sur Ethernet (PXE boot). La carte va chercher sur le réseau local le système sur lequel elle va démarrer. Cela se fait également avec Damn Small Linux, mais commence à nécessiter des compétences réseau/Linux qui éliminent d’entrée beaucoup d’utilisateurs potentiels. Je donne rapidement quelques problèmes liés à ce type de démarrage de façon à ce que chacun puisse estimer s’il doit s’aventurer sur ce terrain.
La Soekris, en l’absence de système interne, va faire une requête DHCP pour obtenir une adresse IP. Il faut donc un serveur DHCP qui, en plus de l’adresse IP, sache fournir une redirection vers le « serveur de système de démarrage » (qui peut être lui-même). La Soekris va alors chercher à récupérer son système de démarrage par un tftp (ftp simplifié) vers cette machine. Comme sur le « live CD » ou dans une installation de type « frugale », le futur système Linux se présente en deux images compressées. Si la première est récupérée par tftp, la seconde doit pouvoir être récupérée en montant par NFS l’endroit où elle se trouve. Si l’on n’est pas son propre administrateur réseau, il y a intérêt à bien s’entendre avec lui et qu’il n’ait pas trop d’autres choses à faire...
Second aspect difficile de cette méthode : il faut modifier l’image du système Linux à télécharger pour avoir une chance de dialoguer avec la Soekris. Par défaut, tous les systèmes Linux donnent la main à une console constituée d’un écran et d’un clavier. On peut espérer un accès réseau puisque cette méthode repose sur lui, mais le serveur telnet ou ssh est-il activé ? Dans l’affirmative d’où sortent les mots de passe ? Plein de questions auxquelles la seule réponse consiste en une modification de l’image du noyau.
Il ne reste qu’une solution « simple » que je vais maintenant décrire pas à pas : la création d’une Compact Flash « bootable » sur un ordinateur classique que l’on viendra insérer dans la Soekris.
Pour travailler j’ai pris un pc portable que j’ai d’abord démarré sur le « live CD » Damn Small Linux.
J’ai récupéré une CF de 128Mo et je l’ai partitionnée en 60Mo (marquée partition de démarrage) et 68Mo [1]. Comme précisé dans mon article sur l’installation « frugale », il faut créer un système de fichier sur la seconde partition. J’ai choisi un ext2.
Il est important de vérifier quels sont les noms de périphériques choisis par DSL afin de ne pas se tromper de cible. Il faut jouer avec la commande mount
et regarder dans le répertoire /mnt
quels périphériques DSL a vus au démarrage mais n’a pas montés. Dans mon cas le disque dur du pc était en /dev/hda tandis que la CF était en /dev/hde.
J’ai alors lancé une installation frugale de type Grub sur hde1 en précisant que je voulais mes extensions DSL sur hde2 et en indiquant en « cheat codes » complémentaires 3 ssh noeject acpi=off home=hde2 restore=hde2 opt=hde2
. Ce qui se traduit par : « Je veux atteindre le run-level 3 (multi-utilisateur avec réseau mais sans serveur X) ; le serveur ssh est lancé au démarrage, il n’y a pas d’éjection de CD à l’arrêt de la machine [2], pas de gestion de l’alimentation, répertoire home
créé sur /hde2 ainsi que le fichier de sauvegarde backup.tar.gz
et le répertoire /opt
. » [3]
Cette installation faite, il faut :
monter /dev/hde1
editer le fichier /mnt/hde1/boot/grub/device.map
qui contient la cartographie des disques vus par le pc portable actuellement et n’y laisser que
(hd0) /dev/hde
.
mettre à jour les informations Grub écrite dans le Master Boot Record de la Compact Flash (informations qui se résument, pour ce qui nous concerne, au contenu du fichier device.map) en faisant
cd /mnt/hde1
sudo grub-install --root-directory=. /dev/hde
remplacer hde par hda dans boot/grub/menu.list
(avec la commande vi « marteau-pilon » :%s/hde/hda/g
) et dans /mnt/hde1/boot/grub/device.map
,
monter /dev/hde2 et ajouter à la fin du fichier /mnt/hde2/opt/bootlocal.sh
la ligne :
/sbin/getty -L -l /bin/bash -n 19200 ttyS0 vt102
qui demande au système d’ouvrir une console sur le port série sans demande de login (en tant que root) avec les paramètres de « poignée de main » indiqués (attention, cette ligne doit vraiment être la dernière exécutée s’il vous prenait l’idée d’ajouter d’autres choses dans ce fichier).
Et c’est fini [4] !
Une fois la CF insérée dans la Soekris, on peut mettre son pc portable en hyperterminal sur le port série. A la mise sous tension on voit le BIOS détecter la CF et passer la main à Damn Small Linux. Après l’écran DSL ( avec la demande de « cheat codes »), plus rien ne se passe. Nous sommes en fait dans la procédure de démarrage Linux qui envoie ses messages à la console (laquelle n’existe pas). Pour changer cela il faudrait modifier l’image compressée du système. Le seul indice d’une activité est, au bout d’une trentaine de secondes, l’apparition de deux ou trois caractères cabalistiques [5]. Après facilement trois minutes, quand on a perdu tout espoir, un prompt apparaît sur l’hyperterminal et on peut enfin commencer à travailler.
Quelques remarques sur ce qu’il convient de faire ensuite, même si nous avons tous des objectifs différents pour notre pc embarqué sous DSL.
La première chose à faire est de donner un mot de passe à l’utilisateur DSL, de façon à pouvoir immédiatement communiquer par ssh avec la Soekris (sans oublier la question de la « persistance »). Si jamais on tape un CTRL-D sur l’hyperterminal, le prompt est définitivement perdu, le redémarrage est la seule façon de reprendre la main...
Il peut être utile de mettre en place un petit programme qui indique à une machine à IP fixe l’IP de la Soekris en fin de démarrage (à placer dans le home « persistant »).
La sauvegarde de Damn Small Linux écrit à chaque fois un fichier compressé sur hda2. La CF n’aime pas subir trop de cycles d’écriture. Si l’on a prévu une deuxième mémoire de masse (dans notre cas un disque dur traditionnel de pc portable connecté au port IDE de la Soekris et qui apparaît en /dev/hdb), il est plus sain de rediriger cette sauvegarde vers lui (il suffit de modifier le fichier texte /opt/.backup_device
).
Un petit mot de la consommation électrique, puisque c’est cet aspect qui nous a fait nous intéresser aux PC Soekris. Ci-après un enregistrement effectué par mon collègue David Stuart : un oscilloscope mesurait une tension aux bornes d’une résistance de 2,7Ω placée sur un des conducteurs de l’alimentation 12V. Les valeurs ont été converties en Ampère.
- démarrage d’une Soekris
- consommation sur les premières minutes avec zoom sur le courant d’appel au démarrage
Sur la courbe bleue on notera d’abord que ce démarrage dure plus de trois minutes. Les pics de consommations supérieurs à 500mA qui suivent sont dus à une écriture toutes les 30 secondes sur le disque dur IDE, écriture que j’ai volontairement programmée par crontab pour en observer l’impact. Il semble qu’il y ait d’autres petits pics de consommation réguliers dont je n’ai pas identifié la source. On constate qu’en dépit de l’ajout de ce disque dur traditionnel, la consommation ne dépasse guère les 4W.
Ma configuration
Je vais décrire ici un certain nombre d’éléments que j’ai ajoutés à la configuration de base, au cas où cela pourrait servir à quelqu’un.
réseau :
La Soekris possède trois interfaces Ethernet. J’ai laissé la première en client dhcp pour pouvoir rejoindre n’importe quel réseau local ; j’ai forcé la seconde en 192.168.1.1 pour me connecter par un câble croisé à un récepteur GPS dont l’interface IP serait également en 192.168.1.0 ; et enfin j’ai forcé la troisième en 192.168.2.1 et j’y ai installé un serveur dhcp, ce qui permet de venir s’y connecter avec un pc portable « normal » (cas d’une visite sur site) et d’utiliser ses outils réseaux habituels pour travailler sur la Soekris (par exemple putty, voire Cygwin pour bénéficier du serveur X).
Pour faire cela, j’ai dà » modifier (en sudo) le fichier /etc/network/interface, sans oublier de le rajouter dans /opt/.filetool.lst :
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
# The loopback interface
# automatically added when upgrading
auto lo eth0 eth1 eth2
iface lo inet loopback
iface eth0 inet dhcp
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0
broadcast 191.168.1.255
gateway 192.168.1.1
iface eth2 inet static
address 192.168.2.1
netmask 255.255.255.0
broadcast 191.168.2.255
gateway 192.168.2.1
Le serveur DHCP provient de l’extension busyserver.tar.gz . Son installation crée un répertoire busyserver sous /opt. On y trouve un fichier udhcpd.conf à modifier et à copier dans /etc (en sudo, toujours). Sans connaître du tout cet outil, le fichier de configuration est assez explicite pour y arriver. J’ai modifié l’adresse et l’interface du réseau par défaut. Lors du lancement par sudo udhcpd
j’ai d’abord reçu quelques insultes qui m’ont fait comprendre que :
je devais limiter le nombre de sessions simultanées à 20, ce qui correspondait aux nombre d’adresses IP à distribuer.
je devais créer un fichier udhcp.leases accessible en lecture/écriture, ce qui n’était pas le cas de la valeur par défaut en /var/lib/misc/udhcp.leases
je devais créer un fichier udhcp.pid accessible en lecture/écriture, ce qui n’était pas le cas de la valeur par défaut en /var/run/udhcp.pid
Pour ne pas m’y perdre, j’ai créé /mnt/hdb1/admin/ et j’ai indiqué ce chemin dans /etc/udhcpd.conf pour les fichiers .leases et .pid (il aurait été plus clair de créer ces fichiers dans /opt/busyserver, mais cela aurait provoqué des cycles d’écriture sur la CF).
Bien sà »r il ne faut pas oublier d’ajouter etc/udhcpd.conf
dans /opt/.filetool.lst
.
Au final, la configuration réseau est mise en place par bootlocal.sh qui contient les lignes
pump -i eth0
ifup eth1
ifup eth2
sudo /opt/bin/udhcpd > /mnt/hdb1/admin/udhcpd.log 2>&1 # dhcp server on eth2
J’ai également voulu connecter un classique modem RTC sur le port série. J’ai eu pas mal de soucis avec le port série 1. J’ai fini par trouver des discussions sur ce problème apparemment lié à ce port série sur cette carte qui se concluaient en suggérant de basculer sur le port série 2. Je n’ai trouvé nulle part que ce problème avait été réparé par une version de BIOS ultérieure et, plutôt que de risquer de perdre mon temps, j’ai travaillé sur le port série 2 . Le travail avec le modem s’est alors passé sans encombre : J’ai pu appeler un numéro depuis la Soekris (avec l’utilitaire microcom, minicom n’est pas disponible sur DSL). L’appel de la Soekris depuis un pc de bureau s’est également passé sans problème. Je vais décrire l’étape suivante qui consiste à faire attribuer une adresse IP par le pc Soekris à l’appelant, pour pouvoir revenir à une communication sur IP bien plus souple qu’une connexion série simple.
Pour ceux qui n’ont pas l’habitude des fournitures électroniques, il est très facile de « sortir » le port série 2 en utilisant un connecteur DB9 fait pour aller sur une nappe. De l’autre côté, il faut un connecteur HE-10 femelle. On prend une nappe dont on garde 10 conducteurs. On essaie de ne pas se tromper de côté quand on écarte le dixième conducteur afin de pouvoir sertir la DB9, et le tour est joué.
Pour activer mon « serveur » ppp [6], je vais rajouter, dans bootlocal.sh
la ligne
pppd /dev/ttyS1 9600 file /opt/ppp/options &
et dans ce fichier /opt/ppp/options
j’ai indiqué :
# ppp server options on /dev/ttyS1
noauth
login
lock
-detach
192.168.3.1:192.168.3.2
asyncmap 0
netmask 255.255.255.0
proxyarp
crtscts
modem
persist
logfile /home/dsl/tmp/ppp.log
debug
Je ne vais pas tout détailler. Les points intéressants sont :
je ne veux pas d’authentification mais je veux un login conforme au fichier /etc/password
le pc Soekris aura l’IP 192.168.3.1 et son client la suivante
la liaison ppp se fait au travers d’un modem
pppd se remet en attente d’une demande de connexion à la fin d’une connexion
je veux un fichier log dans un répertoire persistant que j’ai créé sous mon home.
Bien que ne souhaitant pas d’authentification au niveau ppp, il faut créer les fichiers /opt/ppp/chap-secrets
et /opt/ppp/pap-secrets
qui contiennent simplement
#client server secret IP
"" * "" -
qui se traduit par « n’importe qui se connecte avec n’importe quel mot de passe ».
J’ai eu plus de mal côté client. Je n’ai réussi à me connecter (et à être sà »r de ma configuration ppp côté Soekris) qu’après avoir découvert, sur Ubuntu, l’utilitaire pon
(et poff
pour couper la communication). Je ne peux pas dire que j’ai beaucoup cherché à comprendre cet habillage de pppd apparemment destiné à gérer des connexions vers des fournisseurs d’accès. Je me suis contenté de recopier le fichier /etc/ppp/peers/provider
proposé par Ubuntu en /etc/ppp/peers/dsl
, dans lequel j’ai modifié le numéro de téléphone et le débit (9600 pour reprendre ce que j’avais côté Soekris), et un
pon dsl
a suffit à faire apparaître une connexion réseau supplémentaire en 192.168.3.2. Un ssh dsl@192.168.3.1
m’a alors permis de me connecter sur mon système d’exploitation Damn Small Linux !
[1] J’aurais pu choisir une CF de plus grande capacité et créer une partition de swap (mkswap /dev/hde3; swapon /dev/hde3
). Pour démontrer la robustesse du principe, je me suis volontairement limité.
[2] sous-entend que le système va demander à l’utilisateur de taper sur une touche du clavier pour terminer l’arrêt et éventuellement redémarrer, ce qui n’est pas compatible avec nos applications.
[3] Selon les versions DSL, le remplissage de hde2 est plus ou moins effectué. Il peut être prudent de n’indiquer que opt sur hde2 et de créer ce répertoire immédiatement après cette installation frugale si ce n’est pas fait automatiquement :
mount /dev/hde2
cd /mnt/hde2
sudo mkdir opt
sudo cp /opt/bootlocal.sh opt/
sudo chmod -R g+ws opt
sudo chown -R dsl.staff opt
[4] J’ai eu beaucoup de problèmes avec la qualité des CF. J’ai travaillé sur des CF « recyclées » sur lesquelles, sans doute, des secteurs défectueux empêchaient cette procédure de se dérouler correctement. Un indice de l’existence de ce problème est qu’il n’y a pas moyen de monter la partition système pour accéder aux fichiers Grub.
[5] En jouant beaucoup sur la vitesse du port série, j’ai obtenu une fois l’affichage de « AT » à cet instant. Lors de l’exploration des périphériques, Damn Small Linux vérifie s’il y a un modem au bout du port série !
[6] le terme de serveur est impropre car chacun des deux acteurs de la communication série va devoir lancer pppd. Ils ont des rôles équivalents. Mais nous allons dire à l’un de prendre l’adresse IP qui lui sera proposée, à l’autre d’en proposer une.