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
.
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
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,
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é