嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植
嵌入式linux項目開發(一)——BOA移植
項目目標:使用BOA、CGIC、SQLite搭建嵌入式web服務器
一、嵌入式web服務器BOA簡介
在嵌入式設備的管理與交互中,基于Web方式的應用成為目前的主流,即在嵌入式設備上運行一個支持腳本或CGI功能的Web服務器,能夠生成動態頁面,在用戶端只需要通過Web瀏覽器就可以對嵌入式設備進行管理和監控,使用極為方便。
目前嵌入式設備中所使用的web服務器主要有:boa、thttpd、mini_httpd、shttpd、lighttpd、goaheand、appweb和apache等。
BOA是Paul Philips在1991年開發的開源的嵌入式web服務器,BOA功能強大,支持認證,CGI等,應用廣泛,特別適合于嵌入式設備。與傳統的web服務器為每個訪問連接開啟一個進程不同,BOA是一個單任務的web服務器,不會為多個連接開啟多個任務進程。BOA對所有的活動的http連接在內部進行處理,而且只為每個CGI連接(獨立的進程)開啟新的進程。因此,BOA在同等硬件條件下顯示出更快的速度。測試表明boa在Pentium 300MHZ下能夠每秒鐘處理幾千次點擊,在20 MHz 386/SX下能夠每秒鐘處理幾十次點擊訪問。
BOA與apache等高性能web服務器主要區別是,BOA是單進程的服務器,只有在完成一個用戶請求后才能響應另一個用戶的請求,無法并發響應,在嵌入式設備的應用場合里已經足夠。
BOA是一個非常小巧的Web服務器,可執行代碼只有約60KB,是一個單任務Web服務器,只能依次完成用戶的請求,而不會fork出新的進程來處理并發連接請求;但BOA支持CGI,能夠為CGI程序fork出一個進程來執行。
BOA的設計目標是速度和安全,是指不被惡意用戶暗中破壞,而不是指它有很好的訪問控制和通信加密。可以添加SSL來保證數據傳輸中的保密和安全。在其站點公布的性能測試中,BOA的性能要好于Apache服務器。
二、嵌入式BOA服務器編譯
1、下載BOA源碼
從www.boa.org下載boa-0.94.13.tar.gz源碼
2、生成配置文件
在BOA頂層目錄src下運行./configure
3、修改Makefile文件
修改Makefile文件中的交叉編譯工具選項
CC = arm-linux-gcc
CPP = arm-linux-gcc–E
LDFLAGS = -static
4、修改boa.c文件
將boa.c文件中的一下內容注釋
if ( setuid ( 0 ) != - 1 ) {
DIE ( "icky Linux kernel bug!" );
}
5、修改compat.h文件
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
6、修改config.c文件
將if(!server_name){..........}內容注釋,位于266-286行
不注釋會報錯:gethostbyname:: Resource temporarily unavailable
7、修改log.c文件
注釋掉以下內容
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
不注釋會報錯:unable to dup2 the error log:bad file descriptor
8、編譯
make
9、去除調試信息
arm-linux-strip boa
10、修改執行權限
chmod 777 boa
三、BOA服務器配置
1、boa.conf文件解析
#監聽的端口
Port 80
#服務器綁定的IP地址,注釋掉表示綁定到INADDR_ANY,適配服務器所有的IP
#Listen 192.68.0.5
#服務器運行的用戶和組
#User o
User 0
#Group o
Group 0
#當服務器發生問題時發送報警的email地址
#ServerAdmin root@localhost
#錯誤日志文件
ErrorLog /var/log/boa/error_log
#訪問日志文件
AccessLog /var/log/boa/access_log
#是否使用本地時間。如果沒注釋掉,則使用本地時間。注釋掉則使用UTC時間
#UseLocaltime
#是否記錄CGI運行信息
#VerboseCGILogs
#服務器名字
#是否啟動虛擬主機功能,即設備可以有多個網絡接口,每個接口都可以擁有一個虛擬的Web服務器
#VirtualHost
#非常重要,HTML文檔的主目錄
DocumentRoot /var/www
#如果收到一個用戶請求的話,在用戶主目錄后再增加的目錄名
UserDir public_html
#HTML目錄索引的文件名
DirectoryIndex index.html
#一個連接所允許的HTTP持續作用請求最大數目
KeepAliveMax 1000
#HTTP持續作用中服務器在兩次請求之間等待的時間數,以秒為單位,超時將關閉連接
KeepAliveTimeout 10
#指明mime.types文件位置
MimeTypes /etc/mime.types
#文件擴展名沒有或未知的話,使用的缺省MIME類型
DefaultType text/plain
#提供CGI程序的PATH環境變量值
CGIPath /bin:/usr/bin:/usr/local/bin
#為路徑加上別名
Alias /doc /usr/doc
#指明CGI腳本的虛擬路徑對應的實際路徑
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
2、其他文件移植
從linux的etc目錄拷貝mime.types、passwd、group文件到開發板系統的etc目錄
創建web服務器HTML文檔的主目錄/var/www
創建CGI腳本所在目錄/var/www/cgi-bin/
四、BOA移植過程中錯誤的解決方案
1、gethostbyname:: No such file or directory
解決辦法:修改boa.conf去掉ServerName www.your.org.here前的注釋符號(#)
2、util.c:100:1: error: pasting "t" and "->"does not give a valid preprocessing token make: *** [util.o]
解決辦法:
修改src/compat.h
#defineTIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#defineTIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
3、boa.c:211 - getpwuid: No such file or directory
解決辦法:修改src/boa.c
注釋掉下面這段程序:
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
即修改為:
#if 0
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
#endif
4、boa.c:228 - icky Linux kernel bug!: No such file or directory
解決辦法:
修改src/boa.c,注釋掉下面語句:
if(setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
即修改為:
#if 0
if(setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
#endif
5、log.c:73 unable to dup2 the error log:bad file descriptor
解決方法:
修改src/log.c
注釋掉
if(dup2(error_log, STDERR_FILENO) == -1) {
DIE("unableto dup2 the error log");
}
即修改為:
#if 0
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
#endif
6、執行boa程序報錯not found
解決方法:
修改Makefile
LDFLAGS = -static
總結
以上是生活随笔為你收集整理的嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux安装python3.7的步骤_
- 下一篇: linux resin 查看日志命令,【