Après Android, nous allons tester une autre distribution orientée pour le monde de l'embarqué, Angstrom!
L'utilisation d'OpenEmbedded et de BitBake n'aura plus de secrets pour vous ;)




Angstrom est une distribution intéressante. Elle est légère, peut gourmande en ram et relativement simple à mettre en place. Si nous devions lui trouver un défaut, je ne pourrais en citer qu'un : le temps de construction de l'image rootfs extrêmement longue... Mais bon, après c'est le PC qui travaille, ce n'est donc pas vraiment un défaut^^.

Au niveau des informations sur cette distribution, il n'y en a pas beaucoup... Depuis peu, Archos s’intéresse à cette distribution pour ses tablettes, il est donc possible que les informations fleurissent petit à petit.
C'est un projet issu du regroupement de plusieurs autres projets : OpenZaurus, OpenEmbedded et OpenSimpad.

Voila pour les présentations. Je vous laisse le lien du site officiel : http://www.angstrom-distribution.org/.

Cet article fait appel à des notions vues dans les articles précédents. J'ai essayé de détailler au maximum, cependant certaines informations peuvent ne pas être ré-expliquées. Dans ce cas je vous conseil d’aller faire un petit tour dans la rubrique ARM ;)






Informations sur la construction d'Angstrom


La construction de cette distribution se fait à l'aide de deux outils :
  • OpenEmbedded : c'est un regroupement de composants libre pouvant être utilisés pour un système embarqué. Une sorte de grosse bibliothèque de l'embarquée :)
  • BitBake : c'est un exécuteur de tâches et un gestionnaire de metadata. Il permet de construire des packages en gérant les dépendances, la cross-compilation,... En gros, c'est le make pour OpenEmbedded (vulgarisation pour simplifier les choses).
Nous allons uniquement interagir avec ces deux outils, ce qui rend la construction simple.





Préparation de notre environnement de travail


Avant de commencer, nous devons installer quelques packages :
$ apt-get install diffstat texi2html git cvs subversion gawk chrpath gcc g++ python-psyco

Ensuite on se place dans notre dossier de travail habituel :
$ cd /srv/nfs/angstrom/image-base/igep020/





Installation des outils

  • Installation de BitBake

    - Téléchargement de BitBake : bitbake-1.10.1.tar.gz (lien serveur).
    - On créer nos dossiers de travail :
    // Création de dossiers
    $ mkdir -p build/conf
    $ mkdir -p bibake
    - On décompresse BitBake dans bitbake/
    $ tar xfvz bitbake-1.10.1.tar.gz -C bitbake/

  • Installation d'OpenEmbedded

    - On télécharge OpenEmbedded :
    $ git clone git://git.openembedded.org/openembedded
    Voila, c'est tout^^

  • Configuration pour la construction d'images/packages

    - On doit créer un fichier de configuration pour spécifier à Bitbake notre cible.
    Pour cela, suivez les étapes suivantes :
    // Copie du fichier de configuration de base :
    $ cp openembedded/conf/local.conf.sample build/conf/local.conf

    // Edition du fichier de configuration
    $ nano build/conf/local.conf

    //Modifiez les lignes suivantes
    - DL_DIR = "/srv/nfs/angstrom/image-base/igep020/sources"
    - BBFILES = "/srv/nfs/angstrom/image-base/igep020/openembedded/recipes/*/*.bb"
    - MACHINE = "igep0020"
    - DISTRO = "angstrom-2008.1"
    - Commentez la dernière ligne

    Quelques petites explications sur ces modifications.

    Dernière chose, on configure les variables d'environnements :
    // Nos variables habituelles pour la cross-compilation
    $ export ARCH=arm
    $ export CROSS_COMPILE=/opt/codesourcery/bin/arm-none-linux-gnueabi-
    $ export PATH=/opt/codesourcery/bin/:$PATH

    // Variables pour BitBake
    $ export BBPATH=$/nfs/angstrom/image-base/igep020/stuff/angstrom-setup-scripts/build:/nfs/angstrom/image-base/igep020/stuff/angstrom-setup-scripts/sources/openembedded
    $ export PATH=/nfs/angstrom/image-base/igep020/stuff/angstrom-setup-scripts/sources/bitbake/bin:$PATH
    Pensez bien à les configurer à chaque nouvelle session.

    Comme nos variables commencent à devenir longue à taper, je vous conseil de créer un fichier qui permettra de les charger rapidement. Pour cela créer un fichier .vars_bashrc où vous souhaitez (le nom n'a pas d'importance), mettez toutes les variables d'environnement que vous souhaitez dedans.
    Pour le charger (pour la session), tapez la commande suivante :
    $ source .vars_bashrc
Voila, nous avons tous nos outils d'installés et configurés pour notre igep!
Pensez bien à mettre à jour BitBake et OpenEmbedded de temps en temps (je vous rappel qu'avec git, pour mettre à jour, vous devez faire un git pull).




Construction d'images/packages


Pour avoir la fameuse rootfs d'Angstrom, nous allons construire l'image à l'aide des outils précédements installés. Vous allez voir, c'est un jeu d'enfant :)

Nous allons commencer par construire une image de base d'Angstrom (très légère, mais "console" uniquement). Pour cela, tapez la commande suivante dans votre terminal :
$ MACHINE=igep0020 bitbake base-image

ATTENTION : La construction m'a pris environ 24h! Durant tout ce temps, le PC doit resté connecté à internet! Sachez le, le moindre package peut prendre plusieurs heures de construction! (exemple : nano = 9h).

Si vous souhaitez construire une image avec une interface, tapez ceci :
$ MACHINE=igep0020 bitbake x11-image

En gros vous devez saisir < nom_image_souhaitee >-image ou alors uniquement < package >.
Voila, il n'y a rien de plus à savoir pour la construction :)





Test de la rootfs Angstrom


La première chose à faire et à ne surtout pas oublier, c'est la configuration réseau du PC, du montage nfs, du serveur tftp et d'u-boot.

Pour ce qui est du PC : (en root)
$ ifconfig eth0 192.168.254.10 netmask 255.255.255.0

Pour le NFS ajoutez simplement les lignes suivantes au fichier /etc/exports :
# Angstrom image-base
/srv/nfs/angstrom/image-base/igep020/rootfs/ 192.168.254.254(rw,no_root_squash,no_subtree_check,sync)
Il n'est pas utile de supprimer les autres lignes ;).

On pense à relancer le serveur :
$ /etc/init.d/nfs-kernel-server restart

Pour le tftp, rien à faire. Pensez juste à mettre votre uImage (celle que vous avez utilisé pour BusyBox par exemple) dans le dossier :
/srv/tftp/angstrom/base-image/igep020/kernel/.

Pour uboot, lancez putty, allumez la carte et entrez dans le menu de config u-boot. Vérifiez ensuite les variables suivantes :
nfs-boot=if ping ${serverip}; then run nfs-bootargs; tftp 0x80000000 ${distro}/${project}/${machine}/kernel/uImage; bootm; fi;

nfs-bootargs=setenv bootargs ${bootargs-base} init=/init root=/dev/nfs nfsroot=${serverip}:/srv/nfs/${distro}/${project}/${machine}/rootfs ; run addip

Si vous n'avez pas ces valeurs, je vous rappel la commande pour les modifier :
$ setenv nfs-boot 'if ping ${serverip}; then run nfs-bootargs; tftp 0x80000000 ${distro}/${project}/${machine}/kernel/uImage; bootm; fi;'

$ setenv nfs-bootargs 'setenv bootargs ${bootargs-base} init=/init root=/dev/nfs nfsroot=${serverip}:/srv/nfs/${distro}/${project}/${machine}/rootfs ; run addip'

Voila! Tout est ok! Maintenant vous relancez la carte (par l'alimentation ou par un petit run bootcmd dans u-boot).

Si vous avez compilé une image de base, vous obtenez ceci :

(Comment ça mon image est floue? et pas centrée? et bien...oui^^)

Si vous avez compilé une image x11, vous obtenez ceci :



Nous avons terminé! Au cours de cet article, vous avez pu remarquer l'avantage majeur de cette distribution : sur quelques Mo vous avez une rootfs avec une interface graphique ultra légère! C'est une très bonne base de travail ;)
Pour la rootfs "console" par contre le gain est beaucoup moins important. En effet, environ 24h de construction est peut être beaucoup pour un simple rootfs... Après c'est intéressant de savoir que cela existe.

Si vous avez des questions, remarques ou autres, les com' ci-dessous sont là pour ça.