您的位置:首页 > 理论基础 > 计算机网络

【引用】Linux应用程序开发(一)---移植thttpd+Sqlite3+PHP5到arm linux(1)

2012-08-21 13:58 369 查看
移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容)
1,主机环境:VMare下CentOS 5.5 ,1G内存。
2,集成开发环境:Elipse IDE
3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gn?i-gcc v4.5.1。
4,开发板:mini2440,2M nor flash,128M nand flash。
5,u-boot版本:u-boot-2009.08
6,linux 版本:linux-2.6.32.2
7,参考文章:
移植thttpd Web服务器到ARM-Linux系统 深入研究嵌入式web服务器的视频监控应用 轻量型thttpd+php5 Cross compiling thttpd-2.21b + php-5.2.1 名词解释
Thtttpd:
Thttpd是一个小巧的轻量级web server,它简单结构,提供了CGI和php模块支持,且thttpd 对于并发请求不使用fork()来派生子进程处理,而是采用多路复用(Multiplex)技术来实现,效能更好。
Thttpd支持多种平台,如FreeBSD, SunOS, Solaris, BSD, Linux, OSF等。对于小型web server而言,速度快似乎是一个代名词,通过官方站提供的Benchmark,可以这样认为:thttpd至少和主流的web server一样快,在高负载下更快,因为其资源占用小的缘故。
Thttpd基于URL的文件流量限制,对于下载的流量控制而言是非常方便的。比Apache使用插件效率要高得多。
自PHP5后,php本身自带SQLite数据库操作类,非常之方便。就连创建数据库表你就不用担心,只需要执行sqlite_open()函数,就会在脚本的指定目录创建数据库文件,非常之方便。
CGI:
CGI(公共网关接口)定义了web服务器与外部内容生成程序之间交互的方法,通常是指CGI程序或者CGI脚本,它是在网站上实现动态页面的最简单和常用的方法。详情请参见通用网关接口。
HPH:
PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写。PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用。详情请参考PHP语言简介。
SQLite:
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。详情请参考SQLite数据库简介。

安装之前准备
(1)修改u-boot引导参数从nfs引导启动
我之前挂载的是开发板上nand flash的yaffs为根文件系统,为测试方便,现更改为nfs引导,操作如下:
[u-boot@MINI2440]#printenv
... ...
bootargs=noinitrd console=ttySAC0,115200 init=/linuxrc mem=64M root=/dev/mtdbloc
k3 rw rootfstype=yaffs ip=10.1.0.129:10.1.0.128:10.1.0.1:255.255.255.0::eth0:off


Environment size: 447/131068 bytes
[u-boot@MINI2440]# setenv bootargs \'noinitrd console=ttySAC0,115200 init=/linuxr
c mem=64M root=/dev/nfs rw nfsroot=10.1.0.128:/nfsboot/rootfs ip=10.1.0.129:10.1
.0.128:10.1.0.1:255.255.255.0::eth0:off\'
[u-boot@MINI2440]# saveenv
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x4000000000002 -- 0% complete.
Writing to Nand... done
[u-boot@MINI2440]#
然后重启开发板。
(2)创建用户
切换到开发板的串口终端执行
[root@mini2440 /]#addgroup -g 111 www //111表示组ID,www表示组名
[root@mini2440 /]#adduser -g 111 www //www表示用户名,111用户名所在的组ID
adduser: group name \'www\' is in use
[root@mini2440 /]#adduser -G gwww www
Changing password for www
New password:
Bad password: similar to username
Retype password:
Password for www changed by root
[root@mini2440 /]#
(3)建立安装目录
在配置编译之前,要先建立安装所需要的目录
[root@localhost php-5.2.11]# mkdir /nfsboot/rootfs/usr/local
PHP的编译选项中有--with-thttpd 和 --with-sqlite 选项 ,编译php需要其头文件和库文件,所以编译php之前应先编译thttpd和SQLite。
1,安装Thttpd

【1】下载Thttpd源码
thttpd-2.25b.tar.gz源码:http://www.acme.com/software/thttpd/
下载后解压
[root@localhost linux-test]# ls
thttpd-2.25b.tar.gz
解压thttpd-2.25b.tar.gz
[root@localhost linux-test]# tar -zxvf thttpd-2.25b.tar.gz
建立安装目录
在配置编译之前,要先建立安装所需要的目录
[root@localhost php-5.2.11]# mkdir /nfsboot/rootfs/usr/local
[root@localhost php-5.2.11]#
【2】交叉编译安装
[root@localhost linux-test]# cd thttpd-2.25b
[root@localhost thttpd-2.25b]# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/nfsboot/rootfs/usr/local
[root@localhost thttpd-2.25b]# make
[root@localhost thttpd-2.25b]# make install
提示错误:chgrp: 无效的组名称‘‘www’’
解决的办法是:在终端中创建这个组,然后
[root@localhost thttpd-2.25b]# make install
出现错误:
cp: 无法创建一般文件“/usr/local/man/man1/makeweb.1”: 没有那个文件或目录
make[1]: *** [install] 错误 1
解决的办法是:在{$prefix}/usr/local/man/目录下手动创建man1目录
[root@localhost thttpd-2.25b]# mkdir /nfsboot/rootfs/usr/local/man/man1
[root@localhost thttpd-2.25b]#
[root@localhost thttpd-2.25b]# make install
OK,安装成功。
【3】去掉相关可执行文件调试信息
[root@localhost local]# arm-linux-strip sbin/*
/usr/local/arm/4.4.3/bin/.arm-none-linux-gn?i-strip:sbin/syslogtocern: File format not recognized
[root@localhost local]# file sbin/*
sbin/htpasswd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, statically linked, for GNU/Linux 2.6.32, stripped
sbin/makeweb: setgid ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
sbin/syslogtocern: Bourne shell script text executable
sbin/thttpd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
[root@localhost local]#

[root@localhost local]# arm-linux-strip www/cgi-bin/*
[root@localhost local]# file www/cgi-bin/*
www/cgi-bin/phf: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, statically linked, for GNU/Linux 2.6.32, stripped
www/cgi-bin/redirect: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, statically linked, for GNU/Linux 2.6.32, stripped
www/cgi-bin/ssi: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, statically linked, for GNU/Linux 2.6.32, stripped

【4】复制配置文件thttpd.conf
复制配置文件到开发板/etc目录下
[root@localhost thttpd-2.25b]# cp contrib/redhat-rpm/thttpd.conf /nfsboot/rootfs/etc
[root@localhost thttpd-2.25b]#
设置thttpd.conf中默认的服务目录dir=/home/www/html
所以这里在开发板运行的目录建立相应目录
[root@localhost thttpd-2.25b]# mkdir /nfsboot/rootfs/home/www
[root@localhost thttpd-2.25b]# mkdir /nfsboot/rootfs/home/www/html //测试网页所在目录
[root@localhost thttpd-2.25b]#
【5】 拷贝测试网页到thttpd服务的根目录(可选,测试之用):
[root@localhost thttpd-2.25b]# cp index.html /nfsboot/rootfs/home/www/html
[root@localhost thttpd-2.25b]#

【6】 查看一下需要的动态库
[root@localhost thttpd-2.25b]# file /nfsboot/rootfs/usr/local/sbin/thttpd
/nfsboot/rootfs/usr/local/sbin/thttpd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
[root@localhost thttpd-2.25b]#
参考文章 http://www.jollen.org/blog/2006/10/library_dependency_1.html 要确保arm-linux运行库中有下列库文件:
[root@localhost thttpd-2.25b]# ls /nfsboot/rootfs/lib
firmware libmad.so.0.2.1 libpthread.so.0
ld-2.9.so libmemusage.so libresolv-2.9.so
ld-linux.so.3 libm.so.6 libresolv.so.2
libanl-2.9.so libnsl-2.9.so librt-2.9.so
libanl.so.1 libnsl.so.1 librt.so.1
libBrokenLocale-2.9.so libnss_compat-2.9.so libSegFault.so
libBrokenLocale.so.1 libnss_compat.so.2 libstdc++.so
libc-2.9.so libnss_dns-2.9.so libstdc++.so.6
libcrypt-2.9.so libnss_dns.so.2 libstdc++.so.6.0.13
libcrypt.so.1 libnss_files-2.9.so libthread_db-1.0.so
libc.so.6 libnss_files.so.2 libthread_db.so.1
libdl-2.9.so libnss_hesiod-2.9.so libusb-0.1.so.4
libdl.so.2 libnss_hesiod.so.2 libusb-0.1.so.4.4.4
libgcc_s.so libnss_nis-2.9.so libusbpp-0.1.so.4
libgcc_s.so.1 libnss_nisplus-2.9.so libusbpp-0.1.so.4.4.4
libid3tag.so libnss_nisplus.so.2 libusbpp.so
libid3tag.so.0 libnss_nis.so.2 libusb.so
libid3tag.so.0.3.0 libpcprofile.so libutil-2.9.so
libiw.so.29 libpng12.so libutil.so.1
libjpeg.so libpng12.so.0 libuuid.so
libjpeg.so.62 libpng12.so.0.35.0 libuuid.so.1
libjpeg.so.62.0.0 libpng.so libuuid.so.1.2
libm-2.9.so libpng.so.3 modules
libmad.so libpng.so.3.35.0
libmad.so.0 libpthread-2.9.so
[root@localhost thttpd-2.25b]#
上面蓝色粗体部分信息 Intel 80386 本应该显示arm体系架构ARM 这里却显示Intel 80386 。打开此目录下的Makefile,定位到50行附近,修改如下:
# You shouldn\'t need to edit anything below here.
CC = arm-linux-gcc
CCOPT = -O2
打开cgr-src/Makefile,定位到34行,修改如下:
CGIBINDIR = $(WEBDIR)/cgi-bin
MANDIR = ${prefix}/man
CC = arm-linux-gcc
CCOPT = -O2
打开extras/Makefile,定位到35行,修改如下:
MANDIR = ${prefix}/man
CC = arm-linux-gcc
CCOPT = -O2
然后保存重新执行
[root@localhost thttpd-2.25b]# make clean
[root@localhost thttpd-2.25b]# make
for i in cgi-src extras ; do ( \\
cd $i ; \\
pwd ; \\
make \\
WEBDIR=/nfsboot/rootfs/usr/local/www \\
CGIBINDIR=/nfsboot/rootfs/usr/local/www/cgi-bin \\
MANDIR=/nfsboot/rootfs/usr/local/man \\
WEBGROUP=www \\
) ; done
... ...
[root@localhost thttpd-2.25b]# make install
之后再看下
[root@localhost thttpd-2.25b]# file thttpd
thttpd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped
这此显示的是要运行的平台信息。

【7】增加对CGI的支持
默认配置下,thttpd不可以运行GCI(特别是动态编译的CGI程序)要想使用CGI支持功能,必须更改thttpd.conf的配置,不过在更改之前,要使之能写。
[root@localhost thttpd-2.25b]# chmod a+w /nfsboot/rootfs/etc/thttpd.conf
[root@localhost thttpd-2.25b]#
下面是thttpd.conf修改后的内容:
# This section overrides defaults
dir=/home/www/html
#web服务器网页路径
#chroot
#屏蔽chroot是为了运行动态编译的CGI
user=www #httpd# default = nobody
#这里user改成自己在开发板建立的用户www
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
# This section _documents_ defaults in effect
port=80
#port参数用于更改端口号(可不改,若还运行了别的WEB服务器,则需用不同端口)
# nosymlink# default = !chroot
# novhost
cgipat=/cgi-bin/*
#声明CGI程序的目录,是以dir为根目录的路径
# nothrottles
# host=0.0.0.0
# charset=iso-8859-1
【8】运行测试
当开发板启动并登陆到控制台后,在命令行输入
[root@mini2440 /]#thttpd -C /etc/thttpd.conf
/sbin/thttpd: line 1: syntax error: \"(\" unexpected
[root@mini2440 /]#
原来之前曾复制到/usr/sbin目录下的出现被编译80386体系架构的thttpd文件没有被删除。删除之后再次运行:
[root@mini2440 /]# /usr/local/sbin/thttpd -V
thttpd/2.25b 29dec2003
[root@mini2440 /]#
OK,运行成功!
现在启动thttpd服务
[root@mini2440 /]# /usr/local/sbin/thttpd -C /etc/thttpd.conf
/var/log/thttpd.log: No s h file or directory
[root@mini2440 /]#
建立日志文件
[root@localhost rootfs]# cd var
[root@localhost var]# mkdir log
[root@localhost var]# cd log
[root@localhost log]# ls
[root@localhost log]# to h thttpd.log
[root@localhost log]# ls
thttpd.log
[root@localhost log]#
再次运行
[root@mini2440 /]# /usr/local/sbin/thttpd -C /etc/thttpd.conf
[root@mini2440 /]#
thttpd服务成功启动。
在本地终端测试一下
[root@mini2440 /]#wget http://10.1.0.129 Connecting to 10.1.0.129 (10.1.0.129:80)
index.html 100% |*******************************| 311 --:--:-- ETA
然后主机浏览器中访问开发板IP:http://10.1.0.129/

thttpd is running

Looks like you got it working. Congrats.
Here\'s a link to the thttpd web pages.

2,安装SQLite
参考文章嵌入式数据库sqlite3在arm-linux下的交叉编译
【1】下载SQLite源码
thttpd-2.25b.tar.gz源码
sqlite-autoconf-3070701.tar.gz源码:http://www.sqlite.org/download.html
【2】解压源码
[root@localhost linux-test]# tar -zxvf sqlite-autoconf-3070701.tar.gz
【3】编译配置
[root@localhost linux-test]# cd sqlite-autoconf-3070701
[root@localhost sqlite-autoconf-3070701]# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/nfsboot/rootfs/usr/local
[root@localhost sqlite-autoconf-3070701]# make
[root@localhost sqlite-autoconf-3070701]# make install
下面步骤参考文章S3C2410下嵌入式数据库SQLite的移植
【4】在开发板控制终端的/usr/sbin建立到/usr/local/bin 的软连接
[root@mini2440 /sbin]#ln -s /usr/local/bin/sqlite3 sqlite3
[root@mini2440 /sbin]#sqlite3 -V
sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shar
ed object file: No s h file or directory
还需要设置环境变量,这里sqlite3的库文件在ARM板上的 /usr/local/lib目录下,这里设置环境就像下面:
打开/etc/profile
[root@mini2440 /]#vi /etc/profile
在文件末尾处加入如下变量
#Ash profile
#vim:syntax=sh
#No core file by defaults
#ulimit -S -c 0>/dev/null 2>&1
USER=\"id -un\"
LOGNAME=$USER
PS1=\'[\\u@\\h \\W]\\$\'
PATH=$PATH
HOSTNAME=\'/bin/hostname\'
export USER LOGNAME PS1 PATH
export LD_LIBRARY_PATH=/usr/local/lib

上面LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。(该路径在默认路径之前查找)
移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时可以将这些目录设置到LD_LIBRARY_PATH中。
然后再次export查看下
[root@mini2440 /]#export
export HOME=\'/\'
export LD_LIBRARY_PATH=\'/usr/local/lib:\'
export LOGNAME=\'id -un\'
export PATH=\'/sbin:/usr/sbin:/bin:/usr/bin\'
export PS1=\'[\\u@\\h \\W]\\$\'
export PWD=\'/\'
export SHELL=\'/bin/sh\'
export TERM=\'vt102\'
export USER=\'id -un\'
[root@mini2440 /]#
[root@mini2440 /]#sqlite3
SQLite version 3.7.7.1 2011-06-28 17:39:05
Enter \".help\" for instr tions
Enter SQL statements terminated with a \
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: