Chinaunix首页 | 论坛 | 博客
  • 博客访问: 385701
  • 博文数量: 115
  • 博客积分: 2501
  • 博客等级: 少校
  • 技术积分: 1009
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-23 17:05
文章分类

全部博文(115)

文章存档

2011年(2)

2010年(86)

2009年(27)

我的朋友

分类: 系统运维

2010-10-28 21:50:51

基于S3C2440的嵌入式Web服务器Boa移植

一、环境介绍

在移植Boa之前,先介绍一下我使用的开发环境和编译环境:

1、虚拟机下安装的Redhat9.0

2、交叉编译工具:arm-linux-gcc-4.3.2(友善之臂提供)

3miin2440开发板;

4、移植使用到的软件:

(1)boa源文件boa-0.94.13.tar.gz,下载地址:

(2)cgicgic205.tar.gz,下载地址:

在主机的opt目录下建立boa目录,将上面的两个文件放到该目录下。

二、配置开发板网络

由于我是自己移植的内核、根文件系统、DM9000E,在移植嵌入式Web服务器boa之前需要在根文件系统中配置网络,我的根文件系统目录是/opt/rootfs,这里设置我的ip地址为192.168.1.123

1rootfs/etc中添加resolv.conf文件

nameserver 192.168.1.1

该文件存放DNS信息

2rootfs/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

s3c2410_serial0   0:5  0666      =ttySAC0

s3c2410_serial1   0:5  0666      =ttySAC1

s3c2410_serial2   0:5  0666      =ttySAC2

s3c2410_serial3   0:5  0666      =ttySAC3

 

# loop devices

loop[0-9]*    0:0  0660      =loop/

 

# i2c devices

i2c-0             0:0  0666      =i2c/0

i2c-1             0:0  0666      =i2c/1

 

# 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库移植

1Boa配置

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

3cgic库配置

解压cgic205.tar.gzboa目录,得到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命令生成capturecgictest.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、测试

    拷贝以上生成的capturecgictest.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

阅读(2311) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-29 14:50:57

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com