Julien De Bona
Free Software, Cooking, and Everything


Cross-compilation et installation d'un système embarqué

Publié le 2007-02-25.

Après avoir mis au point la chaîne de cross-compilation, il est temps de l'utiliser pour installer un système Linux sur la Soekris en restant dans les contraintes suivantes:

  • Le système est entièrement cross-compilé, sans faire appel à la plate-forme de destination, notamment sous la forme d'un émulateur
  • Le système s'installe sans extraire la carte Flash, car ça ne peut pas être fait sur tous les modèles

La procédure en bref

Dans un premier temps, on va construire un système pouvant être démarré via PXE avec un kernel avec auto-configuration via DHCP et le support de root over NFS. Ce système contiendra aussi de quoi réaliser l'installation sur la Soekris: util-linux (qui contient fdisk), e2fsprogs (pour mke2fs), lilo et bien sûr de quoi les faire tourner: Linux et BusyBox.

Compilation des systèmes

Compilation de BusyBox

J'ai récupéré la version 1.2.2.1 depuis http://www.busybox.net. Extraire l'archive et aller dans le répertoire ainsi créé. Y taper make menuconfig. Aller dans "Busybox Settings". Dans Build Options cocher "Do you want to build BusyBox with a Cross Compiler" et mettre /home/julien/cross/bin/i386-linux-uclibc- à "Cross Compiler prefix". Dans "General Configuration", cocher "Use the devpts filesystem" Puis revenir à la racine de l'outil de configuration et activer ou désactiver les fonctions désirés ou non. BusyBox contient des outils pour les filesystems ext2, mais ils sont en train d'être retirés. Quitter l'outil, enregistrer la configuration, puis taper make; make install. Un répertoire _install (configurable dans le menuconfig) est créé et contient une ébauche du sysème de fichiers qu'on installera. On peut copier ce répertoire ailleurs pour ne pas l'écraser lors d'une autre compilation.

LILO

Le système aura besoin d'un bootloader. LILO a l'avantage d'être le plus simple, et donc le plus léger. Il est en outre le premier à bien avoir voulu se laisser cross-compiler, bien que son makefile ne soit pas prévu pour.

Procédure

Télécharger lilo depuis http://lilo.go.dyndns.org et extraire le contenu de l'archive (j'ai utilisé la version 22.7.3). Ensuite, éditer le Makefile: spécifier le cross compilateur ligne 109 (CC=/home/julien/cross/bin/i386-linux-uclibc-gcc). Dans les cibles version et mkloader (lignes 479-482), changer le compilateur à utiliser: remplacer $(CC) par le compilateur du système hôte (pas le cross-compilateur: ces binaire vont être utilisés seulement pour réaliser le build.

Ensuite, lancer la compilation avec make all, et on obtient un exécutable lilo lié avec uClibc.

Util-Linux

Util-Linux contient fdisk. Un fdisk est inclus dans busybox, mais je ne m'en suis pas rendu compte assez vite. Si c'est un élément parmi l'un ou l'autre qui diffère entre le BusyBox de l'installeur et celui du système, alors on peut le compiler à part. Pour ma part, je suis plus rassuré avec le fdisk que j'ai toujours connu. Voici donc la marche à suivre (testé ave la version 2.12r).

  • Télécharger util-linux sur kernel.org
  • Décompresser l'archive, puis aller dans le répertoire ainsi creéé.
  • Editer MCONFIG; à la ligne CPU=..., mettre CPU=i386
  • Mettre dans l'environnement une variable CC contenant le chemin complet vers le cross-compilateur
  • Configurer avec ./configure
  • Aller dans le répertoire fdisk et taper make)
  • récupérer le binaire fdisk généré pour l'installer plus tard dans le système d'installation.

e2fsprogs

Ici, je suis intéressé par mke2fs, qui permettra de créer le filesystem sur la CompactFlash de la Soekris. La version que j'ai utilisée est la 1.39.

  • Télécharger l'archive depuis http://e2fsprogs.sourceforge.net.
  • Extraire l'archive.
  • Créer un répertoire et s'y positionner (ex: mkdir build; cd build
  • Mettre dans l'environnement une variable CC contenant le chemin complet vers
  • Lancer la configuration avec ../e2fsprogs-1.3.39/configure --host=i386-linux-uclibc
  • Compiler avec make.
  • Récupérer le binaire mke2fs, qui se trouve dans le sous-répertoire misc.

Préparation du système d'installation

En attendant de refaire la procédure plus complètement, en voilà les grandes lignes.

Filesystem de base

Voir au chapitre à propos de BusyBox, et récupérer celui qui a été généré.

Il faut aussi s'assurer de disposer de quelques autres choses:

  • Des répertoires /dev et /proc
  • Un fichier de configuration pour init (/etc/inittab)

Installation d'uClibc

Dans le répertoire d'installation de la chaîne de cross-compilation, récupérer les bibliothèques partagées d'uClibc et les copier dans répertoire lib du filesystem que l'on est en train de créer. Y créer aussi un lien ld-linux.so.2 vers ld-uClibc-0.9.28.so afin que le système puisse charger les bibliothèques partagées (j'ai trouvé la valeur en lançant la commande strings sur un exécutable compilé avec mon cross-compilateur. Y ajouter aussi un répertoire proc et peupler un répertoire dev avec le nécessaire. Créer aussi un lien libm.so.2 vers libm-X.Y.Z.so.

Les autres outils

Placer dans le filesystem les binaires annexes (ici: mke2fs, lilo et un fichier de configuration et fdisk, ainsi que ce qui devra être installé: un système de base (pour faire simple, on peut réutiliser le système qu'on est en train de construire), et un kernel.

L'installation en bref

Démarrer ce système via PXE, s'y connecter sur le port série. Partitionner la carte Flash, y créer un filesystem, y copier le système et lancer lilo. Puis redémarrer la Soekris sur sa carte Flash.


tags: linux, embarque, soekris

Quelques tags ...