移植vsftpd FTP服务器到ARM-Linux系统
一、下载并解压
vsftpd 官方网站:
http://vsftpd.beasts.org/
使用当前的最新版本:vsftpd-2.0.6。
[ tekkamanninja@Tekkaman- Ninja tarball_for_ftp] $ tar xjvf vsftpd- 2. 0. 6. tar. bz2 [ tekkamanninja@Tekkaman- Ninja tarball_for_ftp] $ cd vsftpd- 2. 0. 6
二、交叉编译(for ARM-Linux)
需要修改两处地方。
第一处是Makefile的交叉编译器路径:
[ tekkamanninja@Tekkaman- Ninja vsftpd- 2. 0. 6] $ kwrite Makefile # Makefile for systems with GNU tools 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
第二处是软件源码根目录下的脚本vsf_findlibs.sh。这是因为libcap库的问题。上一次移植我没有成功就是卡在了这里!!网上的修改都是更改到交叉编译器的lib文件夹下,发现即使在lib文件夹下面没有,也不影响。我在网上的提问与那篇文章的作者回复如下:
# re: 嵌入式FTP服务器的移植 您好!我正在移植基于ARM 的Linux下的ftp服务程序。尚未成功,看了您的文章,很受启发。在实际操作中,libcap库的移植出了问题,希望能得到您的帮助。提供一下libcap库的移植文档,谢谢! E-mail:tekkamanninja@163.com QQ:78027228 tekkamanninja 评论于 2008-02-20 08:33 回复 更多评论
# re: 嵌入式FTP服务器的移植 不知道你们怎么都要这个libcap库,按照步骤做就可以了,我也没有这个库文件 zz 评论于 2008-02-25 09:14 回复 更多评论
根据CalmArrow(
http://blog.chinaunix.net/u/21948/showart.php?id=504050 )判断,这个库是没有必要的,直接把这两行注释就可以了。
[ tekkamanninja@Tekkaman- Ninja vsftpd- 2. 0. 6] $ kwrite vsf_findlibs. sh # Look for libcap ( capabilities) # locate_library / lib/ libcap. so. 1 & & echo "/lib/libcap.so.1" ; # locate_library / usr/ lib/ libcap. so & & echo "-lcap" ;
上一次我居然没有试试就放弃了,值得检讨。后来CalmArrow 发现了这个问题,通知了我。我晕,我怎么没想到!!
在这里感谢CalmArrow ,并对他的钻研和实验精神表示敬佩!
不过我觉得不能因为libcap库不需要就不去交叉编译他(也许以后需要),libcap库的交叉编译(需要一定技巧)可以锻炼一下ARM-Linux的交叉编译技能,有空一定试试!
改完后,执行make,动态编译就成功了。
[ tekkamanninja@Tekkaman- Ninja vsftpd- 2. 0. 6] $ make
三、处理动态库依赖及其相应的配置文件
(1)因为是动态编译,查看相应的动态库。
[ tekkamanninja@Tekkaman- Ninja vsftpd- 2. 0. 6] $ file vsftpd vsftpd: ELF 32- bit LSB executable, ARM, version 1, dynamically linked ( uses shared libs) , for GNU/ Linux 2. 4. 3, stripped [ tekkamanninja@Tekkaman- Ninja vsftpd- 2. 0. 6] $ / home/ tekkamanninja/ working/ gcc4. 1. 1/ gcc- 4. 1. 1- glibc- 2. 3. 2/ arm- 9tdmi- linux- gnu/ bin/ arm- 9tdmi- linux- gnu- readelf - d vsftpd Dynamic section at offset 0x130e4 contains 25 entries: Tag Type Name/ Value 0x00000001 ( NEEDED) Shared library: [ libcrypt. so. 1] 0x00000001 ( NEEDED) Shared library: [ libdl. so. 2] 0x00000001 ( NEEDED) Shared library: [ libnsl. so. 1] 0x00000001 ( NEEDED) Shared library: [ libresolv. so. 2] 0x00000001 ( NEEDED) Shared library: [ libutil. so. 1] 0x00000001 ( NEEDED) Shared library: [ libc. so. 6] 0x0000000c ( INIT) 0x97b4 0x0000000d ( FINI) 0x17efc 0x00000004 ( HASH) 0x8128 0x00000005 ( STRTAB) 0x8d78 0x00000006 ( SYMTAB) 0x8548 0x0000000a ( STRSZ) 1245 ( bytes) 0x0000000b ( SYMENT) 16 ( bytes) 0x00000015 ( DEBUG) 0x0 0x00000003 ( PLTGOT) 0x231d4 0x00000002 ( PLTRELSZ) 952 ( bytes) 0x00000014 ( PLTREL) REL 0x00000017 ( JMPREL) 0x93fc 0x00000011 ( REL) 0x93cc 0x00000012 ( RELSZ) 48 ( bytes) 0x00000013 ( RELENT) 8 ( bytes) 0x6ffffffe ( VERNEED) 0x935c 0x6fffffff ( VERNEEDNUM) 2 0x6ffffff0 ( VERSYM) 0x9256 0x00000000 ( NULL ) 0x0 [ tekkamanninja@Tekkaman- Ninja vsftpd- 2. 0. 6] $
把需要的动态库文件 (我是从/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib中)
拷贝到rootfs的/lib下。
(2)把vsftpd拷贝到rootfs中。
我的是拷贝到了/usr/sbin下。
[ tekkamanninja@Tekkaman- Ninja vsftpd- 2. 0. 6] $ cp vsftpd / home/ tekkamanninja/ working/ nfs/ rootfs/ usr/ sbin/
(3)配置文件vsftpd.conf。
我是直接将vsftpd-2.0.6/vsftpd.conf拷贝到了rootfs的 /etc中
[ tekkamanninja@Tekkaman- Ninja vsftpd- 2. 0. 6] $ cp vsftpd. conf / home/ tekkamanninja/ working/ nfs/ rootfs/ etc/
然后我对配置文件进行了修改,实现本地和匿名的文件上传和下载。(暂不考虑安全问题,只为实现其基本功能),具体修改不再赘述,提供我的vsftpd.conf文件,你可以直接使用!
文件: vsftpd.rar 大小: 1KB 下载: 下载
(4)为vsftpd建创建用户。
首先有一个本地用户,这样可以通过本地用户进行访问;其次要匿名用户,需要ftp用户(具体用户明和配置文件有关);至于nobody用户我没有创建照样可用。
[ root@~ ] # adduser - g user ftp Changing password for ftp 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[ 785] : password for `ftp' changed by user `root' Password changed.
(5)创建必须的目录:/usr/share/empty ,否则在访问时会出现:
500 OOPS: vsftpd: not found: directory given in 'secure_chroot_dir' : / usr/ share/ empty
这个与的配置选项相关的。因为默认情况下 secure_chroot_dir为/usr/share/empty。在我的 vsftpd.conf文件中,并没有配置secure_chroot_dir。
[ root@~ ] # mkdir / usr/ share [ root@~ ] # mkdir / usr/ share/ empty
经过以上配置,用本地和匿名登录都成功了,本地和匿名传输文件也成功,(与的配置选项相关)。这只是初步工作,实现其基本功能。对于配置问题(如安全设置)请参考vstfpd的使用和配置的资料,这里不再赘述。给出以下连接方便学习: 《vsFTPd 服务器初学者指南(欢迎大家参与补充)》 http://www.linuxsir.org/main/?q=node/152#6
《VSFTPD 服务器安装配置》http://debian.linuxsir.org/doc/inthedebianway/vsftpd/index.html
这里只介绍我遇到的一个问题(其它问题看以上两个资料或google):
当我一开始用匿名登录时,会出现:
500 OOPS: vsftpd: refusing to run with writable anonymous root
解决方法:http://www.linuxsir.org/main/?q=node/152#6
但注意:使用我的配置方法:ftp用户的家目录(也就是匿名登录的根目录)并非/var/ftp ,而是/home/ftp
[ root@~ ] # cat / etc/ passwd root: x: 0: 0: root: / root: / bin/ sh httpd: x: 500: 500: user: / home/ httpd: / bin/ sh boa: x: 501: 501: user: / home/ boa: / bin/ sh lighttpd: x: 502: 502: user: / home/ lighttpd: / bin/ sh ftp: x: 503: 503: user: / home/ ftp: / bin/ sh
所以修正这个错误,应该用下面的办法:
[ root@localhost ~ ] # chown root: root / home/ ftp [ root@localhost ~ ] # chmod 755 / home/ ftp
以下是我在fedora 7下用gFTP时的截图:一张是root登录,一张是匿名登录。