-- -- 课 设 报 告
课程名称 嵌入式系统课程设计 实验项目 web远程控制系统设计 指导教师 周金和 、 王勇
学 院 信息与通信工程 专 业 电子信息工程 班级/学号 电信1101/ 学生姓名 实验日期 成 绩 ____________________ --
-- 实验步骤
一、搭建及移植web服务器 搭建及移植boa服务器是本次课题的要点所在,为了能够顺利搭建服务器,前期做了大量工作对其进行学习以及研究,在基本掌握boa服务器的搭建和移植的具体操作方法还有该服务器的工作方式、流程之后,才着手进行搭建和移植,即便如此,在搭建和移植的过程中还是遇到了不少问题,下文也进行了分析和解决。
1.1 下载及配置BOA服务器 1.1.1 下载安装boa服务器 首先在http://www.boa.org/下载BOA服务器的源码:boa-0.94.13.tar.gz版本为0.94.13。 对其进行解压: $ tar xzf boa-0.94.13.tar.gz 还要安装必要的工具bison,flex。否则会出现: make: yacc:命令未找到ﻫ make: *** [y.tab.c] 错误 127。 $ sudo apt-get install bison flex 在输入上一条命令之前需要保证虚拟机联网,虚拟机联网方式如下 首先把主机联上网,虚拟机网络设置桥接改成nat $ sudo vim /etc/network/interfaces static改成dhcp ,在address,netmask, gateway加#注释 用:wq保存并退出 重启网路配置 $sudo /etc/init.d/networking restart
1.1.2 修改相关配置文件 修改src/compat.h文件: 打开compat.h找到这一条语句: #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff 将其修改为: #define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff 这是由于本机所使用的交叉编译版本对语句用法的不同。 修改 src/log.c文件。 -- -- 打开log.c注释掉下列语句: /*if (dup2(error_log, STDERR_FILENO) == -1) { DIE("unable to dup2 the error log");ﻫ }*/ 否则会出现错误: log.c:73 unable to dup2 the error log:bad file descriptor。 修改src/boa.c文件。 打开src/boa.c注释掉下面两句话: #if 0ﻫ if (passwdbuf == NULL) {ﻫ DIE(”getpwuid”); }ﻫ if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {ﻫ DIE(”initgroups”); }ﻫ #endif 否则会出现错误:boa.c:211 - getpwuid: No such file or directory。 #if 0ﻫ if (setuid(0) != -1) {ﻫ DIE(”icky Linux kernel bug!”); } #endif 否则会出现问题:boa.c:228 - icky Linux kernel bug!: No such file or directory。
1.1.3 生成boa可执行文件 进入相关目录生成makefile文件: $ cd boa-0.94.13/srcﻫ $ ./configure 修改makefile文件。 $sudo vim Makefile 修改CC = gcc 为 CC = arm-linux-gnueabihf-gcc 修改CPP = gcc -E 为 CPP = arm-linux-gnueabihf-gcc -E 接下来进行编译。 $ make 然后为刚刚生成的二进制文件boa瘦身删除其调试信息。 $ arm-linux-gnueabihf-strip boa
1.1.4 修改配置 找到配置文件boa.conf并进行如下修改: $ sudo gedit boa-conf 以下步骤需要在计算机上完成: (1)对Group的修改 将Group nogroup(这是修改程序所属的组)。 -- -- 修改为 Group 0 (2)对user的修改 将User nobody(这里是修改程序所属的用户)。 修改为 User 0 (3)对ScriptAlias的修改 将ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/(这里是配置服务器读取cgi程序的目录,需要在SD卡中同样的位置建立同样的目录)。 修改为 ScriptAlias /cgi-bin/ /www/cgi-bin/ (5)对DoucmentRoot的修改 将DoucmentRoot /var/www (这里是服务器初始网页放置的位置同样需要在SD卡同样的位置建立同样的文件夹并将名为index.html的网页放置在其中)。 修改为DoucmentRoot /www (6)对ServerName的修改 将#ServerName www.your.org.here(取消掉注释否则提示没有服务器名)。 修改为 ServerName www.your.org.here 否则会出现错误“gethostbyname::No such file or directory” (7)对AccessLog修改 将AccessLog /var/log/boa/access_log(在SD卡相应位置建立同名文件夹以存放日志文件,否则提示找不到文件夹)。 修改为#AccessLog /var/log/boa/access_log 否则会出现错误提示:“unable to dup2 the error log: Bad file descriptor”
修改完成后直接点击文件左上方的保存按钮进行保存。 在目标板上需要做的配置: 创建目录/etc/boa并且把boa 和 boa.conf拷贝到这个目录下: $ mkdir /etc/boa $ sudo cp boa.conf /media/rootfs/etc/boa 创建HTML文档的主目录/www: $ mkdir /www 创建CGI脚本所在的目录 /www/cgi-bin: $ mkdir /www/cgi-bin
1.2. 测试服务器动态网页功能 到此为止服务器已经搭建完成了,接下来就要测试服务器是否能够成功运行动态网页了,为了顺利完成测试,首先要做的是让目标板和主机能够通过交叉网线通信: 在虚拟机菜单栏中安照:虚拟机--设置--网络适配器--网络连接中选择桥街模式,这样就可以直接连接主机的物理网络。有时会出现无论怎样配置都无法联通的情况这时就需要使用虚拟机中的虚拟网络编辑器来重置网络配置。前面的设置完成后,先将windows下的ipv4设置为:IP地址:-- -- 181.168.1.10,子网掩码:255.255.255.0,默认网关:181.168.1.1。然后设置Ubuntu下的ip地址: sudo vi /etc/network/interfaces 将主机的ip地址设置为这一网段:address 181.168.1.11 netmask:255.255.255.0 gateway:181.168.1.1 重启主机的网络服务: sudo /etc/init.d/networking restart 再去配置目标板,同样将其置于同一网段: sudo gedit /etc/network/interfaces 将目标板的ip地址设置为同一网段:address 181.168.1.12 netmask:255.255.255.0 gateway:181.168.1.1 重启目标板的网络服务: sudo /etc/init.d/networking restart
配置完后在目标板上输入ifconfig可以查看到如下内容
这时就可以测试主机与目标板之间的连通性了: 分别在主机和目标板上使用ping命令去测试相互之间的连通性: --
-- 图 1.1 测试连通性 出现上图所示信息就便表示着主机与目标板已经联通了,可以进行通信了。 接下来要做的就是编译一个cgi程序,因为只是测试用所以就用最简单的hello world来测试: 首先建立一个hello.c文件: $sudo gedit hello.c 编写hello world代码: #include int main(int argc, char** argv) { printf("Content-type:text/html\n\n"); printf("\n"); printf("<head><title>cgiCHello.c</title>\n"); printf("printf("<h1>Hello World! \n"); printf("</body>\n"); printf("</html>\n"); return 0; } 保存。然后再对其进行编译,使之成为一个cgi文件: arm-linux-gnueabihf-gcc -o hello.cgi hello.c 在当前文件夹下便会生成hello.cgi,为这个文件添加权限,使其可执行: chmod +X hello.cgi 将这个文件移动到SD卡中之前所指定的服务器中的文件夹: