Construire son système personnel sur une carte Pandaboard (2)

Publié par cpb
Mai 13 2011

PandaboardNous avons réussi dans l’article précédent à compiler les bootloaders X-loader et U-boot, ainsi qu’un noyau Linux pour la carte Pandaboard. Le démarrage du système se déroulait très bien, le chargeur X-loader s’initialisant d’abord, puis passant le contrôle à U-boot. Ce dernier plaçait l’image du noyau Linux en mémoire et lui transmettait l’exécution.

Nous avons observé que le noyau commençait par s’auto-décompresser en mémoire, puis détectait les éléments matériels du système, initialisait tous ses composants logiciels, montait la seconde partition de la carte flash à la racine du système de fichiers, et cherchait – en vain – à démarrer le premier processus du système, le processus init.

Nous devons donc lui fournir ce fameux programme init.  Il en existe plusieurs versions :

  • l’init dit “System V” adopte un comportement classique sous Unix, en examinant le contenu du fichier /etc/inittab, puis en démarrant des processus en fonction du contenu de ce fichier ;
  • l’init du projet Upstart plus récent permet de paralléliser plus de traitements, et d’offrir ainsi une interface visuelle à l’utilisateur alors même que tous les services ne sont pas encore actifs (ce fonctionnement est aussi proposé par le projet Initng mais de manière moins complète) ;
  • le projet systemd, jeune et actif, a pour but de regrouper les opérations d’init et de la plupart des démons usuels.

 

Pour les systèmes embarqués, on fait souvent appel à une version simplifiée de l’init System V, proposée par le projet Busybox. Nous allons l’utiliser pour mettre en place les outils minimum sur un système embarqué.

Système de fichiers

Tout d’abord il nous faut préparer le système de fichiers. Même dans un environnement minimal, Linux nécessite une arborescence de fichiers. Ceux-ci peuvent se trouver sur un disque dur (dans le cas d’un poste de travail, d’un serveur…), sur une carte flash (smartphone, systèmes embarqués…) ou même sur un ramdisk, disque virtuel en mémoire RAM, initialisé au moment du boot à partir d’une image se trouvant généralement dans une mémoire flash.

Dans notre configuration, le système de fichiers résidera sur la seconde partition de la carte SD sur laquelle notre Pandaboard démarre. Nous avions précédemment initialisé cette seconde partition au format Ext3, classique sous Linux. Nous lui avions donné le nom root (pour root filesystem). En insérant la carte flash sur notre ordinateur hôte de développement, la partition se trouve automatiquement montée dans /media/root.

Commençons à créer l’arborescence usuelle.

[~]# cd /media/root/
[root]# ls
lost+found
[root]#

Le répertoire lost+found est automatiquement créé lorsqu’on formatte une partition en Ext3.

[root]# mkdir bin dev etc home lib mnt proc root sbin sys tmp usr var 
[root]# mkdir usr/bin usr/sbin etc/init.d
[root]#

Nous rajouterons d’autres répertoires ultérieurement, ceux-ci nous permettront déjà d’avoir un accès minimal sur notre système. Nous pourrions à ce point créer les fichiers spéciaux de /dev représentant les périphériques du système. Sur un système embarqué avec de fortes contraintes d’occupation mémoire, c’est ce que je préconiserais. Ici je préfère tirer profit de la création automatique des fichiers spéciaux grâce à l’utilitaire mdev contenu dans Busybox.

Busybox

Busybox est un outil bien connu des développeurs pour Linux embarqué. Il s’agit d’un projet qui regroupe efficacement en un seul fichier exécutable plus de 300 commandes Unix classiques. Sur cet exécutable (nommé busybox), on crée des liens symboliques ou physiques portant les noms des commandes implémentées (par exemple ls, sh, cp, etc.) Lorsque l’exécutable démarre, il regarde sous quel nom il a été invoqué – en consultant l’argument argv[0] de sa fonction main() – et adopte le comportement correspondant. Outre la réduction de taille liée à la mise en commun du code utilisé par toutes les applets de busybox, il est possible de gagner beaucoup de place car les implémentations des commandes standards sont faites avec le souci de réduction de taille. De plus lors de la compilation de Busybox, on peut choisir les applets et les options que l’on juge utiles pour notre projet.

Busybox implémente une version simple de processus init, capable de lire un fichier /etc/inittab et d’en tirer parti. En l’absence d’un fichier /etc/inittab le processus init de Busybox cherche à exécuter automatiquement un script nommé /etc/init.d/rcS.

Compilons Busybox (dans le fichier de configuration proposé ci-dessous, j’ai activé la plupart des applets disponibles).

[~]$ cd ~/Projets/Panda/
[Panda]$ wget http://www.busybox.net/downloads/busybox-1.18.4.tar.bz2
[...]
2011-05-08 18:09:13 (122 KB/s) - «busybox-1.18.4.tar.bz2» sauvegardé [2130598/2130598]
[Panda]$ tar xjf busybox-1.18.4.tar.bz2 
[Panda]$ cd busybox-1.18.4
[busybox-1.18.4]$
[busybox-1.18.4]$ cp ~/config-busybox-1.18.4 ./.config
[busybox-1.18.4]$ make menuconfig
[busybox-1.18.4]$ make CROSS_COMPILE=/cross-arm-linux/usr/bin/arm-linux-
[...]
[busybox-1.18.4]$ ls -l busybox
-rwxrwxr-x 1 cpb cpb 892444  8 mai   19:26 busybox
[busybox-1.18.4]$

Note : la variable CROSS_COMPILE contient le préfixe à ajouter devant les outils standards (gcc, as, ar, etc.) pour accéder aux outils de la toolchain correspondant au processeur Arm. Si vous ne disposez pas de chaîne de compilation croisée, vous pouvez télécharger cette archive à décompresser directement à la racine de votre système de fichiers. Un article à venir dans deux semaines vous proposera plusieurs méthodes pour générer vous-mêmes votre propre toolchain.

Voici une liste des commandes intégrées dans l’exécutable busybox que nous avons compilé.

[, [[, acpid, add-shell, addgroup, adduser, adjtimex, arp, arping, ash, awk, base64, basename, bbconfig, beep, blkid, blockdev, bootchartd, brctl, bunzip2, bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, cryptpw, cttyhack, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg, dnsd, dnsdomainname, dos2unix, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, ether-wake, expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs, flock, fold, free, freeramdisk, fsck, fsck.minix, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, gunzip, gzip, halt, hd, hdparm, head, hexdump, hostid, hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd, init, insmod, install, ionice, iostat, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, length, less, linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login, logname, logread, losetup, ls, lsattr, lsmod, lspci, lsusb, lzcat, lzma, lzop, lzopcat, makedevs, man, md5sum, mdev, mesg, microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modinfo, modprobe, more, mount, mountpoint, mpstat, mt, mv, nameif, nbd-client, nc, netstat, nice, nmeter, nohup, nslookup, ntpd, od, openvt, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, pmap, poweroff, powertop, printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readahead, readlink, readprofile, realpath, reboot, remove-shell, renice, reset, resize, rev, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run-parts, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, seq, setarch, setconsole, setfont, setkeycodes, setlogcons, setsid, setuidgid, sh, sha1sum, sha256sum, sha512sum, showkey, slattach, sleep, smemcap, softlimit, sort, split, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, traceroute6, true, tty, ttysize, tunctl, udhcpc, udhcpd, udpsvd, umount, uname, unexpand, uniq, unix2dos, unlzma, unlzop, unxz, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, wall, watch, watchdog, wc, wget, which, whoami, xargs, xz, xzcat, yes, zcat, zcip

Nous pouvons observer que la couverture des applications est très large. Certaines nous serons indispensables dès le démarrage.

  • init : lors du boot, le kernel cherche à démarrer un processus /bin/init (il recherche également dans /sbin et /etc). Il nous faut donc créer un lien symbolique sur busybox qui porte ce nom. Ce processus init va consulter le fichier /etc/inittab et agir en conséquence. En l’absence de ce fichier, il commencera par lancer le script /etc/init.d/rcS.
  • sh : le script /etc/init.d/rcS est un script shell. Il commence par la ligne shebang "! /bin/sh". Il faut donc qu’un lien de ce nom existe et pointe vers busybox également.
  • mount : le script de démarrage doit commencer par monter le pseudo-système de fichier proc. Pour cela, la commande mount doit être disponible comme lien vers busybox.

Ensuite, l’exécutable busybox va pouvoir créer les liens sur lui-même avec tous les noms mentionnés plus haut. Installons les quelques fichiers indispensables.

[busybox-1.18.4]$ su
Password:
[busybox-1.18.4]# cp  busybox  /media/root/bin/
[busybox-1.18.4]# cd  /media/root/bin/
[bin]# ln busybox init
[bin]# ln busybox sh
[bin]# ln busybox mount
[bin]#

Puis copions le fichier rcS (à télécharger ici) sans oublier de le rendre exécutable ! (le contenu du script est décrit plus bas)

[bin]# cd /media/root/etc/init.d
[init.d]# cp  ~/rcS  .
[init.d]# chmod  +x  rcS
[init.d]#

Il nous faut également installer les bibliothèques dynamiques nécessaires pour le fonctionnement de Busybox. Nous allons procéder de manière un peu excessive en copiant toutes les bibliothèques fournies par la chaîne de compilation. Dans le cas d’un système plus restreint, nous sélectionnerions précisément les bibliothèques indispensables, avec l’aide de la commande arm-linux-ldd se trouvant dans notre toolchain.

[lib]# cp -Rdp /cross-arm-linux/usr/arm-linux/sysroot/lib/*  .
[lib]#

Le fichier rcS contient les lignes suivantes.

#! /bin/sh

mount none  /proc  -t proc
mount none  /sys   -t sysfs
mount /     -o rw,remount

busybox --install

mdev -s
echo /sbin/mdev > /proc/sys/kernel/hotplug

La première ligne indique quel est l’interpréteur à utiliser pour traiter ce script. Le fichier /bin/sh existe, nous l’avons créé sous forme de lien. Ensuite on monte les deux pseudo-systèmes de fichier /proc et /sys, puis on remonte le système de fichier original en lecture et écriture (pendant le boot, le noyau le monte en lecture seule).

Nous pouvons alors demander à Busybox de créer les liens sur son propre fichier exécutable avec les noms de tous les utilitaires qu’il sait représenter.

L’utilitaire mdev que nous démarrons ensuite a pour rôle de créer les fichiers spéciaux de /dev représentant tous les périphériques détectés par le noyau. C’est une version simplifiée du programme udevd (User Device Dameon) que l’on retrouve sur certaines distributions. Nous l’enregistrons également comme utilitaire à invoquer lors d’un hotplug, la détection d’un branchement à chaud de périphérique (par exemple une clé USB). Le script de démarrage proposé ici est vraiment minimal, nous l’étendrons dans le prochain article.

Nous pouvons démonter notre mémoire flash et l’insérer sur la Pandaboard.

[init.d]# cd /media
[media]# umount boot root
[media]#

Démarrons minicom sur notre système hôte, relié au port série de la carte Pandaboard. Et mettons cette dernière sous tension. Nous voyons sur l’écran de minicom les lignes suivantes.

Texas Instruments X-Loader 1.5.0 (May  3 2011 - 07:49:31)
[...]
U-Boot 2011.03-00398-ga621b16-dirty (May 03 2011 - 08:42:19)
[...]
## Booting kernel from Legacy Image at 82000000 ...
   Image Name:   Linux-2.6.39-rc5-cpb
[...]
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 2.6.39-rc5-cpb (cpb@tr-a-0) (gcc version 4.3.5 (Buildroot 2010.08) ) #1 SMP Tue May 3 11:14:47 1
[    0.000000] CPU: ARMv7 Processor [411fc092] revision 2 (ARMv7), cr=10c5387f
[...]
[    3.794860] smsc95xx v1.0.4
[    3.922637] smsc95xx 1-1.1:1.0: eth0: register 'smsc95xx' at usb-ehci-omap.0-1.1, smsc95xx USB 2.0 Ethernet, b6:f0:b5:2e:9

Please press Enter to activate this console.

Pressons la touche “Entrée”, afin d’obtenir le prompt du shell de Busybox

/ # ls
bin         home        lost+found  root        tmp
dev         lib         mnt         sbin        usr
etc         linuxrc     proc        sys         var
/ # uname -a
Linux (none) 2.6.39-rc5-cpb #1 SMP Tue May 3 11:14:47 CEST 2011 armv7l GNU/Linux
/ # cat /proc/cpuinfo
Processor       : ARMv7 Processor rev 2 (v7l)
processor       : 0
BogoMIPS        : 2007.19

processor       : 1
BogoMIPS        : 1965.18

Features        : swp half thumb fastmult vfp edsp thumbee neon vfpv3
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x1
CPU part        : 0xc09
CPU revision    : 2

Hardware        : OMAP4 Panda board
Revision        : 0020
Serial          : 0000000000000000
/ #

Nous voyons bien que nous sommes connectés sur une carte Pandaboard ; les deux coeurs du processeur OMAP 4 sont visibles. Observons les liens que Busybox a créé sur lui-même.

/ # ls /bin/
[              dumpkmap       kbd_mode       pmap           tail
[[             dumpleases     kill           powertop       tar
add-shell      echo           killall        printenv       tcpsvd
addgroup       ed             killall5       printf         tee
adduser        egrep          length         ps             telnet
arping         eject          less           pscan          test
ash            env            linux32        pwd            tftp
awk            envdir         linux64        readahead      tftpd
base64         envuidgid      ln             readlink       time
basename       ether-wake     logger         realpath       timeout
bbconfig       expand         login          remove-shell   top
beep           expr           logname        renice         touch
bunzip2        false          ls             reset          tr
busybox        fdflush        lsattr         resize         traceroute
bzcat          fdformat       lspci          rev            traceroute6
bzip2          fgconsole      lsusb          rm             true
cal            fgrep          lzcat          rmdir          tty
cat            find           lzma           rpm            ttysize
catv           flock          lzop           rpm2cpio       udpsvd
chat           fold           lzopcat        rtcwake        umount
chattr         free           md5sum         run-parts      uname
chgrp          fsync          mesg           runsv          unexpand
chmod          ftpget         microcom       runsvdir       uniq
chown          ftpput         mkdir          rx             unix2dos
chpst          fuser          mkfifo         script         unlzma
chrt           getopt         mknod          scriptreplay   unlzop
chvt           grep           mkpasswd       sed            unxz
cksum          gunzip         mktemp         seq            unzip
clear          gzip           more           setarch        uptime
cmp            hd             mount          setkeycodes    usleep
comm           head           mountpoint     setsid         uudecode
cp             hexdump        mpstat         setuidgid      uuencode
cpio           hostid         mt             sh             vi
crontab        hostname       mv             sha1sum        vlock
cryptpw        hush           nc             sha256sum      volname
cttyhack       id             netstat        sha512sum      wall
cut            ifplugd        nice           showkey        watch
date           init           nmeter         sleep          wc
dc             install        nohup          smemcap        wget
dd             ionice         nslookup       softlimit      which
deallocvt      iostat         od             sort           whoami
delgroup       ip             openvt         split          xargs
deluser        ipaddr         passwd         stat           xz
df             ipcalc         patch          strings        xzcat
diff           ipcrm          pgrep          stty           yes
dirname        ipcs           pidof          su             zcat
dmesg          iplink         ping           sum
dnsdomainname  iproute        ping6          sv
dos2unix       iprule         pipe_progress  sync
du             iptunnel       pkill          tac
/ # ls /sbin/
acpid              fsck.minix         man                route
adjtimex           ftpd               mdev               runlevel
arp                getty              mkdosfs            setconsole
blkid              halt               mke2fs             setfont
blockdev           hdparm             mkfs.ext2          setlogcons
bootchartd         httpd              mkfs.minix         slattach
brctl              hwclock            mkfs.vfat          start-stop-daemon
chpasswd           ifconfig           mkswap             sulogin
chroot             ifdown             modinfo            svlogd
crond              ifenslave          modprobe           swapoff
depmod             ifup               nameif             swapon
devmem             inetd              nbd-client         switch_root
dhcprelay          init               ntpd               sysctl
dnsd               insmod             pivot_root         syslogd
fakeidentd         klogd              poweroff           telnetd
fbset              loadfont           raidautorun        tunctl
fbsplash           loadkmap           rdate              udhcpc
fdisk              logread            rdev               udhcpd
findfs             losetup            readprofile        vconfig
freeramdisk        lsmod              reboot             watchdog
fsck               makedevs           rmmod              zcip
/ #

Nous pouvons également voir les fichiers spéciaux qui ont été créé par mdev.

/ # ls /dev/
console             ptyvf               ttydd
cpu_dma_latency     ptyw0               ttyde
full                ptyw1               ttydf
i2c-1               ptyw2               ttye0
i2c-2               ptyw3               ttye1
i2c-3               ptyw4               ttye2
i2c-4               ptyw5               ttye3
kmem                ptyw6               ttye4
kmsg                ptyw7               ttye5
loop0               ptyw8               ttye6
loop1               ptyw9               ttye7
loop2               ptywa               ttye8
loop3               ptywb               ttye9
loop4               ptywc               ttyea
loop5               ptywd               ttyeb
loop6               ptywe               ttyec
loop7               ptywf               ttyed
mem                 ptyx0               ttyee
mice                ptyx1               ttyef
mmcblk0             ptyx2               ttyp0
mmcblk0p1           ptyx3               ttyp1
mmcblk0p2           ptyx4               ttyp2
network_latency     ptyx5               ttyp3
network_throughput  ptyx6               ttyp4
null                ptyx7               ttyp5
psaux               ptyx8               ttyp6
ptmx                ptyx9               ttyp7
ptya0               ptyxa               ttyp8
ptya1               ptyxb               ttyp9
ptya2               ptyxc               ttypa
[...]
ptyu7               ttyc5               ttyzf
ptyu8               ttyc6               ubi_ctrl
ptyu9               ttyc7               urandom
ptyua               ttyc8               usbdev1.1
ptyub               ttyc9               usbdev1.2
ptyuc               ttyca               usbdev1.3
ptyud               ttycb               usbdev2.1
ptyue               ttycc               usbmon0
ptyuf               ttycd               usbmon1
ptyv0               ttyce               usbmon2
ptyv1               ttycf               vcs
ptyv2               ttyd0               vcs1
ptyv3               ttyd1               vcs2
ptyv4               ttyd2               vcs3
ptyv5               ttyd3               vcs4
ptyv6               ttyd4               vcsa
ptyv7               ttyd5               vcsa1
ptyv8               ttyd6               vcsa2
ptyv9               ttyd7               vcsa3
ptyva               ttyd8               vcsa4
ptyvb               ttyd9               watchdog
ptyvc               ttyda               zero
ptyvd               ttydb
ptyve               ttydc
/ # /sbin/halt 
swapoff: /etc/fstab: No such file or directory
The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to[  973.315673] System halted.

Notez bien que Busybox a créé les liens et les fichiers spéciaux ci-dessus directement sur la carte flash. Si nous la ré-insérons dans l’hôte de développement, nous observerons que tous ces fichiers existent à présent dans les répertoires mentionnés.

Conclusion

Nous avons installé une base minimale pour notre système Linux, et obtenu un accès par un shell sur le port série. Dans le prochain article, nous permettrons une connexion réseau sur notre carte, en utilisant les protocoles telnet et ssh, avant d’offrir une interface via un navigateur web par protocole http.

Capture Minicom sur Pandaboard

15 Réponses

  1. David dit :

    Hello,

    Merci pour ces super tutos, tout fonctionne à merveille mais j’ai un soucis d’I/O sur ma carte SD neuve ( Kingstone 8Go class 10)


    [ 90.452850] mmcblk0: error -110 transferring data, sector 141000, nr 8, card status 0xc00
    [ 90.461761] end_request: I/O error, dev mmcblk0, sector 141000

    J’ai bien veillé à “aligner les partitions”. Selon votre tuto et celui disponible sur le site officiel.

    Cela ce produit quand “je crée” un fichier ou que je fais un sync.
    J’ai essayé de recompiler le kernel avec un autre .config , même soucis. Sachant que la carte est neuve, ce pourrait-il que ce soit un problème software ?

    • cpb dit :

      Bonjour,

      L’erreur 110 est ETIMEDOUT qui se produit lorsqu’il y a un délai d’attente trop long.
      D’autres personnes rapportent le même problème. Apparemment, certains ont réussi à le résoudre en coupant les interruptions durant le transfert DMA
      en provenance des périphériques mmcblk.
      Pour cela il faut appliquer ce petit patch sur le noyau. Il est prévu pour le noyau 2.6.39, mais doit pouvoir se reporter assez facilement sur les autres versions.
      Pour appliquer le patch, il faut le copier dans votre répertoire personnel puis exécuter :
      $ cd [chemin des sources]/linux-2.6.39.5/
      $ patch -p1 < ~/dma-imx.patch
      patching file arch/arm/mach-imx/dma-v1.c
      $

      Ensuite, recompiler le noyau et le réinstaller. Je n’ai pas testé l’effet du patch, je ne rencontre pas ce problème sur ma carte SD.

  2. David dit :

    Merci pour votre réponse. J’ai essayé le patch ci-dessus mais sans succès pour ma part.

    Avec une autre carte SD cela fonctionne, donc probablement un problème de carte.
    Merci encore pour votre message !

  3. ericb dit :

    Bonjour,

    Merci pour ce tutoriel que je vais mettre dans ma liste spéciale “Linux sur ARM” 🙂

    En fait, je n’ai pas une Panda, mais une Beagleboard (xM) dont je suis très content. La Panda, ce sera la prochaine, car elle semble vraiment la meilleure carte à l’heure actuelle.

    Juste au cas où, j’ai fait le port d’OOo4Kids – une version très allègée d’OpenOffice.org – sur Linux ARM (Debian via qemu, Ubuntu et même Gnome de Steve Sakoman, basée sur OE), et nous cherchons des testeurs : nous pouvons fournir des versions de test, mais on pourrait discuter de tout cela sur IRC

    Channel : #educooo , seveur : irc.freenode.net

    J’ai aussi d’autres idées, mais il vaut mieux en discuter directement 😉

    D’avance merci !

  4. Chriss dit :

    Bonjour, super tuto mais ça coince chez moi pour l’installation de busybox.
    Je pense que c’est au niveau des librairies.
    Quand vous écrivez :
    [lib]# cp -Rdp /cross-arm-linux/usr/arm-linux/sysroot/lib/* .
    [lib]#

    [lib] est bien le répertoire présent à la racine de root ? Si oui un petit “cd /media/root/lib” serait bienvenue dans ce tuto.

    Ensuite je n’ai pas de répertoire “/cross-arm-linux/usr/arm-linux/sysroot/lib/”. J’ai installé ma chaîne de compilation comme indiqué ici :
    http://www.logilin.fr/article.php?ref=003
    L’arborescence est un peu différente. C’est bien les librairies de “/cross-arm-linux/usr/arm-linux/lib/” qu’il faut installer ?

    Merci en tout cas.
    A+.

    • cpb dit :

      Il y a eu une évolution dans les dernières versions de Buildroot; et les chemins ont effectivement un peu changé.
      Les bibliothèques prévues pour s’exécuter sur la cible (donc à copier dans /media/root/lib) se trouvaient auparavant (notamment dans l’article du site Logilin) dans
      /cross-arm-linux/lib/
      Elles sont à présent (avec les dernières versions de Buildroot) dans
      /cross-arm-linux/usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib/
      en outre il y a généralement un lien symbolique
      /cross-arm-linux/usr/arm-linux
      vers
      /cross-arm-linux/usr/arm-unknow-linux-uclibcdnueabi/
      Il faut adapter la commande de copie des bibliothèques en fonction de la version de Buildroot utilisée.

      Dans le doute, on peut utiliser la commande file pour connaître le processeur pour lequel une bibliothèque a été compilée.
      Par exemple sur mon système :

      [~]$ file /cross-arm-linux/usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib/libm.so.0 
      /cross-arm-linux/usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib/libm.so.0: symbolic link to `libm-0.9.31.so'
      [~]$ file /cross-arm-linux/usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib/libm-0.9.31.so 
      /cross-arm-linux/usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib/libm-0.9.31.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped
      [~]$

      Il s’agit d’une bibliothèque compilée pour ARM, donc à copier sur la cible. Tandis que :

      [~]$ file /cross-arm-linux/usr/lib/libgmp.so
      /cross-arm-linux/usr/lib/libgmp.so: symbolic link to `libgmp.so.10.0.1'
      [~]$ file /cross-arm-linux/usr/lib/libgmp.so.10.0.1 
      /cross-arm-linux/usr/lib/libgmp.so.10.0.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
      [lib]$

      Il s’agit d’une bibliothèque utilisée par la chaîne de compilation (GCC) lorsqu’il s’exécute sur le système hôte.

      • Chriss dit :

        Merci pour la réponse.
        Eh bien malgré cela j’ai toujours le “Kernel panic – not syncing: No init found.”
        Pourtant j’ai refait la manip plusieurs fois. J’ai même indiqué au variable d’u-boot : init=/etc/init.d/rcS mais rien n’y fait. Vous avez une idée sur la question ?
        Merci

        • cpb dit :

          Il faut vérifier si le fichier /bin/init (sur la cible) est bien présent. Ce doit être un lien – physique ou symbolique peu importe – sur l’exécutable busybox
          Si oui, a-t’il bien été compilé pour ARM ? (Ca se vérifie en utilisant la commande file)

          [~]$ file /media/root/bin/init 
          /media/root/bin/init: setuid ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped
          [~]$

          Si oui, y a t’il bien toutes les biblothèques nécessaires dans le répertoire /lib de la cible. La liste des bibliothèques nécessaires s’obtient ainsi :

          [~]$ /cross-arm-linux/usr/bin/arm-linux-ldd /media/root/bin/init 
          /media/root/bin/init: is setuid
          checking sub-depends for 'not found'
          checking sub-depends for 'not found'
          checking sub-depends for 'not found'
          	libcrypt.so.0 => not found (0x00000000)
          	libm.so.0 => not found (0x00000000)
          	libc.so.0 => not found (0x00000000)
          	/lib/ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x00000000)
          [~]$ 

          Ne pas tenir compte des “not found”, c’est normal. Mais ca nous donne la liste des bibliothèques nécessaires. Elle devront se trouver dans le répertoire /lib de la cible. Attention, ce sont probablement des liens symboliques, il faut bien copier le fichier visé aussi.

          [~]$ file /media/root/lib/ld-uClibc.so.0 
          /media/root/lib/ld-uClibc.so.0: symbolic link to `ld-uClibc-0.9.31.so

          Et vérifier naturellement que les bibliothèques ont bien été compilées pour Arm.

          [~]$ file /media/root/lib/ld-uClibc-0.9.31.so 
          /media/root/lib/ld-uClibc-0.9.31.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, stripped
          [~]$ 
  5. Chriss dit :

    Bonsoir,

    ca y est ca fontionne au poil. Merci.
    Une dernière chose, au lancement la carte bloque sur :
    Uncompressing Linux… done, booting the kernel.
    Pour pouvoir continuer correctement je suis obligé de rentrer dans le u-boot au lancement, puis de lancer la commande boot. Avez-vous une idée du problème ?
    Encore merci.

  6. Chriss dit :

    oups,
    ps : le problème venait des librairies manquantes.

    • Arnaud dit :

      Bonjour Chriss,

      J’ai le même problème que toi: notre carte bloque également sur Uncompressing Linux… done, booting the kernel. Tu disais que le pb venait des librairies manquantes. Peux-tu m’en dire un peu plus
      Merci

      • cpb dit :

        Si le dernier message est “Uncompressing Linux... done, booting the kernel” le problème se trouve avant que les bibliothèques soient concernées.
        Deux possibilités :

        Le noyau démarre correctement mais les traces ne sont pas visibles (y a-t-il une redirection de la console dans le bootloader ?)
        Le noyau ne démarre pas (problème de compilation, d’architecture, ou de paramétrage du bootloader).

        Sur quelle architecture se situe le problème ? Quelle carte ? Quel bootloader ?

  7. Yvo dit :

    Salut,

    Il est bien précis le tuto’ et tres enrichissant. Seulement, dans le dossier busybox-1.19.3, je ne trouve pas le fichier à copier et renommer en .config(/config-busybox-1.18.4 ./.config).
    J’ai lancé une recherche dans le dossier busybox et aucun fichier trouvé.

    – Pouvez-vous m’en dire plus sur cette étape ?

    • cpb dit :

      Vous pouvez télécharger ce fichier en cliquant directement sur le lien dans l’article. Il s’agit d’un fichier de configuration que j’ai préparé au préalable.

URL de trackback pour cette page