一、移植方法
1,下载vsftpd源码,vsftpd-2.1.2.tar.gz。
2,解压后,修改Makefile文件。有2点要修改,其一是CC=gcc改为CC=arm-hisiv200-linux-gcc。
其二是LIBS=`./vsf_findlibs.sh` 改为LIBS=`./vsf_findlibs.sh` -lcrypt
3,make
二、使用方法
1,在hi3716系统里创建nobody用户,adduser -D nobody
2,将vsftpd和vsftpd.conf放到某个文件夹下,启动脚本里加上诸如./vsftpd ./vsftpd.conf &。系统重启生效。
3,在自己电脑客户端可以使用FileZilla之类的软件登陆。
三、配置文件vsftpd.conf说明
1,anonymous_enable=NO不允许匿名用户登陆。
2,local_enable=YES允许本地用户登陆。
3,local_root=/app本地用户登陆访问目录。
4,write_enable=NO登陆用户没有写权限。
5,xferlog_enable=NO不允许vsftpd记录日志
四、相关知识充电
1,匿名用户和本地用户的区别,本地用户就是系统存在的用户,比如root。匿名用户是anonymous,可以让系统之外的用户登陆访问FTP资源。
2,如果本地用户密码为空,也可以登陆。
3,如果3716板子内flash空间容量不多,关闭vsftpd记录日志功能,是很有必要的。
4,vsftpd实现让客户端登陆访问读取资源的原理是建立2个socket,一个是信令socket,端口是21,一个是数据socket。
5,如果你移植的vsftpd版本比较高,比如3.0.2。那么在完成上述步骤后,你会发现使用客户端登陆,能够建立信令socket连接,但是在准备获取目录时,会提示500 OOPS:socket。这是因为高版本vsftpd建立数据socket失败,原因是建立前会舍弃当前有root权限的用户,改为别的用户去执行(猜测是nobody)。我们知道,在嵌入式系统里,如果没有root权限,那么socket是建立不成的。解决办法,要么修改vsftpd源码,位置在于secutil.c,关注vsf_sysutil_setgid和vsf_sysutil_setuid这块;要么换低版本vsftpd。我还看到有人改linux内核的,让普通用户也能建立socket,汗一个。