移植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文件夹下面没有,也不影响。我在网上的提问与那篇文章的作者回复如下:
http://www.cnitblog.com/zouzheng/archive/2008/02/25/32543.html#40104
# 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登录,一张是匿名登录。
|
文件: |
截图.rar |
大小: |
240KB |
下载: |
下载 |
|