分类:
2012-09-24 17:30:13
原文地址:嵌入式web服务器boa的编译移植 作者:pengtgimust
Linux下Boa服务器移植,交叉编译boa并成功移植到FL2440开发板上,并且CGI程序运行正常。
主机环境:redhat9
交叉编译器:arm-linux-gcc 3.4.1
BOA版本:0.94.13
平台:s3c2440
一:下载源码:从官方网站下载源码,并将源码放置在/src 目录下。
[root@ EmbedSky ~]# cd /usr/src 进入源码目录
[root@ EmbedSky src]# tar zxvf boa-0.94.13.tar.tar 解压源码压缩包
[root@ EmbedSky src]# cd boa-0.94.13 进入源码解压包
[root@ EmbedSky boa-0.94.13]# cd src
[root@ EmbedSky src]# ./configure 生成makefile
二:编译前修改的文件:
1. 修改Makefile文件,找到CC=gcc和CPP=gcc -E,分别将其改为交叉编译器安装的路径:
CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc
CPP=/usr/local/arm/2.95.3/bin/arm-linux-g++
保存退出。
2. 修改编译方式:
LDFLAGS = -g –static
注: 使用静态编译可以让目标文件自动的包含所需要的
库文件,而动态编译需要手工拷贝库文件。
3.修改/src/defines.h文件:
#define SERVER_ROOT "/etc/boa"
4 修改boa-0.94/src/ util.c文件
修改char *get_commonlog_time(void)函数。
time_offset = 0;
5. 修改src/config.c:加Current_uid=1
6. 修改compat.h: 把第120 行的
#define
TIMEZONE_OFFSET(foo)foo##->tm_gmtoff
修改为:
#define
TIMEZONE_OFFSET(foo)foo->tm_gmtoff
7.修改/src/boa.c,注释掉下面两行:
/* if (setuid(0) != -1) {
DIE("icky Linux kernel bug!")} */
/*if (passwdbuf == NULL) {
DIE("getpwuid"); }*/
8 gethostbyname:: Resource temporarily unavailable
这个问题我也遇到过,我只是把src文件夹下的config.c里的if(!server_name){..........}(大概在266行到286行之间)注释掉,就能运行在板子上运行boa。
解决:config.c
/*if (!server_name) {
struct hostent *he;
char temp_name[100];
if (gethostname(temp_name, 100) == -1) {
perror("gethostname:");
exit(1); }
he = gethostbyname(temp_name);
if (he == NULL) {
perror("gethostbyname:");
exit(1); }
server_name = strdup(he->h_name);
if (server_name == NULL) {
perror("strdup:");
exit(1);} }*/
9. /src/log.c中的修改:注释掉:
/* if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
} */
10. 在boa.conf中的修改:
(1) ServerName的设置
修改#ServerName
为 ServerName
注意:该项默认为未打开,执行Boa会异常退出,提示“gethostbyname::No such file or directory”,所以必须打开。其它默认设置即可。
注意:以下是为改为下面这样的:
(2)User与Group的修改:
User 0
Group 0
(3)ErrorLog /var/log/boa/error_log
AccessLog /var/log/boa/access_log
(4)DocumentRoot /var/www
(5)DirectoryIndex index.html
(6)KeepAliveMax 1000
KeepAliveTimeout 10
(7)MimeTypes /etc/mime.types
(8)ScriptAlias /cgi-bin/ /var/www/cgi-bin/
11. 此外,还需要将mime.types文件复制目标板根文件系统/etc目录下,通常可以从linux主机的 /etc目录下直接复制即可。
三:运行make进行编译,得到可执行的程序boa
[root@ EmbedSky boa-0.94.13]# cd /usr/src/boa-0.94.13/src
[root@ EmbedSky src]# make clean
rm -f y.tab.o lex.yy.o alias.o boa.o buffer.o cgi.o cgi_header.o config.o escape.o get.o hash.o ip.o log.o mmap_cache.o pipe.o queue.o read.o request.o response.o select.o signals.o util.o sublog.o timestamp.o boa core lex.yy.c y.tab.c y.tab.h *~ boa_indexer index_dir.o
[root@EmbedSky src]# make
去掉调试信息: # /usr/src/usr/local/arm/3.4.1/bin/arm-linux-strip boa
四:安装Boa及配置文件的修改:
利用超级终端经串口向arm板传送配置文件。
1. 将编译得出的可执行文件/boa-0.94.13/src中的boa文件,拷到/sbin目录下。
2. 在/var下新建log和www目录:
#cd /var
# mkdir log // 创建日志文件所在目录
# mkdir www //创建HTML文档的主目录
#cd log
# mkdir boa
#cd /var/www
# mkdir cgi-bin //创建CGI脚本所在录
#mkdir img //创建图片所在目录
将index.html文件拷到/var/www下
# chmod 777 /var/log/* //文件权限设定777表示所有人都可读、可写、可执行
# chmod 777 /var/www/*
3. 在/etc下新建目录boa
# mkdir /etc/boa
将/boa-0.94.13中的boa.conf文件拷到/etc/boa下
# chmod 777 /etc/boa/*
4.arm板的ip地址的配置:
# ifconfig eth0 172.20.182.92 netmask 255.255.255.0
5.pc机的ip地址设置:
ip address 172.20.182.82
subnet mask 255.255.255.0
default gateway 172.20.182.254
dns servers 61.138.125.65
(pc机的ip网络设置可以直接连上校园网络,只需换上网线即可,方便快捷);
五:运行及功能测试:
# boa&
# [01/Jan/1970:06:59:44 +0000] boa: server version Boa/0.94.13 //版本号
[01/Jan/1970:06:59:44 +0000] foa: server built Dec 12 2011 at 16:54:43. //启动时间
[01/Jan/1970:06:59:44 +0000] boa: starting server pid=573, port 80 //进程号573 端口80
[1] + Done boa
# ps //显示所有进程
PID Uid VSZ Stat Command
1 root 1816 SW init
2 root SWN [ksoftirqd/0]
3 root SW< [events/0]
4 root SW< [khelper]
5 root SW< [kthread]
21 root SW< [kblockd/0]
24 root SW [khubd]
77 root SW [pdflush]
78 root SW [pdflush]
80 root SW< [aio/0]
79 root SW [kswapd0]
286 root SW [kseriod]
340 root SW [mtdblockd]
376 root SW< [krfcommd]
396 root 19844 SW ./qpe
397 root $ 1828 SW -sh
398 root 1816 SW init
414 root 9008 SW< /usr/bin/qss
456 root 1820 SW /bin/sh
538 root 13096 SWN /usr/bin/quicklauncher
573 root 2116 SW boa // boa服务器移植运行成功!!!
574 root 1820 RW ps
网线接入:
# eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1
[01/Jan/1970:07:00:37 +0000] request from 172.20.182.82 "GET /images/bg01.gif HTTP/1.5" ("/var/www/images/bg01.gif"): document open: No such file or directory
[01/Jan/1970:07:00:42 +0000] request from 172.20.182.82 "GET /favicon.ico HTTP/1.1" ("/var/www/favicon.ico"): document open: No such file or directory
[01/Jan/1970:07:01:50 +0000] request from 172.20.182.82 "GET /images/bg01.gif HTTP/1.1" ("/var/www/images/bg01.gif"): document open: No such file or director}
[01/Jan/1970:07:01:53 +0000] request from 172.20.182.82 "GET /favicon.ico HTTP/1.1" ("/var/www/favicon.ico"): document open: No such file or directory
[01/Jan/1970:07:03:10 +0000] request from 172.20.182.82 "GET /favicon.ico HTTP/1
.1" ("/var/www/favicon.ico"): document open: No such file or directory
静态网页测试:将静态网页存入根文件系统的/var/www目录下
打开IE浏览器,输入网址: http://172.20.182.91/pengtiegang.html
重新输入网址: http://172.20.182.92/index.html
CGI功能测试:将交叉编译好的cgictest.cgi测试程序存入根文件系统的/var/www/cgi-bin/下
再次输入:http://172.20.182.92/cgi-bin/cgictest.cgi
结果如下所示:
PC机上可以看到/var/www目录下的网页 和运行/var/www/cgi-bin/目录下的CGI程序顺畅。
中途出现的问题:出现内存错误的有下列几种
1. 文件系统中的库不全,有人用开发板自带的库就可以,后来调整自己文件系统的库
2. 函数指针错误,修改源码过程造成
3. 交叉编译器问题,就如这个。
重新编译:
[root@localhost src]# make clean
[root@localhost src]# make
bison -y -d boa_grammar.y
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I. -c -o y.tab.o y.tab.c
y.tab.c: In function `yyparse':
y.tab.c:1295: warning: implicit declaration of function `yylex'
flex boa_lexer.l
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I. -c -o lex.yy.o lex.yy.c
..............................
lex.yy.c:1246: warning: 'yyunput' defined but not used
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I. -c -o alias.o alias.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I. -c -o boa.o boa.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I. -c -o buffer.o buffer.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I. -c -o cgi.o cgi.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I. -c -o cgi_header.o cgi_header.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I. -c -o config.o config.c
................
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I. -c -o index_dir.o index_dir.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -o boa_indexer index_dir.o escape.o -g -static
六:将重新编译的可执行文件拷到共享目录/home/boa下,执行:
# ./boa
eth0: Transmit buffer not free!
eth0: Transmit buffer not free!
eth0: Transmit buffer not free!
eth0: Transmit buffer not free!
[01/Jan/1970:00:38:05 +0000] boa: server version Boa/0.94.13
[01/Jan/1970:00:38:05 +0000] boa: server built May 11 2009 at 18:21:02.
[01/Jan/1970:00:38:05 +0000] boa: starting server pid=343, port 80
[root@(none) boa]# [01/Jan/1970:00:39:43 +0000] request from 10.10.205.154 "GETy
[01/Jan/1970:00:39:43 +0000] request from 10.10.205.154 "GET /stylesheet-imagesy
Boa服务器目录:
小结:
Boa服务器在此系统中负责的是接收来自网页的HTTP请求,根据请求调用相关的串口发送应用程序。同时接收servfox传来的现场截图,通过无线网络一帧一帧再传送回浏览器端。在浏览器端形成连续的视频画面。Boa的移植主要工作是对源码的修改交叉编译再调试。配置相关的脚本,使其在Linux系统中正常工作。