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

Publié par cpb
Juin 10 2011

Après avoir obtenu un système minimal sur notre carte Pandaboard (voir les articles 1, 2 et 3), nous allons pouvoir l’enrichir un peu, en commençant par un serveur HTTP plus puissant que le précédent : Apache.

Le serveur Apache est l’un des plus utilisés sur Internet (au moins un site Web sur deux). Il est extensible grâce à de nombreux modules (par exemple PHP). Beaucoup de documents sont disponibles tant sur son installation que son administration.

Toutefois, il n’est pas particulièrement prévu pour être installé sur un système embarqué, et la cross-compilation pour un processeur différent est assez tortueuse, comme nous le verrons plus loin.

Apache utilise des fonctionnalités assez avancées des threads Posix, qui ne sont pas connus de la bibliothèque uClibC (celle-ci s’appuie sur l’ancienne bibliothèque LinuxThreads). Il nous faudra donc installer sur notre carte Pandaboard une bibliothèque GlibC (qui emploie les fonctionnalités de la NPTL Native Posix Thread Library). Pour cela, je vous renverrai à l’article décrivant l’utilisation de Crosstool-NG, ce dernier nous permettant d’installer un système basé sur une GlibC (après avoir recompilé Busybox).

Compilation d’Apache

Tout d’abord téléchargeons les sources d’Apache :

[~]$ PATH=$PATH:~/cross-arm-linux-ctng/bin/
[~]$ cd ~/Projets/Panda/
[Panda]$ wget http://mir2.ovh.net/ftp.apache.org/dist/httpd/httpd-2.2.19.tar.bz2
--2011-06-09 20:04:37--  http://mir2.ovh.net/ftp.apache.org/dist/httpd/httpd-2.2.19.tar.bz2
Résolution de mir2.ovh.net... 91.121.125.139
[...]
2011-06-09 20:04:47 (542 KB/s) - «httpd-2.2.19.tar.bz2» sauvegardé [5322082/5322082]
[Panda]$

Décompressons les sources d’Apache :

[Panda]$ tar -xjf ~/httpd-2.2.19.tar.bz2
[Panda]$ cd httpd-2.2.19
[httpd-2.2.19]$

Pour préparer la configuration, nous allons devoir court-circuiter plusieurs tests. En effet, le script configure qui prépare la compilation est prévu pour générer des programmes de tests et les exécuter sur place. Naturellement ces tests n’auraient aucun sens lors d’une compilation croisée. Il faudra donc passer des options spécifiques à configure pour indiquer directement les résultats. Voici la ligne de commande employée :

[httpd-2.2.19]$  ./configure  --prefix=/server  --host=arm-generic-linux-gnueabi   ac_cv_file__dev_zero=yes   ac_cv_func_setpgrp_void=yes   apr_cv_tcp_nodelay_with_cork=yes   ac_cv_sizeof_struct_iovec=8   apr_cv_process_shared_works=yes   apr_cv_mutex_robust_shared=no   ac_cv_struct_rlimit=yes    ap_cv_void_ptr_lt_long=no --enable-so --enable-module=all
configure: WARNING: If you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used.
checking for chosen layout... Apache
checking for working mkdir -p... yes
checking build system type... i686-pc-linux-gnu
checking host system type... arm-generic-linux-gnueabi
[...]
config.status: creating build/pkg/pkginfo
config.status: creating build/config_vars.sh
config.status: creating include/ap_config_auto.h
config.status: executing default commands
[httpd-2.2.19]$

Nous pouvons à présent lancer la compilation :

[httpd-2.2.19]$ make
Making all in srclib
make[1] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib »
Making all in apr
make[2] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr »
make[3] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr »
[...]
./dftables /home/cpb/Projets/Panda/httpd-2.2.19/srclib/pcre/chartables.c
./dftables: ./dftables : fichier binaire impossible à lancer
make[3]: *** [/home/cpb/Projets/Panda/httpd-2.2.19/srclib/pcre/chartables.c] Erreur 126
make[3] : on quitte le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib/pcre »
make[2]: *** [all-recursive] Erreur 1
make[2] : on quitte le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib/pcre »
make[1]: *** [all-recursive] Erreur 1
make[1] : on quitte le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib »
make: *** [all-recursive] Erreur 1
[httpd-2.2.19]$

Une erreur de compilation ? Et oui ! La compilation d’Apache passe par l’utilisation d’un outil personnel « dftables » qui est compilé à la volée, puis utilisé. Cela ne peut évidemment pas marcher avec une cross-compilation. Si nous devons faire tourner le programme sur l’hôte de développement (un PC), il va falloir le compiler manuellement :

[httpd-2.2.19]$ cd srclib/pcre/
[httpd-2.2.19]$ cc dftables.c -o dftables
[httpd-2.2.19]$

Puis relancer la compilation :

[httpd-2.2.19]$ cd ../..
[httpd-2.2.19]$ make
Making all in srclib
make[1] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib »
Making all in apr
make[2] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr »
make[3] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr »
[...]
/home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr/libtool --silent --mode=link arm-generic-linux-gnueabi-gcc -g -O2        -o gen_test_char  gen_test_char.lo -lm
./gen_test_char > test_char.h
/bin/sh: ./gen_test_char : fichier binaire impossible à lancer
make[2]: *** [test_char.h] Erreur 126
make[2] : on quitte le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/server »
make[1]: *** [all-recursive] Erreur 1
make[1] : on quitte le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/server »
make: *** [all-recursive] Erreur 1
[httpd-2.2.19]$

Encore ? Même problème, même remède : la compilation à la main…

[httpd-2.2.19]$ cd server/
[httpd-2.2.19]$ cc gen_test_char.c -o gen_test_char -I ../srclib/apr/include/
[httpd-2.2.19]$

Relançons à nouveau la compilation :

[httpd-2.2.19]$ cd ..
[httpd-2.2.19]$ make
Making all in srclib
make[1] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib »
Making all in apr
make[2] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr »
make[3] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr »
[...]
ttpd-2.2.19/srclib/pcre/libpcre.la /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr-util/libaprutil-1.la /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr-util/xml/expat/libexpat.la /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr/libapr-1.la -lrt -lcrypt -ldl
make[1] : on quitte le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19 »
[httpd-2.2.19]$

Installation d’Apache

Voilà, notre serveur Apache est compilé. Il ne reste plus qu’à l’installer. Lors de la configuration, j’ai précisé l’option "--prefix=/server". Ceci signifie que l’installation devra se faire dans le répertoire /server. En principe, nous devrions pouvoir préparer l’installation sur notre hôte de compilation en choisissant un répertoire local ainsi :

$ make DESTDIR=~/Projets/Panda/Target/  install

Toutefois, Apache n’est pas vraiment prévu pour la cross-compilation (comment ? je l’ai déjà dit ?) et le répertoire DESTDIR se retrouve mentionné dans les fichiers de configuration générés lors de l’installation… Pour contourner (un peu lâchement, j’en conviens) ce problème, j’ai décidé de lancer l’installation sur la plateforme de compilation comme si nous étions sur la cible (donc dans le répertoire /server de l’hôte).

[httpd-2.2.19]$ su
Mot de passe :
[httpd-2.2.19]# make install
Making install in srclib
make[1] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib »
Making install in apr
make[2] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr »
make[3] : on entre dans le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19/srclib/apr »
[...]
mkdir /server/man
mkdir /server/man/man1
mkdir /server/man/man8
mkdir /server/manual
make[1] : on quitte le répertoire « /home/cpb/Projets/Panda/httpd-2.2.19 »
[httpd-2.2.19]# ls /server/
bin  build  cgi-bin  conf  error  htdocs  icons  include  lib  logs  man  manual  modules
[httpd-2.2.19]#

Nous allons le transférer, sous forme d’archive zippée sur la cible :

[httpd-2.2.19]# cd /
[/]# tar -czf server.tar.gz server/
[/]# scp server.tar.gz root@192.168.3.152:/
root@192.168.3.152's password:
server.tar.gz                                 100% 5225KB   1.7MB/s   00:03
[/] #

Connectons-nous sur la cible. Par rapport à l’article précédent, j’ai désactivé le serveur httpd de la Busybox.

[/]# ssh root@192.168.3.152
root@192.168.3.152's password:
[PANDA /root]# cd /
[PANDA /]# ls
bin            lib            proc           sys
dev            linuxrc        root           tmp
etc            lost+found     sbin           usr
home           mnt             server.tar.gz  var
[PANDA /]# tar -xzf server.tar.gz 
[PANDA /]#

Test du serveur Apache

Apache s’exécute sous l’identité daemon du groupe daemon. Créons ces comptes, puis lançons le serveur.

[PANDA /]# touch /etc/group
[PANDA /]# adduser daemon
Changing password for daemon
New password:
Retype password:
Password for daemon changed by root
[PANDA /]# /server/bin/apachectl start
httpd: apr_sockaddr_info_get() failed for (none)
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[PANDA /]#

Les messages ne sont que des avertissements, le serveur a bien démarré. Vérifions-le :

[PANDA /]# ps
PID   USER     TIME   COMMAND
    1 root       0:01 init
    2 root       0:00 [kthreadd]
    3 root       0:00 [ksoftirqd/0]
[...]
 1129 root       0:00 [flush-179:0]
 1136 root       0:00 dropbear -r /etc/dbkey
 1137 root       0:00 -sh
 1186 root       0:00 /server/bin/httpd -k start
 1187 daemon     0:00 /server/bin/httpd -k start
 1188 daemon     0:00 /server/bin/httpd -k start
 1189 daemon     0:00 /server/bin/httpd -k start
 1190 daemon     0:00 /server/bin/httpd -k start
 1191 daemon     0:00 /server/bin/httpd -k start
 1192 root       0:00 ps
[PANDA /]#

La meilleure vérification va consister à lancer un navigateur sur notre hôte de développement, et à le faire pointer sur l’adresse IP de la cible. Nous devrions voir une page par défaut qu’Apache a installé dans /server/htdocs/index.html.

Capture Apache sur Pandaboard

3 Réponses

  1. HONORE dit :

    Bonjour Christophe,
    J’essaie de régénérer un serveur apache pour les MOXA DA661 et je m’inspire de ton poste mais sans réel succès. Je remplace le host par xscaleeb mais je n’ai pas l’impression que la compile s’appuie sur ma chaîne de compilation croisée. J’ai bien défini CC/LDFLAGS etc histoire de forcé les choses mais bon sans trop de succès.
    checking for xscaleeb-gcc… /usr/local/xscale_be/bin/xscale_be-gcc
    checking whether the C compiler works… no
    configure: error: in `/home/tma/workspace/httpd-2.2.23/srclib/apr’:
    configure: error: C compiler cannot create exécutables

    Bon j’en ai pas vraiment besoin en fait je voudrais juste ajouter l’option shmop à la lib php histoire d’accéder directement à mes zones de mémoires partagées depuis une page php.
    C’est pour un stagiaire et on s’en sort en créant une exécutable qui va lire la zone de mémoire et renvoie les données sur la sortie standard que capture la page. 9a marche et a part moi tout trouve ça très bien mais c’est pas élégant donc j’essaie de faire plus joli ( donc c’est inutile évidemment).
    Je ne sais pas si mon pb à une solution d’ailleurs.
    Si tu peux me donner qq conseils.
    cdt
    Hervé HONORE

    • cpb dit :

      Bonjour Hervé,

      Je vois que tu as de quoi t’occuper lorsque vous êtes enneigés comme la semaine dernière 😉

      Le problème lors de la compilation d’Apache, c’est que le script .configure génère des exécutables, les lance, et récupère leur résultats pour continuer sa configuration. Évidemment dans le cas d’une chaîne de compilation croisée il ne peut pas lancer les fichiers exécutables produits puisqu’ils sont pour une autre architecture. Il faut donc aller les lancer « à la main » sur la cible, récupérer leur résultat et les inscrire directement dans le script de compilation. C’est très fastidieux. Je vais regarder comment ça se passe avec une version 2.2.23.

      Tu n’as pas la possibilité de compiler Apache nativement sur le Moxa ?

      Cordialement,

      • HONORE dit :

        Bonjour christophe,
        et non toujours pas je passe pas la toolchain fourni.

        Merci en tout cas de regarder mais si c’est trop long laisse tomber.

        a+
        hervé

URL de trackback pour cette page