boa移植

来源:互联网 发布:网络高科技股 编辑:程序博客网 时间:2024/05/17 01:46

boa移植

       这次前后用了8天的时间才对boa服务器的移植有了一定的了解和认识。在移植的过程中几乎可以说每运行一个命令就会有一个错误在等着。下面是在本次学习中的具体步骤,问题和解决方案:

一、在网上了解什么是boa,它的作用是什么,有什么好处:

       BOA 服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的http服务器。源代码开放、性能高,稳定性好。由于它是一个单任务的Web服务器,只能一次完成用户的请求,而不会fork出新的程来处理并发的链接请求。但是Boa支持Cgi,能够为Cgi程序fork出一个进程来执行相应的客户请求。

       在μClinux中常用的Web服务器有:Boa,thttpd,httpd,其中httpd只支持静态页面,显然不适合高级应用,thttpd和Boa所提供的功能基本一样,但是thttpd在运行过程中所需要的资源要远大于Boa,因此使用Boa作为该嵌入式系统的Web服务器。系统的软件开发模型选用B/S模型。

       Boa是一个高性能的单任务型Web服务器,可以运行在几乎所有的类Unix的平台上,Boa支持认证,支持CGI,功能比较全,占用资源也少,非常适合于用在资源有限的嵌入式系统中,目前Boa已经以源码的形式包含在μClinux的发行包中。

       简单地说就是,boa是一种小型,简单,迅速和安全的服务器。非常适合嵌入式系统的开发和使用。目前的大多智能系统,如:智能家居和智能医疗都是使用boa服务器来实现的。

二、boa移植的具体步骤:

1、从[www.boa.org]下载下载Boa源码,我所使用的版本为0.94.13,将其解压并进入源码目录的src,生成 Makefile文件

li31@ubuntu:~$ tar -xzvf boa-0.94.13.tar.gzli31@ubuntu:~/boa-0.94.13$ cd src/li31@ubuntu:~/boa-0.94.13/src$ li31@ubuntu:~/boa-0.94.13/src$ ./configure

在这里要注意 tar 的使用。要根据不同的压缩文件使用不同的命令,否则只会报错。

2、修改Makefile文件(此时是在虚拟机上进行测试,因此不需要修改,后面在往板子上移植时会进行具体的修改),然后make进行编译得到boa可执行文件。

li31@ubuntu:~/boa-0.94.13/src$ make

由于我的虚拟机是新的,所以出了很多平时网上见不到的错误:

错误一:
util.c: 100: 1: pasting “t” and “->” does not give a valid preprocessing tokenmake: [util.o] Error1

解决方法:
方法1>. 修改compat.h中的

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff

为:

#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

方法2>. 改用2.95.3版本的编译器。

错误二:
yacc  -d boa_grammar.ymake: yacc: Command not foundmake: *** [y.tab.c] Error 127

编译一个linux下的c系统,包含词法和语法分析模块,Linux上用bison和flex。
yacc是一个文法分析器的生成器,bison即是yacc的GNU版本.Lex和YACC是用于构造词法分析机和语法解释器的工具,利用Lex和yacc你可以轻松的构造一个语法解释器。
解决方法:

sudo apt-get install flex bison

如果这个方法不能解决,那就先运行一下:

sudo apt-get update

然后再使用上面的命令解决问题。

错误三:
boa.c:211 - getpwuid: No such file or directory

解决办法:修改src/boa.c

注释掉下面这段程序:

if (passwdbuf == NULL) {DIE(”getpwuid”);}if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {DIE(”initgroups”);}

即修改为:

#if 0if (passwdbuf == NULL) {DIE(”getpwuid”);}if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {DIE(”initgroups”);}#endif
错误四:
boa.c:228 - icky Linux kernel bug!: No such file or directory

解决办法: 修改src/boa.c

注释掉下面语句:

if(setuid(0) != -1) {DIE(”icky Linux kernel bug!”);}

即修改为:
#if 0
if(setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
#endif

错误五:
log.c:73 unable to dup2 the error log:bad file descriptor

解决方法:
方法1> 确定日志目录对与所有用户都具有可读/写的权限
方法2> 修改src/log.c (建议采用方法1)
注释掉

if(dup2(error_log, STDERR_FILENO) == -1) {DIE("unableto dup2 the error log");}  

即修改为:

#if 0if (dup2(error_log, STDERR_FILENO) == -1) {DIE("unable to dup2 the error log");}#endif

3、在得到boa可执行文件后,在根目录的/etc目录下创建一个boa文件夹,再将boa.conf文件拷贝到boa文件下,同时创建var文件夹:

li31@ubuntu:/$ cd etcli31@ubuntu:/etc$ sudo mkdir boali31@ubuntu:~/boa-0.94.13$ sudo cp boa.conf /etc/boali31@ubuntu:/etc/boa$ sudo mkdir var

将boa.conf文件拷贝过来后要进行一些配置的修改,否则无法启动boa,我的配置如下:

Port 80User 0Group 0ErrorLog /var/log/boa/error_logAccessLog /var/log/boa/access_logDocumentRoot /var/wwwUserDir public_htmlDirectoryIndex index.htmlDirectoryMaker /usr/lib/boa/boa_indexerKeepAliveMax 1000KeepAliveTimeout 10MimeTypes /etc/mime.typesDefaultType text/plainCGIPath /bin:/usr/bin:/usr/local/binAlias /doc /usr/docScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

根据自己的实际路径进行不同的调整。

4、之后按照上面的操作方式,在var 文件夹下创建www文件夹和log文件夹,将boa可执行文件拷贝到var文件夹下。

5、在log文件夹下创建boa文件夹,再在boa文件夹下创建以上俩个文件。

li31@ubuntu:/etc/boa/var/log/boa$ lsaccess_log  error_log

6、在www文件夹下存放自己编写的html测试网页,同时创建cgi_bin文件夹。

a、在网上下载cgic205.tar.gz解压,然后进行以下操作:
li31@ubuntu:~/cgic205$ ./configureli31@ubuntu:~/cgic205$ make
b、将生成的可执行文件capture拷贝到cgi_bin文件夹下
c、编写pass.c测试文件,通过编译生成pass_cgi
li31@ubuntu:/etc/boa/var/www/cgi_bin$ gcc -o pass.cgi pass.c

由于是在虚拟机上测试,所以使用的是 gcc 进行编译。如果是往板子上烧写,需要使用交叉编译环境进行编写。

7、启动boa

li31@ubuntu:/etc/boa/var$ sudo ./boa

如果出现错误,不能启动,在boa.conf在注释掉以下命令,再启动

ErrorLog /var/log/boa/error_logAccessLog /var/log/boa/access_log

观察看错误提示是哪个就注释掉哪个。

8、当这些都完成后在浏览器上输入虚拟机的IP,如(192.168.8.117/pass.html)就会出现自己做的测试页面,可以将cgi文件与html文件配合起来一同测试。

三、移植boa到开发板进行测试

在开发板上测试时需要修改boa.conf文件的俩行代码,具体有时间在写。。。。。。

原创粉丝点击