本次移植的主要参考资料:
1、 《嵌入式Web服务器移植 》 是网上一份Boa移植文档,比较全面。本文档就是基本参照它来写的。基本上上可以说是这篇文章的修改版,增加了我的移植经验。由于这篇文章被转载得到处都是,我实在无法找到出处。在这里衷心的感谢文章作者!!我所做的修改和遇到的问题将在文章最后贴出来。
2、 《构建嵌入式Linux系统》 的第十章 设置网络服务 中的Boa移植部分。
一、Boa程序的移植
1、下载Boa源码
下载地址: http://www.boa.org/
目前最新发行版本: 0.94.13 (几年没更新版本了)
下载 boa-0.94.13.tar.gz,
注意:若从boa上下载的是boa-0.94.13.tar.tar,解压方式一样
解压:
[ tekkamanninja@Tekkaman- Ninja source] $ tar xzf boa- 0. 94. 13. tar. gz |
2、生成Makefile文件
进入boa- 0. 94. 13, 直接运行src/configure文件
[ tekkamanninja@Tekkaman- Ninja src] $./configure |
3、修改Makefile文件(注意:必须用cross-2.95.3, 如使用3.4.1、4.1.1等等会出错)
CC = / home/ tekkamanninja/ working/ source/ 2. 95. 3/ bin/ arm- linux- gcc CPP = / home/ tekkamanninja/ working/ source/ 2. 95. 3/ bin/ arm- linux- gcc - E |
4、交叉编译
[ tekkamanninja@Tekkaman- Ninja src] $ make |
5、去除调试信息,减小体积。(可选)
[ tekkamanninja@Tekkaman- Ninja src] $ / home/ tekkamanninja/ working/ source/ 2. 95. 3/ bin/ arm- linux- strip boa |
6、将编译好的程序放入根文件系统的/bin目录下。
[ tekkamanninja@Tekkaman- Ninja src] $ cp boa / home/ tekkamanninja/ working/nfs/rootfs / bin/ |
二、配置Boa
Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。 在Boa源码目录下已有一个示例boa.conf ,可以在其基础上进行修改。
[ tekkamanninja@Tekkaman- Ninja src] $ cd . . / . . [ tekkamanninja@Tekkaman- Ninja source] $ cd . . / nfs/ rootfs/ etc/ [ tekkamanninja@Tekkaman- Ninja etc] $ mkdir boa [ tekkamanninja@Tekkaman- Ninja etc] $ chmod 777 boa/ [ tekkamanninja@Tekkaman- Ninja etc] $ cd boa [ tekkamanninja@Tekkaman- Ninja boa] $ kwrite boa. conf |
1、Group的修改
修改 Group nogroup
为
Group user (开发板上有的组)
修改 User nobody
为
User boa (user组中的一个成员)
根据你的开发板的情况设定。一定要存在的组和用户。
以下是我在开发板上的操作:
[ root@~ ] # adduser - g user boa Changing password for boa Enter the new password ( minimum of 5, maximum of 8 characters) Please use a combination of upper and lower case letters and numbers. Enter new password: Bad password: too short . Warning: weak password ( continuing) . Re- enter new password: passwd[ 820] : password for `boa' changed by user `root' Password changed. [ root@~ ] # |
2、ScriptAlias的修改
修改 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
为 ScriptAlias /cgi-bin/ /var/www/cgi-bin/
这是在设置CGI的目录,你也可以设置成别的目录。比如用户文件夹下的某个目录。
3、ServerName的设置
修改 #ServerName www.your.org.here
为 ServerName www.your.org.here
注意:该项默认为未打开,执行Boa会异常退出,提示“gethostbyname::No such file or directory”,所以必须打开。其它默认设置即可。你也可以设置为你自己想要的名字。比如我设置为: ServerName tekkaman2440
此外,还需要:
将mime.types 文件复制/etc 目录下,通常可以从linux主机的 /etc目录下直接复制即可。
(以下配置和boa.conf 的配置有关)
创建日志文件所在目录/var/log/boa
创建HTML文档的主目录/var/www
创建CGI脚本所在录 /var/www/cgi-bin
[ tekkamanninja@Tekkaman- Ninja log ] $ mkdir - m 777 boa [ tekkamanninja@Tekkaman- Ninja log ] $ cd . . [ tekkamanninja@Tekkaman- Ninja var] $ mkdir - m 777 www [ tekkamanninja@Tekkaman- Ninja var] $ mkdir - m 777 www/ cgi- bin [ tekkamanninja@Tekkaman- Ninja var] $ cd . . [ tekkamanninja@Tekkaman- Ninja rootfs] $ cp / etc/ mime. types etc/ |
三、运行Boa
开发板操作:
[root@~]# boa
如果发现boa没有运行,则可以在开发板的/var/log/boa/error_log文件中找原因。
比如端口已被其他程序占用:
[ root@~ ] # cat / var/ log / boa/ error_log [ 20/ Feb/ 2008: 21: 21: 57 + 0000] boa. c: 194 - unable to bind : Address already in use |
或是用户设置错误等等,都可以查到。 |
四、功能测试
静态网页测试
将静态网页存入根文件系统的/var/www 目录下(可以将主机 /usr/share/doc/HTML/目录下的index.html、homepage.css和img、stylesheet-images目录复制到/var/www目录下)
我参考《嵌入式Web服务器移植 》 的做法如下:
在根文件系统的/var 目录下
[ tekkamanninja@Tekkaman- Ninja var] $ cp / usr/ share/ doc/ HTML/ index. html www/ [ tekkamanninja@Tekkaman- Ninja var] $ cp - r / usr/ share/ doc/ HTML/ img www/ [ tekkamanninja@Tekkaman- Ninja var] $ cp / usr/ share/ doc/ HTML/ homepage. css www/ [ tekkamanninja@Tekkaman- Ninja var] $ cp - r / usr/ share/ doc/ HTML/ stylesheet- images www/ |
直接在浏览器中输入开发板的IP地址(比如我的是http://192.168.1.2 ) ,出现fedora的欢迎网页。静态HTML调试成功。
CGI功能测试
1、编写HelloworldCGI.c程序
[tekkamanninja@Tekkaman-Ninja source]$ vi helloworldCGI.c
(主程序的程序开头一定要用Tab,而不是空格,不然编译可能不通过)
# include < stdio. h> # include < stdlib. h> int main( void ) { printf ( "Content-type: text/html/n/n" ) ; printf ( "<html>/n" ) ; printf ( "<head><title>CGI Output</title></head>/n" ) ; printf ( "<body>/n" ) ; printf ( "<h1>Hello,world.</h1>/n" ) ; printf ( "<body>/n" ) ; printf ( "</html>/n" ) ; exit ( 0) ; } |
2.交叉编译生成CGI程序
[ tekkamanninja@Tekkaman- Ninja source] $ / home/ tekkamanninja/ working/ gcc4. 1. 1/ gcc- 4. 1. 1- glibc- 2. 3. 2/ arm- 9tdmi- linux- gnu/ bin/ arm- 9tdmi- linux- gnu- gcc - o helloworldCGI helloworldCGI. c |
将helloworldCGI 拷贝至根文件系统的/var/www/cgi-bin/下
[ tekkamanninja@Tekkaman- Ninja source] $ cp helloworldCGI . . / nfs/ rootfs/ var/ www/ cgi- bin/ |
3.测试
浏览器输入
http://192.168.1.2/cgi-bin/helloworldCGI
网页出现 Hello,world. 调试成功!
我遇到的问题:
1、Could not chdir to "/etc/boa": aborting
因为板子上 /etc 不可写 ,所以就改文件了
修改boa-0.94.13/src/defines.h 第30行:将/etc/boa 改为你自己的目录 我的是 /mnt/yaffs/boa。
2、log.c:73 - unable to dup2 the error log: Bad file
修改boa-0.94.13/src/log.c 第72-74行:将 该if 语句注释掉
3、boa.c:226 - icky Linux kernel bug!: No such file o...
修改boa-0.94.13/src/boa.c 第225-227行:将该 if 语句注释掉
这样编译、修改、编译了n次之后终于搞定!
另外:
关于boa.conf 文件的问题直接贴出我的:
Port 80
User root
Group root
ErrorLog /var/log/boa/error_log
ServerName 10.10.19.123
DocumentRoot /mnt/yaffs/boa/www
UserDir public_html
DirectoryIndex index.html
DirectoryMaker /mnt/yaffs/boa/boa_indexer
KeepAliveMax 1000
KeepAliveTimeout 10
MimeTypes /mnt/yaffs/boa/mime.types
DefaultType text/plain
CGIPath /bin:/usr/bin:/usr/local/bin
Alias /doc /usr/doc
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
由于板子重启之后,boa.conf的内容开头就变了,boa无法运行, 我在开头和末尾都加了很多行无用的注释,这个问题就解决了!