Linux Mag’ – Raspberry Pi from Scratch

Publié par cpb
Nov 30 2012

Gnu/Linux Magazine France 155Dans le nouveau numéro de Gnu/Linux Magazine France (n° 155) se trouvent deux articles que j’ai écrits durant les mois de juillet et août sur la construction d’un système Linux embarqué sur Raspberry Pi en partant de zéro. Comme l’actualité concernant le Raspberry Pi évolue rapidement, voici quelques compléments pour les éléments ayant changé depuis la rédaction.

Conformément à la politique d’édition adoptée par les Éditions Diamond, ces articles seront disponibles dans quelques temps ici sous licence CC-BY-NC-ND.

Construire une chaîne de compilation

Premier article, page 34.

Le numéro du noyau fourni sur https://github.com/raspberrypi/linux n’est plus un 3.1.9, mais un 3.2.27 aujourd’hui, mais cela ne change en rien le principe de compilation, ni le fichier de configuration.

Préparation de la carte micro-SD

Lorsque vous insérerez la carte sur votre système de développement (page 37), si elle est montée automatiquement il est important de la démonter (avec umount) avant d’exécuter fdisk.

 Installation du bootloader

Depuis l’arrivée de la seconde génération de carte Raspberry Pi avec 512 Mo de ram (voir cet article) les fichiers nécessaires pour le bootloader sont un peu différents. Ils sont, bien sûr, disponibles de manière identique sur https://github.com/raspberrypi/firmware.

  • bootcode.bin : sert à l’initialisation du GPU (1ère étape)
  • config.txt : fichier texte (à créer soi-même) pour personnaliser le comportement du GPU. Entre autres, l’option gpu_mem est très utile puisqu’elle permet de répartir la mémoire disponible (256 Mo ou 512 Mo) entre le GPU et le CPU. Par exemple la ligne “gpu_mem=32” affecte 32 Mo de Ram au GPU et le reste au CPU. C’est la seule ligne qui nous concerne dans cet article puisque nous n’utilisons pas de mode graphique.
  • start.elf et fixup.dat : bootloader initialisant le CPU (2ème étape). Si vous n’affectez que 16 Mo ou moins au GPU, les fichiers start_cd.elf et fixup_cd.dat sont utilisés à leurs places (cd signifiant cutdown– élagué).
  • kernel.img : l’image du noyau à démarrer.

Les fichiers nécessaires sur la partition de démarrage sont donc : bootcode.bin, config.txt avec un simple ligne “gpu_mem=32“, start.elf, fixup.dat, ainsi que le noyau compilé précédemment dans l’article.

Console sur le port série

Dans l’encadré page 38, j’expliquais comment accéder aux entrées-sorties RS-232 du Rasberry Pi avec une conversion de niveaux électriques. Ceci n’est plus nécessaire si vous employez un petit adaptateur tout-prêt comme celui décrit dans cet article.

Installation des modules du noyau

Sur la ligne de commande “make ARCH=arm INSTALL_MOD_PATH...” de la page 41, j’ai oublié de préfixer make par sudo pour avoir les droits d’écriture sur la partition Root.

Bibliothèques

Lors de l’installation des bibliothèques sur la cible (page 43) il est utile d’ajouter l’option -a à cp afin que les liens symboliques soient correctement reproduits. En outre sudo est nécessaire pour écrire sur cette partition Root.

Pour en savoir plus

Si vous souhaitez approfondir la création d’un système Linux embarqué pour Raspberry Pi (ou autre plate-forme), je vous propose de vous retrouver en formation “Linux embarqué” chez Logilin.

Suivant :

Précédent :

33 Réponses

  1. Pascal dit :

    Merci beaucoup pour cette série d’articles sur la carte R-PI. J’ai essayé de suivre le tuto pour construire la chaîne de compilation mais je n’ai pas réussi à télécharger le fichier config-linux (page 36). Pouvez-vous vérifier ? Merci.

    • cpb dit :

      Oui, je me suis un peu emmêlés les doigts dans l’URL. J’ai écrit gmlf au lieu de glmf (Gnu Linux Magazine France). Je viens de créer un lien symbolique pour corriger cette erreur, cela doit fonctionner à présent. Désolé et merci de me l’avoir signalée.

      Le lien direct est ici : config-linux

  2. Pascal dit :

    Ça marche ! merci.

  3. Pascal dit :

    Je progresse mais je rencontre un problème lors de la compilation du kernel.
    J’ai les messages d’erreur suivants :

    CC kernel/bounds.s
    cc1: error: unrecognized command line option “-mlittle-endian”
    cc1: error: unrecognized command line option “-mabi=aapcs-linux”
    cc1: error: unrecognized command line option “-mno-thumb-interwork”
    kernel/bounds.c:1: error: bad value (armv5t) for -march= switch
    kernel/bounds.c:1: error: bad value (strongarm) for -mtune= switch

    Qu’est-ce qui ne va pas ?

  4. cpb dit :

    Ce genre de problème se produit généralement lorsqu’on oublie ARCH=arm (ou qu’il y a une erreur d’écriture des majuscules/minuscules) lors d’un “make menuconfig” ou “make”

    Cela se produit aussi quand on rajoute malencontreusement un R final à CROSS_COMPILE

    Il faut reprendre en vérifiant depuis le “make menuconfig” (éventuellement en restaurant le .config).

    • cpb dit :

      Après vérification, je confirme qu’il doit y avoir une erreur dans le libellé de la variable CROSS_COMPILE sur la ligne de commande du second make. Il suffit donc de relancer cette compilation.

  5. Pascal dit :

    En effet, j’avais mis CROSS-COMPILE au lieu de CROSS_COMPILE. Merci pour la piste car malgré mes vérifications, je ne voyais rien. C’est parti pour une looooongue compile … pour l’instant tout roule. Merci encore.

  6. stephane dit :

    Merci pour cette suite d’article très instructive!

    je rencontre toutefois un soucis en suivant les instruction pour compiler busybox.
    rapidement après avoir lancé la compilation j’ai l’erreur “include/platform.h:149:23: erreur fatale: byteswap.h: Aucun fichier ou dossier de ce type” et effectivement quand on regarde dans le dossier include le fichier en question (byteswap.h) n’existe pas.
    J’ai un peu cherché sur le net mais je n’ai rien trouvé qui m’ai aidé, peut etre pouvez vous m’aider?

    Autre chose, la chaine de cross compilation qui à été généré plus tot n’est pas tout à fait la même que celle précisé dans l’article, chez moi c’est “/usr/local/cross-rpi/usr/bin/arm-buildroot-linux-uclibcgnueabi-“. est ce normal? le kernel s’étant apparemment correctement compilé je ne pense pas qu’il y ai un lien mais je préfère le préciser.

    Merci par avance

  7. cpb dit :

    Bonjour,

    En principe le fichier byteswap.h se trouve dans :
    /usr/local/cross-rpi/usr/arm-unknown-linux-uclibcgnueabi/sysroot/usr/include/
    il est donc installé en même temps que la toolchain.
    Il y a peut-être eu un souci de compilation de buildroot. Qu’y a-t-il dans le répertoire indiqué ci-dessus ?

    Pouvez-vous exécuter “/usr/local/cross-rpi/usr/bin/arm-linux-gcc -v” que l’on voit comment gcc est configuré ?

  8. stephane dit :

    Bonsoir,

    Merci pour votre réponse.
    En effet le répertoire en question était vide.
    Sachant donc que ça venait de la compilation de la toolchain je l’ai relancé et ai repéré l’erreur: “error: ‘__LOCALE_DATA_WCctype_II_LEN’ undeclared here (not in a function)”
    erreur que j’ai put résoudre en cherchant sur le net et notamment grâce à ce wiki http://www.armadeus.com/wiki/index.php?title=Ubuntu/Debian_installation_prerequisites#Debian

    En résumé le problème venait de ma locale fr, une fois changé en en_us je n’ai plus eu l’erreur. j’ai donc recompilé la toolchain puis busybox sans soucis.

    Encore merci pour votre aide

  9. Axe dit :

    Bonjour,

    Nous suivons votre tuto pour compiler nous même le noyau, mais lors du premier démarrage du raspberry, impossible de monter la partition Root.

    VFS: Cannot open root device “mmcblk0p2” or unknown-block(179.2)
    Please append a correct “root=” boot option: Here are the available partitions
    b300 7778304 mmcb1k0 driver : mmcblk
    b301 137237 mmcblk0p1 00000000-0000-0000-0000-000000000000
    b302 7633626 mmcblk0p2 00000000-0000-0000-0000-000000000000
    Kernel panic – not syncing : VFS: Unable to mount root fs on unknown-block(179.2)

    aidez moi! 😀
    Merci

    • cpb dit :

      Bonsoir,

      Visiblement la seconde partition n’est pas correctement formatée avec le type ext2. Ou alors le système de fichiers ext2 n’est pas compilé statiquement dans le kernel (ce qui est normalement fait dans le fichier .config que vous pouvez télécharger ici).

      • Axel dit :

        J’ai fait la table de partition et formaté plusieurs fois.

        En essayant avec le noyau https://github.com/raspberrypi/firmware/blob/master/boot/kernel.img j’arrive bien sur le kernel panic attendu (a propos du init).

        Cela fonctionne aussi si j’utilise https://github.com/raspberrypi/linux/blob/rpi-3.2.27/arch/arm/config/bcmrpi_cutdown_defconfig en tant que .config pour compiler le noyau. Le problème est votre fichier de configuration et celui là sont bien trop différents pour que je trouve seul comment modifier le votre.

        Peut-etre pouvez vous nous expliquer les choix que vous avez fait pour votre .config.

        J’ai pu continuer le cours jusqu’à la fin grâce à ce noyau.

        Je vous remercie encore pour ce cours très intéressant que je complète grâce a la doc LinuxFromScratch.

        Axel

        • cpb dit :

          J’ai remarqué que sur de nombreux systèmes Linux embarqué, il était nécessaire d’effacer les premiers octets de la carte flash avant de la partitionner. Ceci peut s’obtenir ainsi :

          dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=1

          Peut-être cela est-li nécessaire ici ?

          Pour le Raspberry Pi, il est recommandé d’utiliser des cartes micro-SD de classe 6 (mais ça ne devrait pas être bloquant).

          • Axel dit :

            J’ai trouvé, j’ai un peu honte ^^

            Je ne sais pas pourquoi mais la partition /Root de la carte SD apparait comme du Ext4 (alors que j’ai bien fait le mkfs.ext2).

            J’ai juste juste précisé de compiler le support Ext4 en dur dans le noyau et non comme un module.

            Je continue les tutos!!!!

          • blegat dit :

            J’ai eu la même chose, merci Axel, compilé `ext4` en statique a marché 🙂

  10. Elzeard dit :

    bonjour j’ai exactement le meme probleme que axel, je suis certain que cela doit venir d’un detail mais pour info j’utilise une SD de 32Gb alors que dans votre tuto c’est une carte de petite capacité. peut etre cela pourra vous mettre sur la piste d’une solution.

    j’aimerais vraiment comprendre ce qui ne va pas avec cettte partition ext2 /Root…

    en tout etat de cause un grand merci pour vos articles ils sont vraiment poussés et d’une grande richesse pour nous.

    cordialement et encore bravo. et bonnes fêtes de fin d’années.

  11. Jérôme dit :

    Bonjour,

    Je voulais savoir si comme vous l’annonciez en fin d’article (magazine) une suite était toujours à l’ordre du jour (configuration réseau, son etc…) . Et si oui, avez vous déja une idée de la date (approximative) de sa publication.

    J’aime beaucoup votre pédagogie, tout est très clair et intéressant.

    Meilleurs voeux 2013 !!

    JV

  12. Jerome dit :

    Encore une question de noob 🙂 . La chaine de compilation croisée décrite dans l’article permet-elle aussi de compiler différents logiciels à partir de leurs sources type piwigo (galerie photo). Ou bien sert-elle uniquement à installer un système de base.

    • cpb dit :

      Bonjour,

      La chaîne de compilation permet bien sûr de compiler d’autres logiciels que le kernel et les outils de base. Toutefois, quand il s’agit d’une toolchain produite par Buildroot, elle est assujettie à la bibliothèque uClibC qui est plutôt limitée.

      On peut créer une chaîne plus puissante avec crosstool-NG (voir http://www.blaess.fr/christophe/2012/10/19/toolchain-crosstool-ng-pour-raspberry-pi/ ) qui s’appuie sur la bibliothèque GlibC.

      Suivant les cas, il peut également être utile de générer par la même occasion le compilateur C++ (c’est une option du menu de configuration).

  13. Wess dit :

    Bonjour
    Lors de la compilation il s’affiche un message “find: `/home/makavelli/RaspberryPI/buildroot-2012.05/output/target/lib/modules’: Aucun fichier ou dossier de ce type”
    et aussi un autre “/usr/local/cross-rpi/usr/bin/arm-unknown-linux-uclibcgnueabi-ldconfig: /usr/lib/libstdc++.so.6.0.14-gdb.py is not a shared library, skipping
    /usr/local/cross-rpi/usr/bin/arm-unknown-linux-uclibcgnueabi-ldconfig: skipping /usr/X11R6/lib: No such file or directory”

    qu’est ce qu’il faut s’il vous plait

  14. Emmanuel dit :

    Bonjour,
    Votre article m’intéresse beaucoup, pensez-vous le rendre disponible sur votre site ?
    Merci

  15. blegat dit :

    Quand j’essaie de compiler buildroot-2012.05, sans avoir changé le .config, j’ai
    /usr/bin/gcc -std=gnu99 -I. -O2 -I/usr/local/cross-rpi/include -I/usr/local/cross-rpi/usr/include -MT clean-temp.o -MD -MP -MF .deps/clean-temp.Tpo -c -o clean-temp.o clean-temp.c
    In file included from clean-temp.h:22:0,
    from clean-temp.c:23:
    ./stdio.h:477:1: error: ‘gets’ undeclared here (not in a function)mv -f .deps/c-stack.Tpo .deps/c-stack.Po
    Une idée ? :/

    • cpb dit :

      Qu’entendez-vous par “sans avoir changé le .config” ? Vous utilisez bien celui-ci par exemple http://www.blaess.fr/christophe/files/glmf/rpi-scratch-01/config-buildroot ?

      Sur quel système compilez-vous ?

      • blegat dit :

        Oui, c’est ce que je veux dire, j’utilise http://www.blaess.fr/christophe/files/glmf/rpi-scratch-01/config-buildroot

        Je suis sur Ubuntu 13.04 donc j’ai
        $ make -v
        GNU Make 3.81
        Copyright (C) …
        This program built for x86_64-pc-linux-gnu

        $ gcc -v
        Using built-in specs.
        COLLECT_GCC=gcc
        COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
        Target: x86_64-linux-gnu
        Configured with: ../src/configure -v –with-pkgversion=’Ubuntu/Linaro 4.7.3-1ubuntu1′ –with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs –enable-languages=c,c++,go,fortran,objc,obj-c++ –prefix=/usr –program-suffix=-4.7 –enable-shared –enable-linker-build-id –libexecdir=/usr/lib –without-included-gettext –enable-threads=posix –with-gxx-include-dir=/usr/include/c++/4.7 –libdir=/usr/lib –enable-nls –with-sysroot=/ –enable-clocale=gnu –enable-libstdcxx-debug –enable-libstdcxx-time=yes –enable-gnu-unique-object –enable-plugin –with-system-zlib –enable-objc-gc –with-cloog –enable-cloog-backend=ppl –disable-cloog-version-check –disable-ppl-version-check –enable-multiarch –disable-werror –with-arch-32=i686 –with-abi=m64 –with-multilib-list=m32,m64,mx32 –with-tune=generic –enable-checking=release –build=x86_64-linux-gnu –host=x86_64-linux-gnu –target=x86_64-linux-gnu
        Thread model: posix
        gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1)

        $ uname -r
        3.8.0-23-generic

        • JoeB dit :

          Bonjour,

          J’ai également le même problème que blegat, j’obtiens les mêmes erreurs lorsque j’essaye de compiler buildroot2012.05. Avez-vous des indices pour aider à palier ce problème?
          Merci.

  16. Jacques GODART dit :

    J’essaye de mettre en application : “la construction d’une chaîne de compilation”. Je suis arrivé au chapitre 5 : Installation du bootloader.
    Quand je fais un “ls bootloader/boot/” il me manque le fichier loader.bin
    Comment puis-je remedier à ce problème ?
    J’ai déja un systême opérationnel sur une SD card. Est-il possible de récupérer et utiliser le fichier de celle-ci ?

    • cpb dit :

      Vous pouvez en effet reprendre les fichiers de la partition de boot d’une distribution comme la Raspbian, par exemple, et ne remplacer que le fichier kernel.img par le fichier arch/arm/boot/zImage obtenu lors de la compilation du noyau Linux.

  17. Jacques GODART dit :

    ok, merci pour votre réponse. Je vais donc poursuivre mes bricolages.
    Cordialement
    JG

URL de trackback pour cette page