一:移植Boa(web服務器)到嵌入式Linux系統
一、Boa程序的移植
1、下載Boa源碼
下載地址: http://www.boa.org/
目前最新發行版本: 0.94.13 (幾年沒更新版本了)
下載 boa-0.94.13.tar.gz,
注意:若從boa上下載的是boa-0.94.13.tar.tar,解壓方式一樣
解壓:
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等等會出錯) 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,可以在其基礎上進行修改。
1、Group的修改
為 Group user(開發板上有的組)
修改 User nobody
為 User boa (user組中的一個成員)
| [root@~]#adduser -g user boa |
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 |
三、運行Boa
開發板操作:
[root@~]#boa
如果發現boa沒有運行,則可以在開發板的/var/log/boa/error_log文件中找原因。
| 比如端口已被其他程序占用:
或是用戶設置錯誤等等,都可以查到。 |
四、功能測試
靜態網頁測試
將靜態網頁存入根文件系統的/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/ |
直接在瀏覽器中輸入開發板的IP地址(比如我的是http://192.168.1.2) ,出現fedora的歡迎網頁。靜態HTML調試成功。
CGI功能測試
1、編寫HelloworldCGI.c程序
[tekkamanninja@Tekkaman-Ninja source]$ vi helloworldCGI.c
(主程序的程序開頭一定要用Tab,而不是空格,不然編譯可能不通過)
| #include<stdio.h> Hello,world.\n");printf("\n"); printf("\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. 調試成功!
| [tekkamanninja@Tekkaman-Ninja src]$ cd ../.. |
| CC = /home/tekkamanninja/working/source/2.95.3/bin/arm-linux-gcc |
| [tekkamanninja@Tekkaman-Ninja source]$tar xzf boa-0.94.13.tar.gz |
一、下載並解壓
下載的官方主頁:www.lighttpd.net
我下的是目前最新的lighttpd-1.4.18
解壓:
[tekkamanninja@Tekkaman-Ninja source]$ tar xjvf lighttpd-1.4.18.tar.bz2
二、配置和交叉編譯
[tekkamanninja@Tekkaman-Ninja source]$ cd lighttpd-1.4.18
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ CC=/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-gcc ./configure -prefix=/lighttpd -host=arm-9tdmi-linux-gnu --disable-FEUTARE -disable-ipv6 -disable-lfs
這里特別注意一下:-prefix=/lighttpd , 我是將軟件先裝在Host的根目錄下的lighttpd文件夾內,然后將其復制到開發板的根文件系統的根目錄下。我之所以這樣做是因為這個軟件在make install時會配置他私有的庫文件的路徑,在開發板運行時會在-prefix= 的文件加下找他的私有庫文件。而我又是交叉編譯給開發板,這樣配置比較方便移植。
--disable-FEUTARE -disable-ipv6 -disable-lfs 可以不加。
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ make
三、程序安裝
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ make install
拷貝配置文件到開發板根文件系統的etc文件夾並進行適當修改:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cp doc/lighttpd.conf /home/tekkamanninja/working/nfs/rootfs/etc/
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ kwrite /home/tekkamanninja/working/nfs/rootfs/etc/lighttpd.conf
必需修改的地方有:
server.document-root = "/srv/www/htdocs/"
改為server.document-root = "/home/lighttpd/html/"
你可以自己定義,這里就是設置web服務的根目錄。
屏蔽一下語句,不然嵌入式這樣的小系統下可能無法啟動
#$HTTP["url"] =~ "\.pdf$" {
# server.range-requests = "disable"
#}
開看程序需要那些動態庫:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d src/lighttpd
Dynamic section at offset 0x20790 contains 21 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libdl.so.2]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0xc200
0x0000000d (FINI) 0x231c0
0x00000004 (HASH) 0x8128
0x00000005 (STRTAB) 0xa338
0x00000006 (SYMTAB) 0x8b48
0x0000000a (STRSZ) 5946 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000015 (DEBUG) 0x0
0x00000003 (PLTGOT) 0x30860
0x00000002 (PLTRELSZ) 960 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0xbe40
0x00000011 (REL) 0xbe00
0x00000012 (RELSZ) 64 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0xbd70
0x6fffffff (VERNEEDNUM) 2
0x6ffffff0 (VERSYM) 0xba72
0x00000000 (NULL) 0x0
拷貝動態庫:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cp ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libdl-2.3.2.so~/working/nfs/rootfs/lib/
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cp ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libdl.s* ~/working/nfs/rootfs/lib/
在開發板為此程序新建一個用戶及存儲網頁的根目錄以及一個log目錄:
開發板操作:
[root@~]#adduser -g user lighttpd
Changing password for lighttpd
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[786]: password for `lighttpd' changed by user `root'
Password changed.
[root@~]#
HOST 操作:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cd ../../nfs/rootfs/home/lighttpd/
[tekkamanninja@Tekkaman-Ninja lighttpd]$ su
口令:
[root@Tekkaman-Ninja lighttpd]# mkdir html
[root@Tekkaman-Ninja lighttpd]# chmod 777 html/
[root@Tekkaman-Ninja lighttpd]# mkdir ../../var/log/lighttpd
[root@Tekkaman-Ninja lighttpd]# chmod 777 ../../var/log/lighttpd
將移植好的程序(整個目錄,其中包含了bin、sbin、lib和share目錄)拷貝到開發板根文件系統的根目錄下:
[root@Tekkaman-Ninja lighttpd]# mv /lighttpd /home/tekkamanninja/working/nfs/
[root@Tekkaman-Ninja lighttpd]# exit
exit
四、運行程序
在開發板上操作:
[root@~]#/lighttpd/sbin/lighttpd -f /etc/lighttpd.conf
將測試靜態網頁放在server.document-root設置的目錄下,並在HOST的瀏覽器下輸入開發板IP,測試通過。
至於CGI的運行,我還不懂配置,有空再研究!
三:移植shttpd Web服務器到嵌入式Linux系統
下載的官方主頁:http://shttpd.sourceforge.net/
我下的是目前最新的shttpd-1.39.tar.gz
解壓:
[tekkamanninja@Tekkaman-Ninja source]$ tar zxvf shttpd-1.39.tar.gz
[tekkamanninja@Tekkaman-Ninja source]$ cd shttpd-1.39
[tekkamanninja@Tekkaman-Ninja shttpd-1.39]$ cd src/
[tekkamanninja@Tekkaman-Ninja src]$ kwrite Makefile
CC = /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-gcc
AR = /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-ar
CFLAGS = -DNO_SSL
[tekkamanninja@Tekkaman-Ninja src]$ ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d shttpd
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0x9180
0x0000000d (FINI) 0x18708
0x00000004 (HASH) 0x8128
0x00000005 (STRTAB) 0x8a5c
0x00000006 (SYMTAB) 0x843c
0x0000000a (STRSZ) 807 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000015 (DEBUG) 0x0
0x00000003 (PLTGOT) 0x22d90
0x00000002 (PLTRELSZ) 704 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x8ec0
0x00000011 (REL) 0x8e88
0x00000012 (RELSZ) 56 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0x8e48
0x6fffffff (VERNEEDNUM) 1
0x6ffffff0 (VERSYM) 0x8d84
0x00000000 (NULL) 0x0
將編譯好的程序放入開發板的文件系統下:
[tekkamanninja@Tekkaman-Ninja src]$ cp shttpd /home/tekkamanninja/working/nfs/rootfs/sbin/
[root@~]#shttpd -root /var/www -ports 80 &
[root@~]#shttpd --help
SHTTPD version 1.39 (c) Sergey Lyubka
usage: shttpd [options] [config_file]
-A <htpasswd_file>
-root Web root directory (default: .)
-index_files Index files (default: index.html,index.htm,index.php,index.cgi)
-ports Listening ports (default: 80)
-dir_list Directory listing (default: 1)
-cfg_uri Config uri
-protect URI to htpasswd mapping
-cgi_ext CGI extensions (default: cgi,pl,php)
-cgi_interp CGI interpreter
-cgi_env Additional CGI env vars
-ssi_ext SSI extensions (default: shtml,shtm)
-auth_realm Authentication domain name (default: mydomain.com)
-auth_gpass Global passwords file
-auth_PUT PUT,DELETE auth file
-access_log Access log file
-error_log Error log file
-mime_types Additional mime types list
-aliases Path=URI mappings
-acl Allow/deny IP addresses/subnets
-inetd Inetd mode (default: 0)
-uid Run as user
在HOST的瀏覽器中輸入開發板地址,測試通過!
在流覽器中輸入(開發板地址)192.168.1.2/helloworldCGI.cgi ,測試通過!
