1. 程式人生 > > 嵌入式web伺服器boa的編譯移植

嵌入式web伺服器boa的編譯移植

LinuxBoa伺服器移植,交叉編譯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=gccCPP=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.cCurrent_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,所以必須開啟。其它預設設定即可。

注意:以下是為改為下面這樣的:

2UserGroup的修改:

User 0

Group 0

3ErrorLog /var/log/boa/error_log

AccessLog /var/log/boa/access_log

4DocumentRoot /var/www

5DirectoryIndex index.html

6KeepAliveMax 1000

KeepAliveTimeout 10

7MimeTypes /etc/mime.types

8ScriptAlias /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下新建logwww目錄:

#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

結果如下所示:

 26748719_13484139560oJ7.jpg

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系統中正常工作。

 .