嵌入式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服务器编译

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 root@localhost

#错误日志文件

ErrorLog /var/log/boa/error_log

#访问日志文件

AccessLog /var/log/boa/access_log

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

#UseLocaltime

#是否记录CGI运行信息

#VerboseCGILogs

#服务器名字

#是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的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

嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植相关推荐

  1. linux mipi驱动分析_嵌入式技术在血液分析仪中的应用方案

    谈到血细胞计数仪的发展史,不得不提到在这个领域首开先河的人. 他是1912 年出生在美国阿肯色州一个小城的人Wallance H. Coulter,最初是一位广播电台的电器工程师,后来做过X光机的销售 ...

  2. linux 远程挂载摄像头_基于Linux的嵌入式网络摄像机设计

    本嵌入式网络摄像机采用高性能ARM9芯片微处理器,内置嵌入式Web服务器. 通过嵌入式多任务操作系统采集摄像机视频数据:采集的视频信号数字化后经MJPEG算法压缩,再通过内部总线送到内置的Web服务器 ...

  3. 嵌入式linux的运行过程,ARM嵌入式设备Linux系统启动步骤和方式

    > 1). 简介本文引用地址:http://www.eepw.com.cn/article/201607/294237.htm 本文简单介绍ARM嵌入式设备基于嵌入式Linux操作系统时候的启动 ...

  4. rhel系统启动过程_技术|Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  5. linux配置usb主从_基于Linux的USB主/从设备之间的三种通信方式

    随着简单易用的USB接口日益流行,在嵌入式系统中添加对USB接口的支持已成为大势所趋.本文通过介绍Linux中支持USB的各种模块和库,分析了在Linux上利用USB实现高速串口和以太网连接等通信方式 ...

  6. linux配置usb主从_基于Linux的USB 主/从设备之间通讯的三种方式

    转载:http://archive.eet-china.com/www.eet-china.com/ART_8800323770_617693_TA_eda530e7.HTM 随着简单易用的USB接口 ...

  7. linux 复制包括子目录_【Linux分享】Linux常用命令+教程分享

    今天分享分为两部分 :)PART01 Linux常用命令分享/PART02 关于BD面试经验分享    30mins  Linux Command:PART 1 你本可以张口就来.....本篇内容分享 ...

  8. linux 邮件开源工具_使用Linux和开源工具编写剧本

    linux 邮件开源工具 早在今年5月,Jason van Gumster编写了4个开源工具来编写您的下一个剧本 . 它包括一些我以前从未听说过的工具,一些我非常熟悉的工具,并且缺少一些我自己喜欢的工 ...

  9. g++ linux 编译开栈_使用 linux kernel +busybox 定制linux系统

    写在开头: 本来是想使用linux kernel +busybox 制作一个教程的,后来快要结束的时候,死活找不到硬盘,我了解很多文章都有类似的,但是没有谈到硬盘找不到问题,最后历经艰辛,终于把问题解 ...

最新文章

  1. 液压系统管路流速推荐表_液压系统管道尺寸的计算
  2. Python-opencv实现视频与图片的相互转换
  3. javascript 常用方法
  4. laravel 5.5 整合 jwt 报错Method Tymon\JWTAuth\Commands\JWTGenerateCommand::handle() does not exist解决...
  5. SQL Server as(给查询结果指定列名)
  6. POSIX定时器Timer
  7. java中for循环快捷方式_IntelliJ IDEA(快捷键):快速生成各种for循环(示例代码)...
  8. python对文件操作实例_Python对文件文件夹的操作实例
  9. 图论算法——加权有向图的数据结构
  10. php yii 控件分页,yii2.0-分页应用实例
  11. 数据结构之简单排序算法
  12. sun java认证真题,sun scjp考试心得_java认证
  13. Java工具类之Base64Utils实现base64码转换为文件流-yellowcong
  14. BZOJ3717 [PA2014]Pakowanie
  15. 加载java ie停止工作_IE报错“Internet Explorer 已停止工作”的解决方法
  16. 数据库基础知识(1)--数据库php连接
  17. 《读书是一辈子的事》上篇 认识自己
  18. 胡谨的个人简介及一生
  19. 思一独角兽好朋友群活动回顾——IBCA国际区块链与数字货币协会
  20. LeetCode 417. 太平洋大西洋水流问题 JAVA dfs

热门文章

  1. spring 事务隔离级别和传播行为_Spring事务的传播行为案例分析
  2. tf.train.Coordinator和tf.train.start_queue_runners
  3. 数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF
  4. Python中的字典dict
  5. C/C++程序从源代码到可执行程序的流程
  6. Spring Data JPA 从入门到精通~JpaSpecificationExecutor实现原理
  7. javascript 数字精度问题
  8. php ie 下载 乱码,php ie下载文件名乱码怎么办
  9. 机器人暮色枪骑皮肤_吃鸡幸运新转盘:新载具皮肤和纸盒武器皮肤!
  10. 外设驱动库开发笔记36:NTC负温度系数热电阻测温驱动