Welcome Sheevaplug (part 2):

Après les présentations (voir l'article précédent), il est temps de passer à la pratique: installer une distribution Debian dessus. Le processus n'est pas vraiment compliqué une fois qu'on a toutes les cartes en main. Globalement, c'est possible de le faire en 2H ou 3H à condition de savoir ce qu'on fait... Les instructions ci-dessous vous seront très utiles.

Etape 1: Bien comprendre la séquence de boot :

Hé oui, toutes ces petites machines exotiques avec des CPU autres qu'Intel n'ont généralement pas de BIOS. Du coup, la séquence de boot est toujours différente de ce à quoi les utilisateurs de PC classiques sont habitués. Et cette différence fait qu'il faut vraiment prendre la peine de comprendre tous les mécanismes qui sont sollicités. Voici donc le processus de boot tel que je l'ai compris:

  1. Au démarrage de la machine, la ROM du processeur Kirkwood initialise la RAM (DDR).
  2. Cette initialisation se fait en copiant une partie du contenu de la mémoire FLASH (NAND) dans la RAM.
  3. Les éléments copiés correspondent à l'image de U-Boot, le bootloader de cette machine.
  4. L'image de U-Boot est généralement située tout au début de la NAND (page 1 offset 0).
  5. Une fois l'image de U-Boot copiée en mémoire vive (la RAM), le processeur se branche à cet endroit et lance l'exécution du binaire.
  6. U-Boot se lance, récupère sa configuration (écrite sur la mémoire FLASH) et effectue une série de tests.
  7. Ensuite U-Boot tente de booter le système d'exploitation tel qu'indiqué dans sa configuration.
  8. En cas d'échec, il donne la main: un prompt qui permet pas mal de commandes.

Il ressort de cette séquence de boot que: - la mémoire Flash joue le rôle de mémoire CMOS pour le BIOS. - U-Boot est directement intégré dans la Flash. Mettre à jour U-Boot revient donc à écrire dans un endroit particulier de la mémoire FLASH. - U-Boot est un programme complet: il sait lire et écrire depuis de nombreux périphériques, aller sur un réseau IP, faire des tests, gérer la console, etc...

Pour plus d'informations, vous pouvez consulter le SheevaPlug DevKit Reference Design 1.1 (page 18).

Etape 2: un peu de méthode:

D'abord, avant d'installer une distribution GNU/Linux (Debian en l'occurence), il faut vérifier si la plateforme est supportée. Dans notre cas, le CPU est un Kirkwood de chez Marvell cadencé à 1,2 Ghz et qui est compatible ARM. Debian supporte énormément de plateformes. Ainsi, pour les ARM, il existe un port officiel. Toutefois, il y a ARM et ARM. En effet, il existe 2 'ABI sur cette plateforme, l'ancienne qui fonctionne pour les anciens CPU ARM et la nouvelle EABI (Embeded ABI). Sur la distribution Debian, arm est réservé pour l'ancienne ABI et armel désigne la nouvelle ABI de la plateforme ARM. Le CPU Marvell Kirkwood utilise la branche armel de la plateforme ARM sous Debian. Il est donc supporté et c'est une excellente nouvelle (en fait, je n'aurais pas acheté cette machine si ce n'était pas le cas ;-)).

Ensuite, quelle version de Debian installer ? Stable (Lenny), ou Squeeze (unstable) ? Ma préférence va vers Squeeze qui est sensiblement plus récente que Lenny mais qui n'est pas encore gelée (freeze). Ce sera donc Squeeze.

Sur quoi installer l'OS ? Globalement, pour installer un OS, il est nécéssaire de disposer d'un périphérique de masse: un truc qui permet de stocker des octets. GNU/Linux supporte pas mal de choses de ce côté là. Matériellement, le SheevaPlug dispose de 3 périphériques de masses:

  • La mémoire flash interne (NAND).
  • un port USB (donc toutes les clefs USB et disques dur USB qui vont bien).
  • un lecteur de cartes SD.

On peut donc utiliser ces trois supports d'OS. Toutefois, installer Squeeze en ce moment suppose de fréquentes mises à jour et un support plus faible de la sécurité. Qui dit mise à jour fréquentes implique de nombreuses opérations de lecture/écriture. Ce qui n'est pas très bon pour la mémoire Flash, surtout lorsque celle-ci est intégrée dans une carte-mère comme dans le cas de notre Sheevaplug ! Du coup, il faut installer l'OS sur autre chose que la mémoire flash NAND. Une simple clef USB fera bien l'affaire. Quand stable s'appellera Squeeze, il sera bon de procéder à l'installation sur la mémoire Flash. Pour terminer sur ce point, mieux vaut épargner la mémoire flash interne d'installations non maîtrisées qui écraseraient quelquechose de sensible (genre le bootloader !).

En plus de ces prévisions, il nous faut un moyen de lancer l'installeur Debian. Premier constat: utiliser un CD d'installation ne va pas fonctionner !!! On doit donc se rabattre vers d'autres solutions. Sur ce plugcomputer, on utilise le bootloader U-Boot qui est assez extraordinaire. En effet, il est capable de booter sur les éléments suivants:

  • une clef USB (mais il faut que ce soit un bon modèle)
  • le lecteur de cartes SD
  • Un serveur TFTP

On verra plus tard que la méthode par serveur TFTP se révèle la plus adaptée à ma configuration fortement marquée par l'absence d'un grand câble réseau !

Une fois ces éléments balayés, quel est l'objectif de cette installation ? l est très simple: monter un serveur maison qui prendra en charge les éléments suivants:

  • serveur Web pour héberger mon blog.
  • serveur DHCP pour gérer les demandes de connexion.
  • serveur de noms local
  • accès administratif à distance (avec openSSH).

Maintenant que toutes les questions ont une réponse (c'est la partie dites de spécification), il est temps de mettre les mains dans le cambouis (c'est ça le meilleur).

Etape 3: Merci Martin Michlmayr !

Ce développeur Debian, spécialiste de l'architecture armel a déjà fait l'essentiel du travail d'empaquetage pour générer un installeur Debian pour testing (Squeeze) à placer sur un périphérique de masse. Autant réutiliser ce travail non ? Voici la page d'information.

Vous aurez juste besoin de 2 fichiers: uInitrd et uImage. Pour l'instant, je ne désire pas upgrader u-boot car si la mise à jour plante: je peux dire adieu au serveur... Donc, tant que ça n'est pas indispensable, je ne le fais pas. Peut-être y en aura-t-il besoin pour gérer les problèmes de boot sur USB ? On verra à la fin !

Etape 4: connexion par la console JTAG

A peine on commence que c'est déjà du nouveau. Le sheevaplug possède une connexion mini-USB qui est en fait une sortie JTAG (JTAG est une norme pour les ports de sortie destinés aux tests et aux envois d'informations simples). Cette sortie permet de récupérer le signal d'une sortie série. Cette sortie série par défaut envoie des informations de la même manière qu'une console texte série (que les moins de 20 ans n'ont pas connue) ! Pour résumer, cette connexion JTAG permet de récupérer via USB la console série. Cette console permet de se connecter directement sur la machine. C'est par cette voie que nous allons voir ce que nous faisons.

Attention, veillez à utiliser le câble fourni avec le SheevaPlug: ce n'est pas un câble mini-USB comme les autres !

Une fois le câble branché, le kernel linux de votre machine qui va servir à installer le sheevaplug détecte la console série (chargement des modules adéquats) et ouvre un périphérique pseudo terminal: /dev/ttyUSB0. Pour s'y connecter, on peut utiliser screen:

screen /dev/ttyUSB0 115200

115200 précise la vitesse du transfert série et c'est généralement celle qui est utilisée par défaut sur le Sheevaplug.

Etape 5: Préparer le terrain

La première chose dont j'ai besoin, c'est de faire en sorte que la machine sur laquelle je peux connecter la console série/USB du plugcomputer fasse également passerelle NAT. Hé oui, je ne sais pas comment c'est foutu chez vous mais, de mon côté, je n'ai pas de câble assez long entre le plug computer et le routeur ethernet de la maison. Du coup, je profite d'avoir une interface Wifi sur l'EeeBox qui dispose également d'une connexion Ethernet pour en faire une passerelle.

5.1. Configuration réseau de l'EeeBox

C'est assez simple:

iface eth0 inet static
      address 192.168.1.1
      netmask 255.255.255.0
      network 192.168.1.0
      broadcast 192.168.1.255

5.2. Transformer l'EeeBox en passerelle NAT

Je me suis complètement inspiré de cet article de Debian-administration:

#!/bin/sh

PATH=/usr/sbin:/sbin:/bin:/usr/bin

#
# delete all existing rules.
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Always accept loopback traffic
iptables -A INPUT -i lo -j ACCEPT


# Allow established connections, and those not coming from the outside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! ra0 -j ACCEPT
iptables -A FORWARD -i ra0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the LAN side.
iptables -A FORWARD -i eth0 -o ra0 -j ACCEPT

# Masquerade.
iptables -t nat -A POSTROUTING -o ra0 -j MASQUERADE

# Don't forward from the outside to the inside.
iptables -A FORWARD -i ra0 -o ra0 -j REJECT

# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward

C'est peut être pas le summum en terme de règles iptables mais ça marche et c'est juste pour effectuer une installation...

5.3. Monter en quelques minutes un serveur TFTP

Sur le serveur (la EeeBox ou autre chose d'atteignable par Wifi), vous pouvez configurer un serveur TFTP pour balancer les fichiers au plugcomputer.

aptitude -R install tftpd-hpa permet d'installer le serveur (le -R permet d'éviter l'installation de inetd que je ne veux pas du tout sur cette machine !).

Ensuite, il faut mettre à "yes" la valeur de la variable RUN_DAEMON du fichier /etc/default/tftpd-hpa. Copier les fichiers dont vous avez besoin dans /var/lib/tftpboot (uImage et uInitrd ou l'image de U-Boot dont vous avez besoin).

C'est prêt...

Ah non, il faut lancer le serveur: /etc/init.d/tftpd-hpa start !

5.4. Configuration réseau de U-Boot sur le plugcomputer

Maintenant, occupons-nous du Sheevaplug. Démarrez la machine et connectez-y votre câble JTAG mini-USB. Ensuite, connectez-vous sur le sheevaplug. Si l'OS par défaut est déjà lancé, vous devrez rebooter et interrompre la séquence de boot lorsque U-Boot vous le proposera. Ensuite, vous pourrez rentrer les séquences de commandes suivantes:

setenv ipaddr 192.168.1.5
setenv netmask 255.255.255.0
setenv gatewayip 192.168.1.1
setenv serverip 192.168.1.1
saveenv

Ces commandes permettent de régler la pile IP de la machine et de définir l'adresse de votre serveur TFTP (192.168.1.1).

5.5. Chargement des fichiers et lancement de l'installeur Debian

Pour le coup, les instructions de Martin MichlMayr fonctionnent ;-):

tftpboot 0x0800000 uInitrd
tftpboot 0x400000 uImage

setenv bootargs console=ttyS0,115200n8 base-installer/initramfs-tools/driver-policy=most
bootm 0x400000 0x0800000

6. Faire joujou avec l'installeur

Globalement, c'est une installation classique et il n'y a pas de changement comparé à d'habitude. Vous aurez besoin de configurer le réseau manuellement (pas la peine d'installer un serveur DHCP à votre passerelle, ça prendrait plus de temps).

Parfois, l'installeur Debian plante sur l'étape de création des partitions. Il affiche un mesage d'erreur assez peu explicite qui indique que le kernel n'a pas pu avoir accès à une partition. Du coup, on ne peut pas continuer. Dans ce cas, le plus simple est de redémarrer la machine et de relancer le processus d'installation. Dans mon cas, ça a très bien marché. Si ça continue à planter, le plus simple reste de partitionner votre clef USB sur une autre machine et de formatter dans le bon système de fichier les partitions. Ensuite, dans l'installeur, lorsque vous aurez à utiliser le partitionnement, le bug n'aura aucun effet car il ne sera pas nécéssaire de faire quoi que ce soit sur le périphérique de masse.

7. Indiquer à U-Boot comment booter

Une fois que le système d'exploitation est installé sur le périphérique de masse de votre choix, il faut pouvoir le démarrer lors du boot. Ce n'est pas Grub ou Lilo qui sont utilisés mais U-Boot qui n'est pas géré par la distribution mais directement par vous même. Booter l'OS signifie donc que vous avez configuré U-Boot pour le faire. C'est généralement assez simple.

Dans le cas de notre clef USB, on commence par modifier quelques variables qui contiennent les commandes utiles pour booter. Ensuite, il est indispensable de les sauvegarder dans l'espace de la mémoire FLASH dédié par la commande saveenv sinon, vous seriez obligé de les retapper à chaque boot.

setenv bootargs_console console=ttyS0,115200
setenv bootcmd_usb 'usb start; ext2load usb 0:1 0x0800000 /boot/uInitrd; ext2load usb 0:1 0x400000 /boot/uImage'
setenv bootcmd 'setenv bootargs $(bootargs_console); run bootcmd_usb; bootm 0x400000 0x0800000'
saveenv

run bootcmd

A noter que les noms des fichiers à charger peuvent changer selon les partitions que vous avez installées: l'exemple ci dessus correspond au fait qu'il n'y a pas de partition réservée pour /boot. Ainsi, il est indispensable d'indiquer le chemin complet du fichier (/boot/uInitrd par exemple) dans la partition 1 (usb 0:1). Si vous avez utilisé une partition pour /boot, la partition numéro 1 du périphérique usb contient le contenu de /boot. Le nom du fichier sur la partition ne contient donc pas le répertoire boot.

En règle générale, ça boote sur la clef USB du premier coup, sans avoir besoin de mettre à jour U-Boot (v3.2.16).

8. Précisions pour une installation sur carte SD ou MMC

Il est légitime de vouloir installer le système sur une carte mémoire SD. En effet, il semble que les opérations de lecture/écriture soient plus rapide que sur le port USB. Ensuite, ça laisse le port USB du sheevaplug libre pour tout branchement d'un autre périphérique (genre un disque dur USB avec une grande capacité). Les opérations d'installation sont identiques à celles que j'ai présentées au dessus.

Pour le boot, les instructions sont proches:

setenv bootargs_console console=ttyS0,115200
setenv bootcmd_mmc 'mmcinit; ext2load mmc 0 0x0800000 /boot/uInitrd; ext2load mmc 0 0x400000 /boot/uImage'
setenv bootcmd 'setenv bootargs $(bootargs_console); run bootcmd_mmc; bootm 0x400000 0x0800000'
saveenv

run bootcmd

Conseil pour vous faire gagner un temps précieux ! Si vous voulez booter sur une carte SD, il vous faudra mettre à jour U-Boot mais pas avec n'importe quelle version. La 3.2.19 est déclarée comme pouvant le faire. Il y a également une version patchée de la version 3.2.27 (la dernière officielle) qui permet le boot sur carte SD/MMC. C'est celle que j'utilise !

Pour mettre à jour U-Boot, il suffit de copier le binaire que vous avez téléchargé au niveau de votre serveur TFTP et de lancer la commande suivante sur le Sheevaplug:

bubt u-boot.bin

Marvell>>
**Warning**
If U-Boot Endiannes is going to change (LE->BE or BE->LE),
Then Env parameters should be overridden..
Override Env parameters? (y/n) n

Assurez-vous de répondre n à la question posée: ça remet à zéro la configuration de boot !

9. Conclusion

Vous êtes maintenant en possession d'un bien bel engin: un vrai serveur pas comme les autres qui ne consomme rien ! A ce sujet, cette affirmation se vérifie très facilement: au bout de quelques heures de fonctionnement, si vous mettez la main sur le plugcomputer, vous verrez qu'il n'est pas très chaud.

A vous de faire ce que vous voulez avec sur Internet. La technologie ne prennant pas parti, fâites le bien avec s'il vous plaît (Tor, homeblog, toussa...).