嵌入式linux项目开发(一)——BOA移植

嵌入式linux项目开发(一)——BOA移植

项目目标:使用BOA、CGIC、SQLite搭建嵌入式web服务器

一、嵌入式web服务器BOA简介

在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器,能够生成动态页面,在用户端只需要通过Web浏览器就可以对嵌入式设备进行管理和监控,使用极为方便。

目前嵌入式设备中所使用的web服务器主要有:boa、thttpd、mini_httpd、shttpd、lighttpd、goaheand、appweb和apache等。

BOA是Paul Philips在1991年开发的开源的嵌入式web服务器,BOA功能强大,支持认证,CGI等,应用广泛,特别适合于嵌入式设备。与传统的web服务器为每个访问连接开启一个进程不同,BOA是一个单任务的web服务器,不会为多个连接开启多个任务进程。BOA对所有的活动的http连接在内部进行处理,而且只为每个CGI连接(独立的进程)开启新的进程。因此,BOA在同等硬件条件下显示出更快的速度。测试表明boa在Pentium 300MHZ下能够每秒钟处理几千次点击,在20 MHz 386/SX下能够每秒钟处理几十次点击访问。

BOA与apache等高性能web服务器主要区别是,BOA是单进程的服务器,只有在完成一个用户请求后才能响应另一个用户的请求,无法并发响应,在嵌入式设备的应用场合里已经足够。

BOA是一个非常小巧的Web服务器,可执行代码只有约60KB,是一个单任务Web服务器,只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求;但BOA支持CGI,能够为CGI程序fork出一个进程来执行。

BOA的设计目标是速度和安全,是指不被恶意用户暗中破坏,而不是指它有很好的访问控制和通信加密。可以添加SSL来保证数据传输中的保密和安全。在其站点公布的性能测试中,BOA的性能要好于Apache服务器。

BOA官方网站:www.boa.org

二、嵌入式BOA服务器编译

1、下载BOA源码

从www.boa.org下载boa-0.94.13.tar.gz源码

2、生成配置文件

在BOA顶层目录src下运行./configure

3、修改Makefile文件

修改Makefile文件中的交叉编译工具选项

CC = arm-linux-gcc

CPP = arm-linux-gcc–E

LDFLAGS = -static

4、修改boa.c文件

将boa.c文件中的一下内容注释

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

5、修改compat.h文件

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
    修改成
    #define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

6、修改config.c文件

将if(!server_name){..........}内容注释,位于266-286行

不注释会报错:gethostbyname:: Resource temporarily unavailable

7、修改log.c文件

注释掉以下内容

if (dup2(error_log, STDERR_FILENO) == -1) {

DIE("unable to dup2 the error log");

}

不注释会报错:unable to dup2 the error log:bad file descriptor

8、编译

make

9、去除调试信息

arm-linux-strip boa

10、修改执行权限

chmod 777 boa

三、BOA服务器配置

1、boa.conf文件解析

#监听的端口

Port 80

#服务器绑定的IP地址,注释掉表示绑定到INADDR_ANY,适配服务器所有的IP

#Listen 192.68.0.5

#服务器运行的用户和组

#User o

User 0

#Group o

Group 0

#当服务器发生问题时发送报警的email地址

#ServerAdmin [email protected]

#错误日志文件

ErrorLog /var/log/boa/error_log

#访问日志文件

AccessLog /var/log/boa/access_log

#是否使用本地时间。如果没注释掉,则使用本地时间。注释掉则使用UTC时间

#UseLocaltime

#是否记录CGI运行信息

#VerboseCGILogs

#服务器名字

ServerNamewww.hyes.com

#是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web服务器

#VirtualHost

#非常重要,HTML文档的主目录

DocumentRoot /var/www

#如果收到一个用户请求的话,在用户主目录后再增加的目录名

UserDir public_html

#HTML目录索引的文件名

DirectoryIndex index.html

#一个连接所允许的HTTP持续作用请求最大数目

KeepAliveMax 1000

#HTTP持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接

KeepAliveTimeout 10

#指明mime.types文件位置

MimeTypes /etc/mime.types

#文件扩展名没有或未知的话,使用的缺省MIME类型

DefaultType text/plain

#提供CGI程序的PATH环境变量值

CGIPath /bin:/usr/bin:/usr/local/bin

#为路径加上别名

Alias /doc /usr/doc

#指明CGI脚本的虚拟路径对应的实际路径

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

2、其他文件移植

从linux的etc目录拷贝mime.types、passwd、group文件到开发板系统的etc目录

创建web服务器HTML文档的主目录/var/www

创建CGI脚本所在目录/var/www/cgi-bin/

四、BOA移植过程中错误的解决方案

1、gethostbyname:: No such file or directory

解决办法: 修改boa.conf   去掉 ServerName www.your.org.here 前的注释符号(#)

2、util.c:100:1: error: pasting "t" and "->"does not give a valid preprocessing token make: *** [util.o]

解决办法:

修改 src/compat.h

   #defineTIMEZONE_OFFSET(foo) foo##->tm_gmtoff

   修改成

   #defineTIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

3、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 0

if (passwdbuf == NULL) {

   DIE(”getpwuid”);

   }

   if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {

   DIE(”initgroups”);

   }

  #endif

4、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

5、log.c:73 unable to dup2 the error log:bad file descriptor

解决方法:

修改src/log.c

  注释掉

  if(dup2(error_log, STDERR_FILENO) == -1) {

  DIE("unableto dup2 the error log");

  }

  即修改为:

  #if 0

if (dup2(error_log, STDERR_FILENO) == -1) {

  DIE("unable to dup2 the error log");

   }

#endif

6、执行boa程序报错not found

解决方法:

修改Makefile

LDFLAGS = -static

时间: 2024-07-28 19:48:25

嵌入式linux项目开发(一)——BOA移植的相关文章

嵌入式linux 项目开发(一)——CGIC编程

嵌入式linux 项目开发(一)--CGIC编程 一.CGIC简介 1.CGI简介 CGI(Common Gateway Interface)是外部应用扩展应用程序与WWW服务器交互的一个标准接口.按照CGI标准编写的外部扩展应用程序可以处理客户端浏览器输入的数据,从而完成客户端与服务器的交互操作.而CGI规范就定义了Web服务器如何向扩展应用程序发送消息,在收到扩展应用程序的信息后又如何进行处理等内容.通 过CGI可以提供许多静态的HTML网页无法实现的功能,比如搜索引擎.基于Web的数据库访

嵌入式linux 项目开发(一)——SQLite数据库

嵌入式linux 项目开发(一)--SQLite数据库 一.SQLite数据库简介 SQLite是一个开源的嵌入式关系数据库,是一种轻量级的.自给自足的.无服务器的.无需配置的.事务性的SQL数据库引擎,其特点是高度便携.使用方便.结构紧凑.高效.可靠,体积小,支持 ACID(原子性.一致性.独立性及持久性Atomicity.Consistency.Isolation.Durability)事物. SQLite官网:http://www.sqlite.org/ SQLite数据库采用模块化设计,

嵌入式linux 项目开发(一)——HTML编程

嵌入式linux 项目开发(一)--HTML编程 本文主要讲解HTML的基础知识,主要是涉及嵌入式web服务器中数据交互HTML页面表单制作部分. 一.HTML简介 HTML是Hypertext Marked Language的简称,即超文本标记语言,是一种用来制作超文本文档的简单标记语言.HTML是由WEB的发明者Tim Berners-Lee和同事Daniel W.Connolly于1990年创立的一种标记式语言,是标准通用化标记语言SGML的应用. 用HTML编写的超文本文档称为HTML文

【华嵌】承接嵌入式&APP项目开发

武汉华嵌科技有限公司 项目开发范围:                                                                                              一.移动互联APP方向 1.Android 手机APP开发: 2.iOS手机APP开发: 3.HTML5移动互联APP开发 二.嵌入式系统方向 1.ARM+Linux方向的应用程序.系统移植与底层驱动开发: 2.单片机51系列.avr系列.msp430系列软硬件项目开发: 3

嵌入式linux QT开发(一)——QT简介

嵌入式linux QT开发(一)--QT简介 一.QT简介 1.QT简介 QT是一个跨平台的C++图形用户界面库,由挪威TrollTech公司出品,目前包括Qt Creator, QtEmbedded,Qt Designer快速开发工具,Qt Linguist国际化工具等部分,Qt支持所有Linux/Unix系统,还支持Windows平台. 2.QT优点 Qt是一个跨平台的C++图形用户界面应用程序框架,提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能.Qt很容易扩展,并且允许真正地组

嵌入式Linux裸机开发(十六)——shell实现

嵌入式Linux裸机开发(十六)--shell实现 一.shell简介 Shell是用户与操作系统之间的接口,为用户提供了使用操作系统的接口. 1.图形界面shell 图形界面shell(Graphical User Interface shell 即 GUI shell) 应用最为广泛图形界面shell是Windows Explorer(微软的windows系列操作系统)和Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxB

嵌入式linux QT开发(四)——QT Creator工程管理

嵌入式linux QT开发(四)--QT Creator工程管理 一.QT Creator工程管理 QT Creator以工程项目的方式对源码进行管理,一个QT工程中包含不同类型的文件如下: A..pro项目描述文件 B..pro.user用户描述文件 C..h头文件 D..cpp源文件 E..ui界面描述文件 F.资源文件(图片.音频等) 二..pro项目描述文件 1..pro项目描述文件基本构成如下: A.#注释起始符 B.QT模块声明 C.TARGET可执行文件名 D.TEMPLATE程序

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

如何使用eclipse进行嵌入式Linux的开发

如何使用eclipse进行嵌入式Linux的开发 作者:曾宏安,华清远见嵌入式学院高级讲师. 如何使用eclipse进行嵌入式Linux的开发 习惯了在windows环境下开发的程序员在转到Linux平台时经常会抱怨没有一个好用的集成开发环境.和windows下常用的一些开发软件相比,Linux自带的一些开发环境使用起来要么界面和操作不够方便.友好,要么功能不全.其实我们完全可以在开源社区上找到操作方便,功能强大的开发环境.下面就向大家介绍一个能在Linux上运行,界面和功能与windows上同