分类: 系统运维
2010-10-28 21:50:51
基于S3C2440的嵌入式Web服务器Boa移植
一、环境介绍
在移植Boa之前,先介绍一下我使用的开发环境和编译环境:
1、虚拟机下安装的Redhat9.0;
2、交叉编译工具:arm-linux-gcc-
3、miin2440开发板;
4、移植使用到的软件:
(1)、boa源文件boa-0.94.13.tar.gz,下载地址:;
(2)、cgi库cgic205.tar.gz,下载地址:。
在主机的opt目录下建立boa目录,将上面的两个文件放到该目录下。
二、配置开发板网络
由于我是自己移植的内核、根文件系统、DM9000E,在移植嵌入式Web服务器boa之前需要在根文件系统中配置网络,我的根文件系统目录是/opt/rootfs,这里设置我的ip地址为192.168.1.123。
1、rootfs/etc中添加resolv.conf文件
nameserver 192.168.1.1 |
该文件存放DNS信息
2、rootfs/etc中添加net.conf文件
IPADDR=192.168.1.123 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 MAC=10:23:45:67:89:ab |
3、在rootfs/etc/rc.d/init.d目录下添加httpd文件
#!/bin/sh base=boa # See how we were called. case "$1" in start) /usr/sbin/$base ;; stop) pid=`/bin/pidof $base` if [ -n "$pid" ]; then kill -9 $pid fi ;; esac exit 0 |
使用命令chmod +x httpd改变文件属性,该文件为boa服务器的代理。
4、在根文件中sbin目录下添加文件net_set
#!/bin/sh echo Try to bring eth0 interface up ...>/dev/ttySAC0 if [ -f /etc/net.conf ] ; then source /etc/net.conf ifconfig eth0 down ifconfig eth0 hw ether $MAC echo ifconfig eth0 hw ether $MAC >/dev/ttySAC0 ifconfig eth0 $IPADDR netmask $NETMASK up echo ifconfig eth0 $IPADDR netmask $NETMASK up >/dev/ttySAC0 route add default gw $GATEWAY echo add default gw $GATEWAY >/dev/ttySAC0 else ifconfig eth0 hw ether 10:23:45:67:89:ab ifconfig eth0 192.168.1.123 netmask 255.255.255.0 up route add default gw 192.168.1.1 echo ifconfig eth0 hw ether 10:23:45:67:89:ab >/dev/ttySAC0 echo ifconfig eth0 192.168.1.123 netmask 255.255.255.0 up >/dev/ttySAC0 echo route add default gw 192.168.1.1 >/dev/ttySAC0 fi echo Done > /dev/ttySAC0 |
通过命令chmod +x net_set改变该文件属性具有可执行。
5、我的文件系统中使用mdev创建设备文件,etc/mdev.conf文件如下:
# system all-writable devices full 0:0 0666 null 0:0 0666 ptmx 0:0 0666 random 0:0 0666 tty 0:0 0666 zero 0:0 0666 # console devices tty[0-9]* 0:5 0660 vc/[0-9]* 0:5 0660 # serial port devices s s s s # loop devices loop[0-9]* 0:0 0660 =loop/ # i i i # frame buffer devices fb[0-9] 0:0 0666 # input devices mice 0:0 0660 =input/ mouse.* 0:0 0660 =input/ event.* 0:0 0660 =input/ ts.* 0:0 0660 =input/ # rtc devices rtc0 0:0 0644 >rtc rtc[1-9] 0:0 0644 # misc devices mmcblk0p1 0:0 0600 =sdcard */bin/hotplug sda1 0:0 0600 =udisk * /bin/hotplug |
6、在根文件系统的etc/init.d/rcS文件中添加如下:
… echo "network interface">/dev/console /sbin/ifconfig lo 127.0.0.1 echo "start net_set">/dev/console net_set & sleep 1 echo "start httpd">/dev/console /etc/rc.d/init.d/httpd start |
三、Boa服务器和cgic库移植
1、Boa配置
将boa-0.94.13.tar.gz解压到boa目录下得到boa-0.94.13目录,进入boa-0.94.13/src目录,执行./configure,然后在src目录下生成Makefile文件,打开Makefile文件,做如下修改:
CC=gcc 改为:CC=arm-linux-gcc CPP=gcc –E 改为:CPP=arm-linux-gcc -E |
2、编译并优化
在src目录下执行make命令,将在src目录下生成boa可执行文件,可去掉boa的调试信息对其进行优化,执行命令arm-linux-strip boa后,boa变得只有60k不到大小。
我make时出现“util.c: 100: 1: pasting “t” and “->” does not give valid preprocessing token make”的错误提示,改动compat.h文件:
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff 改为: #define TIMEZONE_OFFSET(foo) foo->tm_gmtoff |
3、cgic库配置
解压cgic205.tar.gz到boa目录,得到cgic205目录,进入该目录修改Makefile文件的一下内容:
CC=gcc 改为CC=arm-linux-gcc AR=ar 改为AR=arm-linux-ar RANLIB=ranlib 改为RANLIB=arm-linux-ranlib gcc cgictest.o -o cgictest.cgi ${LIBS} 改为:$(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS} gcc capture.o -o capture ${LIBS} 改为:$(CC) $(CFLAGS) capture.o -o capture.cgi ${LIBS} |
4、编译和优化
执行make命令生成capture和cgictest.cgi文件,执行arm-linux-strip capture命令对生成的capture文件进行优化,减小大小。
5、配置boa服务器及可能出现的问题
boa-0.94.13目录下已经有了boa的默认配置,在此基础上修改。在rootfs/etc目录下新建boa目录,并使用命令chmod +x boa改变文件属性,将boa-0.94.13/boa.conf拷贝到rootfs/etc/boa目录下,修改后内容如下:
Port 80 User root Group root ErrorLog /www/log/boa/error_log AccessLog /www/log/boa/error_log ServerName DocumentRoot /www DirectoryIndex index.html KeepAliveMax 1000 KeepAliveTimeout 10 MimeTypes /etc/mime.types DefaultType text/plain CGIPath /bin:/usr/bin:/usr/sbin:/sbin ScriptAlias /cgi-bin/ /www/cgi-bin/ |
其中的一些设置的说明和可能出现的错误情况分析如下:
(1)、Port 80
监听的端口号,默认都是80,无需修改。
(2)、User root
User后面对应一个用户
(3)、Group root
Group对应group文件中一个组
(4)、ErrorLog /www/log/boa/error_log
错误日志存放的文件,我的根文件系统中已建立了/www目录,改变其属性:
chmod 777 /www
mkdir –m 777 /www/cgi-bin
mkdir /www/log
mkdir /www/log/boa
cd /www/log/boa
vi error_log,保存退出
error_log记录了boa的运行日志,如果发现运行错误通过cat /www/log/boa/error_log就可查看错误信息。
(5)、AccessLog /www/log/boa/error_log
访问日志文件
(6)、ServerName
该项默认是注释掉的,ServerName后面的内容任意取。该项必须打开,否则运行boa时会异常退出,提示“gethostbyname::No such file or directory”。
(7)、DocumentRoot /www
存放HTML文档的主目录,这里对应我的根文件系统的www目录。
(8)、DirectoryIndex index.html
HTML目录索引的文件名。
(9)、KeepAliveMax 1000
一个连接所允许的HTTP持续作用请求最大数目,注释或设为0都将关闭HTTP持续作用。
(10)、KeepAliveTimeout 10
HTTP持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接。
(11)、MimeTypes /etc/mime.types
指明mime.types的位置。
(12)、DefaultType text/plain
文件扩展名没有或未知的话,使用的缺省MIME类型。
(13)、CGIPath /bin:/usr/bin:/usr/sbin:/sbin
提供CGI程序的PATH环境变量值。
(14)、ScriptAlias /cgi-bin/ /www/cgi-bin/
指明CGI脚本的虚拟路径对应的实际路径,/www/cgi-bin/是我的根文件系统的目录。
拷贝主机/etc/mime.types文件到根文件系统的etc目录下。
四、测试与出错处理
1、测试
拷贝以上生成的capture和cgictest.cgi可执行文件到根文件系统的www/cgi-bin目录下,将index.html拷贝至根文件系统的www目录下。
在浏览器输入,如果打开了index.html页面则Web服务器移成功;浏览器输入,如果打开了cgi测试网页则cgic库移植成功。
2、出错处理
移植后的boa在开发板上运行时,出现过一些问题:
(1)、boa.c:194 - unable to bind: Address already in use
解决办法:用ps命令查看哪个进程占用该端口,然后用kill指令杀死该进程,然后在终端输入boa,能够打开Web服务器页面了,串口终端看到如下打印信息:
[01/Jan/1970:00:00:11 +0000] boa: server version Boa/0.94.13
[01/Jan/1970:00:00:11 +0000] boa: server built Aug 14 2009 at 21:43:11.
[01/Jan/1970:00:00:11 +0000] boa: starting server pid=852, port 80
我重启后再没有发现“boa.c:194 - unable to bind: Address already in use”的错误信息,并且能够在浏览器打开Web服务器页面。
另外,网上一些文章中写了出现诸如“log.c:73 unable to dup2 the error log:bad file descriptor”的错误信息时,采取的措施是到log.c找到执行打印该信息的语句处将其屏蔽,这种做法是错误的,程序本来是检测错误信息的,被屏蔽后连错误信息都看不到了,其实是没找到错误。
邮箱:swu2005@126.com
chinaunix网友2010-10-29 14:50:57
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com