{"id":852,"date":"2011-06-10T12:00:41","date_gmt":"2011-06-10T11:00:41","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=852"},"modified":"2011-06-10T12:00:41","modified_gmt":"2011-06-10T11:00:41","slug":"construire-son-systeme-personnel-sur-une-carte-pandaboard-4","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2011\/06\/10\/construire-son-systeme-personnel-sur-une-carte-pandaboard-4\/","title":{"rendered":"Construire son syst\u00e8me personnel sur une carte Pandaboard (4)"},"content":{"rendered":"<p style=\"text-align: justify;\">Apr\u00e8s avoir obtenu un syst\u00e8me minimal sur notre carte Pandaboard (voir les articles <a title=\"Construire son syst\u00e8me personnel sur une carte Pandaboard (1)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/05\/06\/construire-son-systeme-personnel-sur-une-carte-pandaboard\/\">1<\/a>, <a title=\"Construire son syst\u00e8me personnel sur une carte Pandaboard (2)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/05\/13\/construire-son-systeme-personnel-sur-une-carte-pandaboard-2\/\">2<\/a> et <a title=\"Construire son syst\u00e8me personnel sur une carte Pandaboard (3)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/05\/20\/construire-son-systeme-personnel-sur-une-carte-pandaboard-3\/\">3<\/a>), nous allons pouvoir l&rsquo;enrichir un peu, en commen\u00e7ant par un serveur HTTP plus puissant que le pr\u00e9c\u00e9dent&nbsp;: <strong>Apache<\/strong>.<\/p>\n<p>\n<!--more-->\n<\/p>\n<p style=\"text-align: justify;\">Le serveur Apache est l&rsquo;un des plus utilis\u00e9s sur Internet (au moins un site Web sur deux). Il est extensible gr\u00e2ce \u00e0 de nombreux modules (par exemple PHP). Beaucoup de documents sont disponibles tant sur son installation que son administration.<\/p>\n<p style=\"text-align: justify;\">Toutefois, il n&rsquo;est pas particuli\u00e8rement pr\u00e9vu pour \u00eatre install\u00e9 sur un syst\u00e8me embarqu\u00e9, et la cross-compilation pour un processeur diff\u00e9rent est assez tortueuse, comme nous le verrons plus loin.<\/p>\n<p style=\"text-align: justify;\">Apache utilise des fonctionnalit\u00e9s assez avanc\u00e9es des threads Posix, qui ne sont pas connus de la biblioth\u00e8que <em>uClibC<\/em> (celle-ci s&rsquo;appuie sur l&rsquo;ancienne biblioth\u00e8que LinuxThreads). Il nous faudra donc installer sur notre carte Pandaboard une biblioth\u00e8que <em>GlibC<\/em> (qui emploie les fonctionnalit\u00e9s de la NPTL <em>Native Posix Thread Library<\/em>). Pour cela, je vous renverrai \u00e0 <a title=\"Buildroot vs Crosstool-NG \u2013 Compilons notre cross-compiler\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/05\/27\/buildroot-vs-crosstool-ng-compilons-notre-cross-compiler\/\">l&rsquo;article<\/a> d\u00e9crivant l&rsquo;utilisation de <em>Crosstool-NG<\/em>, ce dernier nous permettant d&rsquo;installer un syst\u00e8me bas\u00e9 sur une GlibC (apr\u00e8s avoir recompil\u00e9 <em>Busybox<\/em>).<\/p>\n<h1 style=\"text-align: justify;\">Compilation d&rsquo;Apache<\/h1>\n<p style=\"text-align: justify;\">Tout d&rsquo;abord t\u00e9l\u00e9chargeons les sources d&rsquo;Apache&nbsp;:<\/p>\n<pre>[~]$ <strong>PATH=$PATH:~\/cross-arm-linux-ctng\/bin\/<\/strong>\n[~]$ <strong>cd ~\/Projets\/Panda\/<\/strong>\n[Panda]$ <strong>wget http:\/\/mir2.ovh.net\/ftp.apache.org\/dist\/httpd\/httpd-2.2.19.tar.bz2<\/strong>\n--2011-06-09 20:04:37-- \u00a0http:\/\/mir2.ovh.net\/ftp.apache.org\/dist\/httpd\/httpd-2.2.19.tar.bz2\nR\u00e9solution de mir2.ovh.net... 91.121.125.139\n[...]\n2011-06-09 20:04:47 (542 KB\/s) - \u00abhttpd-2.2.19.tar.bz2\u00bb sauvegard\u00e9 [5322082\/5322082]\n[Panda]$<\/pre>\n<p style=\"text-align: justify;\">D\u00e9compressons les sources d&rsquo;Apache&nbsp;:<\/p>\n<pre>[Panda]$ <strong>tar -xjf ~\/httpd-2.2.19.tar.bz2<\/strong>\n[Panda]$ <strong>cd httpd-2.2.19<\/strong>\n[httpd-2.2.19]$<\/pre>\n<p style=\"text-align: justify;\">Pour pr\u00e9parer la configuration, nous allons devoir court-circuiter plusieurs tests. En effet, le script <code>configure<\/code> qui\u00a0pr\u00e9pare la compilation est pr\u00e9vu pour g\u00e9n\u00e9rer des programmes de tests et les ex\u00e9cuter sur place. Naturellement ces tests n&rsquo;auraient aucun sens lors d&rsquo;une compilation crois\u00e9e. Il faudra donc passer des options sp\u00e9cifiques \u00e0 <code>configure<\/code> pour indiquer directement les r\u00e9sultats. Voici la ligne de commande employ\u00e9e&nbsp;:<\/p>\n<pre>[httpd-2.2.19]$  <strong>.\/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<\/strong>\nconfigure: WARNING: If you wanted to set the --build type, don't use --host.\n    If a cross compiler is detected then cross compile mode will be used.\nchecking for chosen layout... Apache\nchecking for working mkdir -p... yes\nchecking build system type... i686-pc-linux-gnu\nchecking host system type... arm-generic-linux-gnueabi\n[...]\nconfig.status: creating build\/pkg\/pkginfo\nconfig.status: creating build\/config_vars.sh\nconfig.status: creating include\/ap_config_auto.h\nconfig.status: executing default commands\n[httpd-2.2.19]$<\/pre>\n<p style=\"text-align: justify;\">Nous pouvons \u00e0 pr\u00e9sent lancer la compilation&nbsp;:<\/p>\n<pre>[httpd-2.2.19]$ <strong>make<\/strong>\nMaking all in srclib\nmake[1] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib \u00bb\nMaking all in apr\nmake[2] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/apr \u00bb\nmake[3] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/apr \u00bb\n[...]\n.\/dftables \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/pcre\/chartables.c\n.\/dftables: .\/dftables : fichier binaire impossible \u00e0 lancer\nmake[3]: *** [\/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/pcre\/chartables.c] Erreur 126\nmake[3] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/pcre \u00bb\nmake[2]: *** [all-recursive] Erreur 1\nmake[2] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/pcre \u00bb\nmake[1]: *** [all-recursive] Erreur 1\nmake[1] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib \u00bb\nmake: *** [all-recursive] Erreur 1\n[httpd-2.2.19]$<\/pre>\n<p style=\"text-align: justify;\">Une erreur de compilation&nbsp;? Et oui&nbsp;! La compilation d&rsquo;Apache passe par l&rsquo;utilisation d&rsquo;un outil personnel \u00ab\u00a0<code>dftables<\/code>\u00a0\u00bb qui est compil\u00e9 \u00e0 la vol\u00e9e, puis utilis\u00e9. Cela ne peut \u00e9videmment pas marcher avec une cross-compilation. Si nous devons faire tourner le programme sur l&rsquo;h\u00f4te de d\u00e9veloppement (un PC), il va falloir le compiler manuellement&nbsp;:<\/p>\n<pre>[httpd-2.2.19]$ <strong>cd srclib\/pcre\/<\/strong>\n[httpd-2.2.19]$ <strong>cc dftables.c -o dftables<\/strong>\n[httpd-2.2.19]$<\/pre>\n<p style=\"text-align: justify;\">Puis relancer la compilation&nbsp;:<\/p>\n<pre>[httpd-2.2.19]$ <strong>cd ..\/..<\/strong>\n[httpd-2.2.19]$ <strong>make<\/strong>\nMaking all in srclib\nmake[1] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib \u00bb\nMaking all in apr\nmake[2] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/apr \u00bb\nmake[3] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/apr \u00bb\n[...]\n\/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\n.\/gen_test_char &gt; test_char.h\n\/bin\/sh: .\/gen_test_char : fichier binaire impossible \u00e0 lancer\nmake[2]: *** [test_char.h] Erreur 126\nmake[2] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/server \u00bb\nmake[1]: *** [all-recursive] Erreur 1\nmake[1] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/server \u00bb\nmake: *** [all-recursive] Erreur 1\n[httpd-2.2.19]$<\/pre>\n<p style=\"text-align: justify;\">Encore&nbsp;? M\u00eame probl\u00e8me, m\u00eame rem\u00e8de&nbsp;: la compilation \u00e0 la main&#8230;<\/p>\n<pre>[httpd-2.2.19]$ <strong>cd server\/<\/strong>\n[httpd-2.2.19]$ <strong>cc gen_test_char.c -o gen_test_char -I ..\/srclib\/apr\/include\/<\/strong>\n[httpd-2.2.19]$<\/pre>\n<p style=\"text-align: justify;\">Relan\u00e7ons \u00e0 nouveau la compilation&nbsp;:<\/p>\n<pre>[httpd-2.2.19]$ <strong>cd ..<\/strong>\n[httpd-2.2.19]$ <strong>make<\/strong>\nMaking all in srclib\nmake[1] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib \u00bb\nMaking all in apr\nmake[2] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/apr \u00bb\nmake[3] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/apr \u00bb\n[...]\nttpd-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\nmake[1] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19 \u00bb\n[httpd-2.2.19]$<\/pre>\n<h1>Installation d&rsquo;Apache<\/h1>\n<p style=\"text-align: justify;\">Voil\u00e0, notre serveur Apache est compil\u00e9. Il ne reste plus qu&rsquo;\u00e0 l&rsquo;installer. Lors de la configuration, j&rsquo;ai pr\u00e9cis\u00e9 l&rsquo;option <code>\"--prefix=\/server\"<\/code>. Ceci signifie que l&rsquo;installation devra se faire dans le r\u00e9pertoire <code>\/server<\/code>.\u00a0En principe, nous devrions pouvoir pr\u00e9parer l&rsquo;installation sur notre h\u00f4te de compilation en choisissant un r\u00e9pertoire local ainsi&nbsp;:<\/p>\n<pre>$ make DESTDIR=~\/Projets\/Panda\/Target\/  install<\/pre>\n<p style=\"text-align: justify;\">Toutefois, Apache n&rsquo;est pas vraiment pr\u00e9vu pour la cross-compilation (comment&nbsp;? je l&rsquo;ai d\u00e9j\u00e0 dit&nbsp;?) et le r\u00e9pertoire <code>DESTDIR<\/code> se retrouve mentionn\u00e9 dans les fichiers de configuration g\u00e9n\u00e9r\u00e9s lors de l&rsquo;installation&#8230;\u00a0Pour contourner (un peu l\u00e2chement, j&rsquo;en conviens) ce probl\u00e8me, j&rsquo;ai d\u00e9cid\u00e9 de lancer l&rsquo;installation sur la plateforme de compilation comme si nous \u00e9tions sur la cible (donc dans le r\u00e9pertoire <code>\/server<\/code> de l&rsquo;h\u00f4te).<\/p>\n<pre>[httpd-2.2.19]$ <strong>su<\/strong>\nMot de passe :\n[httpd-2.2.19]# <strong>make install<\/strong>\nMaking install in srclib\nmake[1] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib \u00bb\nMaking install in apr\nmake[2] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/apr \u00bb\nmake[3] : on entre dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19\/srclib\/apr \u00bb\n[...]\nmkdir \/server\/man\nmkdir \/server\/man\/man1\nmkdir \/server\/man\/man8\nmkdir \/server\/manual\nmake[1] : on quitte le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/httpd-2.2.19 \u00bb\n[httpd-2.2.19]# <strong>ls \/server\/<\/strong>\nbin  build  cgi-bin  conf  error  htdocs  icons  include  lib  logs  man  manual  modules\n[httpd-2.2.19]#<\/pre>\n<p style=\"text-align: justify;\">Nous allons le transf\u00e9rer, sous forme d&rsquo;archive zipp\u00e9e sur la cible&nbsp;:<\/p>\n<pre>[httpd-2.2.19]# <strong>cd \/<\/strong>\n[\/]# <strong>tar -czf server.tar.gz server\/<\/strong>\n[\/]# <strong>scp server.tar.gz root@192.168.3.152:\/<\/strong>\nroot@192.168.3.152's password:\nserver.tar.gz                                 100% 5225KB   1.7MB\/s   00:03\n[\/] #<\/pre>\n<p style=\"text-align: justify;\">Connectons-nous sur la cible. Par rapport \u00e0 l&rsquo;article pr\u00e9c\u00e9dent, j&rsquo;ai d\u00e9sactiv\u00e9 le serveur <code>httpd<\/code> de la <em>Busybox<\/em>.<\/p>\n<pre>[\/]# <strong>ssh root@192.168.3.152<\/strong>\nroot@192.168.3.152's password:\n[PANDA \/root]# <strong>cd \/<\/strong>\n[PANDA \/]# <strong>ls<\/strong>\nbin            lib            proc           sys\ndev            linuxrc        root           tmp\netc            lost+found     sbin           usr\nhome           mnt             <strong>server.tar.gz<\/strong>  var\n[PANDA \/]# <strong>tar -xzf server.tar.gz <\/strong>\n[PANDA \/]#<\/pre>\n<h1 style=\"text-align: justify;\">Test du serveur Apache<\/h1>\n<p style=\"text-align: justify;\">Apache s&rsquo;ex\u00e9cute sous l&rsquo;identit\u00e9 <em>daemon<\/em> du groupe <em>daemon<\/em>. Cr\u00e9ons ces comptes, puis lan\u00e7ons le serveur.<\/p>\n<pre>[PANDA \/]# <strong>touch \/etc\/group<\/strong>\n[PANDA \/]# <strong>adduser daemon<\/strong>\nChanging password for daemon\nNew password:\nRetype password:\nPassword for daemon changed by root\n[PANDA \/]# <strong>\/server\/bin\/apachectl start<\/strong>\nhttpd: apr_sockaddr_info_get() failed for (none)\nhttpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName\n[PANDA \/]#<\/pre>\n<p style=\"text-align: justify;\">Les messages ne sont que des avertissements, le serveur a bien d\u00e9marr\u00e9. V\u00e9rifions-le&nbsp;:<\/p>\n<pre>[PANDA \/]# <strong>ps<\/strong>\nPID   USER     TIME   COMMAND\n    1 root       0:01 init\n    2 root       0:00 [kthreadd]\n    3 root       0:00 [ksoftirqd\/0]\n[...]\n 1129 root       0:00 [flush-179:0]\n 1136 root       0:00 dropbear -r \/etc\/dbkey\n 1137 root       0:00 -sh\n 1186 root       0:00 \/server\/bin\/httpd -k start\n 1187 daemon     0:00 \/server\/bin\/httpd -k start\n 1188 daemon     0:00 \/server\/bin\/httpd -k start\n 1189 daemon     0:00 \/server\/bin\/httpd -k start\n 1190 daemon     0:00 \/server\/bin\/httpd -k start\n 1191 daemon     0:00 \/server\/bin\/httpd -k start\n 1192 root       0:00 ps\n[PANDA \/]#<\/pre>\n<p style=\"text-align: justify;\">La meilleure v\u00e9rification va consister \u00e0 lancer un navigateur sur notre h\u00f4te de d\u00e9veloppement, et \u00e0 le faire pointer sur l&rsquo;adresse IP de la cible. Nous devrions voir une page par d\u00e9faut qu&rsquo;Apache a install\u00e9 dans <code>\/server\/htdocs\/index.html<\/code>.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2011\/06\/Capture-httpd.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-864\" title=\"Capture Apache sur Pandaboard\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2011\/06\/Capture-httpd.png\" alt=\"Capture Apache sur Pandaboard\" width=\"400\" height=\"250\" \/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Apr&egrave;s avoir obtenu un syst&egrave;me minimal sur notre carte Pandaboard (voir les articles 1, 2 et 3), nous allons pouvoir l&rsquo;enrichir un peu, en commen&ccedil;ant par un serveur HTTP plus puissant que le pr&eacute;c&eacute;dent&nbsp;: Apache.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8],"tags":[],"class_list":["post-852","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=852"}],"version-history":[{"count":1,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/852\/revisions"}],"predecessor-version":[{"id":3490,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/852\/revisions\/3490"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}