您的位置:首页 > 编程语言 > PHP开发

嵌入式FTP服务器的移植与配置:VSFTPD-2.0.6移植(目标板mini2440)

2013-07-06 03:54 871 查看
在移植之前首先在虚拟机上ping下开发板,再用开发板ping虚拟机,请保证ping通再做以下工作,其次丢包率如果很高,那就要看DM900网卡移植那篇,进行网卡移植。最终要确保丢包率为0. 不然就算你移植VSFTPD中间没有错误,最后也会出现ftp时连接不上开发板。

(1)解压vsftpd-2.0.6.tar.gz

#tar xvzf vsftpd_2.0.6.tar.gz

(2)交叉编译

需要修改的地方有两处。

第一处是Makefile的CC:

# Makefile for systems with GNU tools

CC = arm-unknown-linux-gnueabi-gcc

就是修改为你自己的交叉编译器。

在/etc/xinetd.d/vsftpd文件中,把disable=no改成YES

还有就是在/etc/vsftpd.conf文件添加listen=yes

第二处是脚本vsf_findlibs.sh。这里主要是牵扯到库libcap的问题。(网上的修改都是更改到交叉编译器的lib文件夹下,发现即使在lib文件夹下面没有,也不影响。判断,这个库是没有必要,直接把这两行注释就可以了。)

# Look for libcap (capabilities)

#locate_library /lib/libcap.so.1 && echo "/lib/libcap.so.1"; //注释掉

#locate_library /usr/lib/libcap.so && echo "-lcap"; //注释掉

改完后,执行make,如动态编译失败结果如下


 

则下载vsftpd中sysdeputil.c的补丁文件attachment.bin,可用wget命令;(直接编译成功的可跳过这步)

.#patch sysdeputil.c attachment.bin;(attachment.bin的源码附在文章最后,下载不到可以自己建)

再次执行 make 编译成功 结果如下:



由于本文件系统支持这个服务,所以以下蓝色部分可以省略; 查看相关信息;

/*(3)查看依赖及其相应的配置文件

首先,因为是动态链接,查看相应的动态库



把这些库从下拷贝到rootfs的lib下。*/ 库的位置在你的交叉编译工具链目录下用find 命令可找到

第一步工作完成了。

(拷贝库的时候用 cp -d -L 以保留库的链接)

第二步工作,把vsftpd拷贝到rootfs的/usr/sbin或者是/usr/local/sbin下面。

第三步工作就是配置文件vsftpd.conf。

直接修改vsftpd-2.0.6中的vsftpd.conf,修改后拷贝到rootfs的 /etc/vsftpd.conf。

anonymous_enable=YES

local_enable=YES

write_enable=YES

local_umask=077

anon_upload_enable=YES

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_std_format=YES

pam_service_name=vsftpd

anon_root=/var/ftp

listen=YES

第四步工作就是牵扯到用户问题了。首先有一个本地用户,这样可以通过本地用户进行访问;其次要匿名用户,这就需要ftp用户;还需要有一个nobody用户。

直接拷贝host的/etc/passwd,/etc/group,/etc/shadow。(若在制作yaffs文件系统那步已经拷过,则省去此步骤)。

将 group中内容替换为如下:

root::0:root:

ftp:x:50:

nobody:x:99:

users:x:100:

500:x:500:boa:

501:x:501:armlinux:

这样用户问题就解决了。

第五步工作就是相应的目录需要创建。

支持匿名用户需要创建/var/ftp,在ftp下建立了pub上传目录并设置pub权限为可修改

chmod 777 /ftp/pub。还需要建立/usr/share/empty目录,否则在访问时会出现:

500 OOPS: vsftpd: not found: directory given in ''''secure_chroot_dir'''':/usr/share/empty

这个是与配置选项相关的。

/usr/sbin/vsftpd ---- VSFTPD的主程序(必需)

/etc/rc.d/init.d/vsftpd ---- 启动脚本

/etc/vsftpd.conf ---- 主配置文件(必需)

/etc/pam.d/vsftpd ---- PAM认证文件

/etc/vsftpd.ftpusers ---- 禁止使用VSFTPD的用户列表文件

/etc/vsftpd.user_list ---- 禁止或允许使用VSFTPD的用户列表文件

/etc/userconf ------ 指定用户个人配置文件所在的目录

/var/ftp ---- 匿名用户主目录

/var/ftp/pub---- 匿名用户的上传目录

/var/log/vsftpd.log ------- 日志文件

除vsftpd、vsftpd.conf两个文件外,其他文件的需要具体看主配置文件的配置

建立了绿色部分。然后制作映象,烧写到目标板上,

通过standalone模式启动。

先要修改目标板的IP地址

Ifconfig eth0 10.10.70.12 netmask 255.255.255.0

然后起用服务:

[root@xiao sbin]#vsftpd &

在host上测试(hont的IP要和目标板IP在同一网段中):IE中输入ftp://10.10.70.12/ 启动,查看是否运行;

出显FTP服务器共享文件ftp;

FTP服务器的移植成功;

宿主机登陆开发板时

匿名用户登陆用户名 anonymous

密码按回车即可

用ftp向开发板传文件时先cd .. 然后cd pub

put xxx(xxx为宿主机当前目录下你要传给开发板的文件的文件名)

attachment.bin的代码如下

diff -pNur vsftpd-2.0.5.orig/sysdeputil.c vsftpd-2.0.5/sysdeputil.c

--- vsftpd-2.0.5.orig/sysdeputil.c 2006-07-02 15:14:10.000000000 -0700

+++ vsftpd-2.0.5/sysdeputil.c 2006-10-19 23:41:58.000000000 -0700

@@ -155,14 +155,15 @@

#include <sys/capability.h>

#if defined(VSF_SYSDEP_HAVE_CAPABILITIES) && !defined(VSF_SYSDEP_HAVE_LIBCAP)

-#include <linux/unistd.h>

#include <linux/capability.h>

#include <errno.h>

-#include <syscall.h>

-_syscall2(int, capset, cap_user_header_t, header, const cap_user_data_t, data)

-/* Gross HACK to avoid warnings - linux headers overlap glibc headers */

-#undef __NFDBITS

-#undef __FDMASK

+#include <sys/syscall.h>

+#include <unistd.h>

+int capset(cap_user_header_t header,

+ cap_user_data_t data)

+{

+ return syscall(SYS_capset, header, data);

+}

#endif /* VSF_SYSDEP_HAVE_CAPABILITIES */

#if defined(VSF_SYSDEP_HAVE_LINUX_SENDFILE) || \
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: