设为首页 收藏本站
查看: 1301|回复: 0

[经验分享] Linux应用程序开发(一)---移植thttpd+Sqlite3+PHP5到arm linux(1)

[复制链接]

尚未签到

发表于 2015-11-17 13:32:49 | 显示全部楼层 |阅读模式
Linux应用程序开发(一)---移植thttpd+Sqlite3+PHP5到arm linux(1)  
  移植环境(红色粗字体字修改后内容,蓝色粗体字为特别注意内容)
  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)创建用户
切换到开发板的串口终端执行
  [iyunv@mini2440 /]#addgroup -g 111 www  //111表示组ID,www表示组名
[iyunv@mini2440 /]#adduser -g 111 www //www表示用户名,111用户名所在的组ID
adduser: group name 'www' is in use
[iyunv@mini2440 /]#adduser -G gwww www
Changing password for www
New password:
Bad password: similar to username
Retype password:
Password for www changed by root
[iyunv@mini2440 /]#
  (3)建立安装目录
  在配置编译之前,要先建立安装所需要的目录
  [iyunv@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/
  下载后解压
  [iyunv@localhost linux-test]# ls
  thttpd-2.25b.tar.gz
解压thttpd-2.25b.tar.gz
  [iyunv@localhost linux-test]# tar -zxvf thttpd-2.25b.tar.gz
  建立安装目录
  在配置编译之前,要先建立安装所需要的目录
  [iyunv@localhost php-5.2.11]# mkdir /nfsboot/rootfs/usr/local
[iyunv@localhost php-5.2.11]#
  【2】交叉编译安装
  [iyunv@localhost linux-test]# cd thttpd-2.25b
[iyunv@localhost thttpd-2.25b]# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/nfsboot/rootfs/usr/local
[iyunv@localhost thttpd-2.25b]# make
[iyunv@localhost thttpd-2.25b]# make install
提示错误:chgrp: 无效的组名称‘‘www’’
解决的办法是:在终端中创建这个组,然后
  [iyunv@localhost thttpd-2.25b]# make install
出现错误:
  cp: 无法创建一般文件“/usr/local/man/man1/makeweb.1”: 没有那个文件或目录
make[1]: *** [install] 错误 1
  解决的办法是:在{$prefix}/usr/local/man/目录下手动创建man1目录
  [iyunv@localhost thttpd-2.25b]# mkdir /nfsboot/rootfs/usr/local/man/man1
[iyunv@localhost thttpd-2.25b]#
[iyunv@localhost thttpd-2.25b]# make install
OK,安装成功。
  【3】去掉相关可执行文件调试信息
[iyunv@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
  [iyunv@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
[iyunv@localhost local]#

[iyunv@localhost local]# arm-linux-strip www/cgi-bin/*
[iyunv@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目录下
[iyunv@localhost thttpd-2.25b]# cp contrib/redhat-rpm/thttpd.conf /nfsboot/rootfs/etc
[iyunv@localhost thttpd-2.25b]#
  设置thttpd.conf中默认的服务目录dir=/home/www/html
  所以这里在开发板运行的目录建立相应目录
  [iyunv@localhost thttpd-2.25b]# mkdir /nfsboot/rootfs/home/www  
[iyunv@localhost thttpd-2.25b]# mkdir /nfsboot/rootfs/home/www/html  //测试网页所在目录
[iyunv@localhost thttpd-2.25b]#
  【5】 拷贝测试网页到thttpd服务的根目录(可选,测试之用):
  [iyunv@localhost thttpd-2.25b]# cp index.html /nfsboot/rootfs/home/www/html
[iyunv@localhost thttpd-2.25b]#

  【6】 查看一下需要的动态库
  [iyunv@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
[iyunv@localhost thttpd-2.25b]#
  参考文章 http://www.jollen.org/blog/2006/10/library_dependency_1.html
  要确保arm-linux运行库中有下列库文件:
  [iyunv@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
[iyunv@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
  然后保存重新执行
  [iyunv@localhost thttpd-2.25b]# make clean
  [iyunv@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
... ...
[iyunv@localhost thttpd-2.25b]# make install
  之后再看下
  [iyunv@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的配置,不过在更改之前,要使之能写。
  [iyunv@localhost thttpd-2.25b]# chmod a+w /nfsboot/rootfs/etc/thttpd.conf
[iyunv@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】运行测试
  当开发板启动并登陆到控制台后,在命令行输入
  [iyunv@mini2440 /]#thttpd -C /etc/thttpd.conf
/sbin/thttpd: line 1: syntax error: "(" unexpected
[iyunv@mini2440 /]#
  原来之前曾复制到/usr/sbin目录下的出现被编译80386体系架构的thttpd文件没有被删除。删除之后再次运行:
  [iyunv@mini2440 /]# /usr/local/sbin/thttpd -V
thttpd/2.25b 29dec2003
[iyunv@mini2440 /]#
  OK,运行成功!
  现在启动thttpd服务
  [iyunv@mini2440 /]# /usr/local/sbin/thttpd -C /etc/thttpd.conf
/var/log/thttpd.log: No s h file or directory
[iyunv@mini2440 /]#
  建立日志文件
  [iyunv@localhost rootfs]# cd var
[iyunv@localhost var]# mkdir log
[iyunv@localhost var]# cd log
[iyunv@localhost log]# ls
[iyunv@localhost log]# to h thttpd.log
[iyunv@localhost log]# ls
thttpd.log
[iyunv@localhost log]#
  再次运行
  [iyunv@mini2440 /]# /usr/local/sbin/thttpd  -C /etc/thttpd.conf
[iyunv@mini2440 /]#
  thttpd服务成功启动。
  在本地终端测试一下
  [iyunv@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】解压源码
  [iyunv@localhost linux-test]# tar -zxvf sqlite-autoconf-3070701.tar.gz
  【3】编译配置
  [iyunv@localhost linux-test]# cd sqlite-autoconf-3070701
[iyunv@localhost sqlite-autoconf-3070701]# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/nfsboot/rootfs/usr/local
[iyunv@localhost sqlite-autoconf-3070701]# make
[iyunv@localhost sqlite-autoconf-3070701]# make install
下面步骤参考文章S3C2410下嵌入式数据库SQLite的移植
  【4】在开发板控制终端的/usr/sbin建立到/usr/local/bin 的软连接
  [iyunv@mini2440 /sbin]#ln -s /usr/local/bin/sqlite3 sqlite3
  [iyunv@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
  [iyunv@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查看下
  [iyunv@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'
[iyunv@mini2440 /]#
  [iyunv@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 ";"
sqlite>
  输入.help可看到其操作命令。

未完,接下篇

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-140352-1-1.html 上篇帖子: 基于loongson1b开发板(mips架构)移植apache+sqlite3+php5 下篇帖子: 【引用】Linux应用程序开发(一)---移植thttpd+Sqlite3+PHP5到arm linux(2)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表