(14/06/2009) La Bifferboard

Dans le style achat compulsif, j'ai récemment acheté une Bifferboard. Il s'agit en fait d'un mini-ordinateur / ordinateur embarqué de type x86. Plus exactement, il s'agit d'un 486SX à 150Mhz (ah les 486, c'était la bonne époque ...). Le principal intérêt de cet ordinateur réside dans sa consommation d'environ 1W, son port ethernet 100Mbits ainsi que de son port USB 2.0. Dans le cas présent, Ça contraste pas mal avec mon nouveau Core i7, ses 6Go de ram, ses 4 disques durs, ses deux cartes Nvidia, et ... son alimentation de 1KW. Son autre gros avantage, c'est son prix: Tout juste une 50ène d'euros, frais de ports compris.

Pour l'instant, je m'en sers pour avoir un ordinateur me permettant de réveiller mon monstre de consommation électrique à distance. Mais étant donnée la présence de GPIOs, il n'est pas exclu que je m'en serve dans d'autres futurs projets complètement farfelus.

Fonctionnement de base

la carte cpu de la bifferboard
Zoom

La carte bifferboard a une flash de 1Mo et 32Mo de RAM. Sur la flash, on trouve le Bios (BiffBoot) ainsi qu'un noyau Linux (2.6.27.5 dans mon cas) configuré pour booter sur /dev/sda1. Le site met à disposition un firmware à mettre sur clef USB. La première question qui m'est venu à l'esprit fût donc "et qu'est-ce qu'il se passe si je lui colle une Debian dans les pattes ?". Sans grande surprise, ça marche, mais ça demande un peu de bricolage.

Le firmware BifferOS

Pour générer le firmware officiel et le mettre sur une clef USB, je vous renvoi sur le README qui est fourni avec les sources.

Si comme moi vous voulez utilisez la BifferBoard sans cable série, pensez à suivre les instructions sur le wiki. Sinon vous allez passer 1h à vous demandez pourquoi la bestiole répond pas.

Une fois que vous avez un firmware sur votre clef USB (autrement dit, un rootfs ext3 sur votre clef), l'étape suivante consiste à le tester. Si comme moi vous n'avez pas de cable série, Qemu se révèle idéal pour répondre aux questions du genre "mais bon sang, pourquoi ça boot pas ?".

Tester son rootfs sur clef USB dans un Qemu

Le site indique brièvement comment simuler une BifferBoard dans Qemu, mais ils omettent les instructions exactes pour faire un noyau avec le support UHCI et NE2K\_PCI. En effet, Qemu simule un bus USB UHCI alors que la bifferboard fournit de l'OHCI. Même problème pour le réseau. Donc pour booter le noyau bifferboard dans Qemu, il faut lui ajouter le support pour ces deux trucs.

En très bref:

$ cd ~/tmp
$ wget http://bifferos.planetlee.eu/bifferboard/bb-src-1.4.tar.bz2
$ tar -xvjf bb-src-1.4.tar.bz2
$ cd bb-src-1.4
$ make -j8 # core i7 powerz !
# premier build qui va notamment telecharger tout le bouzin openwrt
$ make kernel_menuconfig
[activer le support UHCI (en dur obligatoirement)]
[activer le support pour la ne2k_pci (en dur, sinon vous allez en chier)]
$ make -j8 remake V=99

À partir de là, vous devriez avoir le noyau qui va bien dans ./openwrt/bin/openwrt-bifferboard.bzImage. Il faut ensuite simplement suivre les instructions sur le site pour merger le noyau avec le bios et lancer Qemu avec l'incantation qui-va-bien. Pensez à lancer Qemu en root, sinon vous risquez d'avoir des problèmes pour accèder à la clef USB.

la bifferboard dans sa boite
La bifferboard dans sa boite en plastique

Debian sur une BifferBoard

Habituellement, je serais le premier à râler sur le fait que les paquets Debian soient compilés pour i386 et soient donc complètement sous-optimisés pour les systèmes modernes. Mais pour une fois, je suis bien content que ce soit le cas ^^

Ce qu'il faut faire:

À partir de là, démontez votre clef et testez-là dans un Qemu pour voir ce qui casse. Si ça boot comme prévu, vous pouvez la brancher sur votre Bifferboard. Ça va mettre un bon petit moment à booter (surtout si vous avez arrêté votre Qemu comme un sauvage), mais après ca devrait tourner comme un charme. Enjoy :-)

Optionnellement, je vous suggère de mettre le /tmp, /var/run, /var/log sur des tmpfs pour ne pas trop solliciter votre clef USB. Pour le /etc/fstab, ca donne ça:

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/sda1	/		ext3	defaults,errors=remount-ro	0	1
tmpfs		/tmp		tmpfs	defaults,size=64k 0 	0
tmpfs		/var/log	tmpfs	defaults,size=1m	0	0
tmpfs		/var/run	tmpfs	defaults,size=128k	0	0

avec un script /etc/rc2.d/S01mnt en plus:

#!/bin/sh
touch /var/log/dmesg
mkdir /var/log/apt
mkdir /var/run/network

# Si lighttpd:
mkdir /var/log/lighttpd
mkdir /var/run/lighttpd
chown -R www-data:www-data /var/log/lighttpd

# Si dbus
mkdir /var/run/dbus

# Si sudo
mkdir /var/run/sudo