嵌入式web伺服器boa的編譯移植
Linux下Boa伺服器移植,交叉編譯boa併成功移植到FL2440開發板上,並且CGI程式執行正常。
主機環境:redhat9
交叉編譯器:arm-linux-gcc 3.4.1
BOA版本:0.94.13
平臺:s3c2440
一:下載原始碼:從http://www.boa.org/官方網站下載原始碼,並將原始碼放置在/src 目錄下。
[[email protected] EmbedSky ~]# cd /usr/src進入原始碼目錄
[[email protected] EmbedSky src]# tar zxvf boa-0.94.13.tar.tar解壓原始碼壓縮包
[[email protected] EmbedSky src]# cd boa-0.94.13進入原始碼解壓包
[[email protected] EmbedSkyboa-0.94.13]# cd src
[[email protected] EmbedSky src]# ./configure生成makefile
二:編譯前修改的檔案:
1. 修改Makefile檔案,找到CC=gcc和CPP=gcc -E,分別將其改為交叉編譯器安裝的路徑:
CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc
CPP=/usr/local/arm/2.95.3/bin/arm-linux-g++
儲存退出。
2. 修改編譯方式:
LDFLAGS = -g –static
注: 使用靜態編譯可以讓目標檔案自動的包含所需要的
庫檔案,而動態編譯需要手工拷貝庫檔案。
3.修改/src/defines.h檔案:
#define SERVER_ROOT "/etc/boa"
4 修改boa-0.94/src/ util.c檔案
修改char *get_commonlog_time(void)函式。
time_offset = 0;
5. 修改src/config.c:加Current_uid=1
6. 修改compat.h:把第120 行的
#define
TIMEZONE_OFFSET(foo)foo##->tm_gmtoff
修改為:
#define
TIMEZONE_OFFSET(foo)foo->tm_gmtoff
7.修改/src/boa.c,註釋掉下面兩行:
/* if (setuid(0) != -1) {
DIE("icky Linux kernel bug!")} */
/*if (passwdbuf == NULL) {
DIE("getpwuid");}*/
8 gethostbyname:: Resource temporarily unavailable
這個問題我也遇到過,我只是把src資料夾下的config.c裡的if(!server_name){..........}(大概在266行到286行之間)註釋掉,就能執行在板子上執行boa。
解決:config.c
/*if (!server_name) {
struct hostent *he;
char temp_name[100];
if (gethostname(temp_name, 100) == -1) {
perror("gethostname:");
exit(1);}
he = gethostbyname(temp_name);
if (he == NULL) {
perror("gethostbyname:");
exit(1);}
server_name = strdup(he->h_name);
if (server_name == NULL) {
perror("strdup:");
exit(1);}}*/
9. /src/log.c中的修改:註釋掉:
/*if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
} */
10. 在boa.conf中的修改:
(1) ServerName的設定
修改#ServerName www.your.org.here
為 ServerName www.your.org.here
注意:該項預設為未開啟,執行Boa會異常退出,提示“gethostbyname::No such file or directory”,所以必須開啟。其它預設設定即可。
注意:以下是為改為下面這樣的:
(2)User與Group的修改:
User 0
Group 0
(3)ErrorLog /var/log/boa/error_log
AccessLog /var/log/boa/access_log
(4)DocumentRoot /var/www
(5)DirectoryIndex index.html
(6)KeepAliveMax 1000
KeepAliveTimeout 10
(7)MimeTypes /etc/mime.types
(8)ScriptAlias /cgi-bin//var/www/cgi-bin/
11. 此外,還需要將mime.types檔案複製目標板根檔案系統/etc目錄下,通常可以從linux主機的 /etc目錄下直接複製即可。
三:執行make進行編譯,得到可執行的程式boa
[[email protected] EmbedSky boa-0.94.13]# cd /usr/src/boa-0.94.13/src
[[email protected] EmbedSky src]# make clean
rm -f y.tab.o lex.yy.o alias.o boa.o buffer.o cgi.o cgi_header.o config.o escape.o get.o hash.o ip.o log.o mmap_cache.o pipe.o queue.o read.o request.o response.o select.o signals.o util.o sublog.o timestamp.o boa core lex.yy.c y.tab.c y.tab.h *~ boa_indexer index_dir.o
[[email protected] src]# make
去掉除錯資訊: # /usr/src/usr/local/arm/3.4.1/bin/arm-linux-strip boa
四:安裝Boa及配置檔案的修改:
利用超級終端經串列埠向arm板傳送配置檔案。
1. 將編譯得出的可執行檔案/boa-0.94.13/src中的boa檔案,拷到/sbin目錄下。
2. 在/var下新建log和www目錄:
#cd /var
# mkdir log// 建立日誌檔案所在目錄
# mkdir www//建立HTML文件的主目錄
#cd log
# mkdir boa
#cd /var/www
# mkdir cgi-bin//建立CGI指令碼所在錄
#mkdir img//建立圖片所在目錄
將index.html檔案拷到/var/www下
# chmod 777 /var/log/* //檔案許可權設定777表示所有人都可讀、可寫、可執行
# chmod 777 /var/www/*
3. 在/etc下新建目錄boa
# mkdir /etc/boa
將/boa-0.94.13中的boa.conf檔案拷到/etc/boa下
# chmod 777 /etc/boa/*
4.arm板的ip地址的配置:
# ifconfig eth0 172.20.182.92 netmask 255.255.255.0
5.pc機的ip地址設定:
ip address 172.20.182.82
subnet mask255.255.255.0
default gateway172.20.182.254
dns servers61.138.125.65
(pc機的ip網路設定可以直接連上校園網路,只需換上網線即可,方便快捷);
五:執行及功能測試:
# boa&
# [01/Jan/1970:06:59:44 +0000] boa: server version Boa/0.94.13 //版本號
[01/Jan/1970:06:59:44 +0000] foa: server built Dec 12 2011 at 16:54:43. //啟動時間
[01/Jan/1970:06:59:44 +0000] boa: starting server pid=573, port 80 //程序號573 埠80
[1] + Doneboa
# ps//顯示所有程序
PIDUidVSZ Stat Command
1 root1816 SWinit
2 rootSWN [ksoftirqd/0]
3 rootSW< [events/0]
4 rootSW< [khelper]
5 rootSW< [kthread]
21 rootSW< [kblockd/0]
24 rootSW[khubd]
77 rootSW[pdflush]
78 rootSW[pdflush]
80 rootSW< [aio/0]
79 rootSW[kswapd0]
286 root SW[kseriod]
340 rootSW[mtdblockd]
376 rootSW< [krfcommd]
396 root19844 SW./qpe
397 root$1828 SW-sh
398 root1816 SWinit
414 root9008 SW< /usr/bin/qss
456 root1820 SW/bin/sh
538 root13096 SWN /usr/bin/quicklauncher
573 root2116 SWboa// boa伺服器移植執行成功!!!
574 root1820 RWps
網線接入:
# eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1
[01/Jan/1970:07:00:37 +0000] request from 172.20.182.82 "GET /images/bg01.gif HTTP/1.5" ("/var/www/images/bg01.gif"): document open: No such file or directory
[01/Jan/1970:07:00:42 +0000] request from 172.20.182.82 "GET /favicon.ico HTTP/1.1" ("/var/www/favicon.ico"): document open: No such file or directory
[01/Jan/1970:07:01:50 +0000] request from 172.20.182.82 "GET /images/bg01.gif HTTP/1.1" ("/var/www/images/bg01.gif"): document open: No such file or director}
[01/Jan/1970:07:01:53 +0000] request from 172.20.182.82 "GET /favicon.ico HTTP/1.1" ("/var/www/favicon.ico"): document open: No such file or directory
[01/Jan/1970:07:03:10 +0000] request from 172.20.182.82 "GET /favicon.ico HTTP/1
.1" ("/var/www/favicon.ico"): document open: No such file or directory
靜態網頁測試:將靜態網頁存入根檔案系統的/var/www目錄下
開啟IE瀏覽器,輸入網址: http://172.20.182.91/pengtiegang.html
重新輸入網址: http://172.20.182.92/index.html
CGI功能測試:將交叉編譯好的cgictest.cgi測試程式存入根檔案系統的/var/www/cgi-bin/下
再次輸入:http://172.20.182.92/cgi-bin/cgictest.cgi
結果如下所示:
PC機上可以看到/var/www目錄下的網頁和執行/var/www/cgi-bin/目錄下的CGI程式順暢。
中途出現的問題:出現記憶體錯誤的有下列幾種
1.檔案系統中的庫不全,有人用開發板自帶的庫就可以,後來調整自己檔案系統的庫
2.函式指標錯誤,修改原始碼過程造成
3.交叉編譯器問題,就如這個。
重新編譯:
[[email protected] src]# make clean
[[email protected] src]# make
bison -y -d boa_grammar.y
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I.-c -o y.tab.o y.tab.c
y.tab.c: In function `yyparse':
y.tab.c:1295: warning: implicit declaration of function `yylex'
flex boa_lexer.l
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I.-c -o lex.yy.o lex.yy.c
..............................
lex.yy.c:1246: warning: 'yyunput' defined but not used
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I.-c -o alias.o alias.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I.-c -o boa.o boa.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I.-c -o buffer.o buffer.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I.-c -o cgi.o cgi.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I.-c -o cgi_header.o cgi_header.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I.-c -o config.o config.c
................
/usr/local/arm/3.4.1/bin/arm-linux-gcc -g -O2 -pipe -Wall -I.-c -o index_dir.o index_dir.c
/usr/local/arm/3.4.1/bin/arm-linux-gcc -o boa_indexer index_dir.o escape.o -g -static
六:將重新編譯的可執行檔案拷到共享目錄/home/boa下,執行:
# ./boa
eth0: Transmit buffer not free!
eth0: Transmit buffer not free!
eth0: Transmit buffer not free!
eth0: Transmit buffer not free!
[01/Jan/1970:00:38:05 +0000] boa: server version Boa/0.94.13
[01/Jan/1970:00:38:05 +0000] boa: server built May 11 2009 at 18:21:02.
[01/Jan/1970:00:38:05 +0000] boa: starting server pid=343, port 80
[[email protected](none) boa]# [01/Jan/1970:00:39:43 +0000] request from 10.10.205.154 "GETy
[01/Jan/1970:00:39:43 +0000] request from 10.10.205.154 "GET /stylesheet-imagesy
Boa伺服器目錄:
小結:
Boa伺服器在此係統中負責的是接收來自網頁的HTTP請求,根據請求呼叫相關的串列埠傳送應用程式。同時接收servfox傳來的現場截圖,通過無線網路一幀一幀再傳送回瀏覽器端。在瀏覽器端形成連續的視訊畫面。Boa的移植主要工作是對原始碼的修改交叉編譯再除錯。配置相關的指令碼,使其在Linux系統中正常工作。
.
