http://blog.chinaunix.net/u/21948/showart_504050.html
据我了解,FTP服务器vsftpd,proftpd,pureftpd等。考虑到我的CentOS4.5上装的是vsftpd,而且vsftpd很小,但功能还是比较强大。从网上搜索资料,发现该ftp服务器的移植难度也不大,主要是配置问题。所以就选择了移植vsftpd。有两篇文章写的不错:
1、 http://www.cnitblog.com/zouzheng/archive/2008/03/03/32543.html
2、 http://blog.chinaunix.net/u1/48368/showart_382006.html
我在移植时,并没有完全采用这个思路。主要的想法是尽量利用Host上的配置,先得到相应的依赖关系,然后再深入。
(1)下载vsftpd
官方网站:
:
http://vsftpd.beasts.org/
当前的最新版本是:vsftpd-2.0.6,压缩包只有155k。
(2)交叉编译
需要修改的地方有两处。第一处是Makefile的CC:
# Makefile for systems with GNU tools CC = /usr/local/arm/3.4.1/bin/arm-linux-gcc |
就是修改为你自己的交叉编译器的地址。我因为前面编译一些工具都是使用了3.4.1,所以这里也就继续使用了。
第二处是脚本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,动态编译就成功了。如下:
[root@lqm vsftpd-2.0.6]# file vsftpd vsftpd: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.4.3, dynamically linked (uses shared libs), stripped [root@lqm vsftpd-2.0.6]# ls -l vsftpd -rwxr-xr-x 1 root root 81728 Mar 22 16:46 vsftpd |
(3)查看依赖及其相应的配置文件
首先,因为是动态链接,查看相应的动态库。
[root@lqm vsftpd-2.0.6]# /usr/local/arm/3.4.1/bin/arm-linux-readelf -d vsftpd
Dynamic segment at offset 0x134a4 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] |
把这些库从/usr/local/arm/3.4.1/arm-linux/lib下拷贝到rootfs的lib下。
第一步工作完成了。
第二步工作,把vsftpd拷贝到rootfs的/usr/sbin或者是/usr/local/sbin下面。我的是拷贝到了/usr/sbin下面。
第三步工作就是配置文件vsftpd.conf。我是直接从CentOS4.5的/etc/vsftpd/vsftpd.conf拷贝到了rootfs的/etc/vsftpd.conf。这里测试时有一个问题,如果在rootfs下跟host一样,建立一个vsftpd的话,那么直接启动vsftpd都会产生一个oops错误,就是说只能由inetd或者xinetd来启动。而事实上,我已经设置为listen=YES,应该可以standalone启动。根据情况,屏蔽了几条记录:
#pam_service_name=vsftpd #userlist_enable=YES #enable for standalone mode listen=YES tcp_wrappers=NO |
就是只更改了最后四行。关于具体的配置后面再做探讨。先走通再说。
第四步工作就是牵扯到用户问题了。首先有一个本地用户,这样可以通过本地用户进行访问;其次要匿名用户,这就需要ftp用户;还需要有一个nobody用户。直接创建比较麻烦,所以直接拷贝host的/etc/passwd,/etc/group,/etc/shadow。
[root@listentec ~]#cat /etc/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目录。还需要建立/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模式启动。
[root@listentec /usr]#vsftpd & [root@listentec /usr]#pgrep vsftpd 775 |
在host上测试:
[root@lqm ~]# ftp 192.168.1.100 Connected to 192.168.1.100. 220 (vsFTPd 2.0.6) 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (192.168.1.100:armlinux): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,1,100,201,91) 150 Here comes the directory listing. drwxr-xr-x 2 0 0 0 Mar 22 08:24 pub 226 Directory send OK. ftp> |
[root@lqm ~]# ftp 192.168.1.100 Connected to 192.168.1.100. 220 (vsFTPd 2.0.6) 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (192.168.1.100:armlinux): armlinux 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd /var 250 Directory successfully changed. ftp> ls 227 Entering Passive Mode (192,168,1,100,50,108) 150 Here comes the directory listing. drwxr-xr-x 3 0 0 0 Mar 22 08:24 ftp drwxr-xr-x 2 0 0 0 Mar 19 07:57 lock drwxr-xr-x 3 0 0 0 Mar 22 08:35 log drwxr-xr-x 2 0 0 0 Mar 19 07:57 run drwxr-xr-x 2 0 0 0 Mar 20 00:03 spool drwxr-xr-t 2 0 0 0 Mar 19 07:57 tmp drwxrwxrwx 4 0 0 0 Mar 19 09:23 www 226 Directory send OK. ftp> |
可见成功了。当然,这只是初步工作。对配置部分还很陌生,安全设置也没有。而这些工作才是最为复杂的,要想在开发板上把ftp server弄安全稳定也不容易。不过得慢慢来。
附:开发板rootfs当前已经具备的功能示例
1、ping功能
[root@listentec ~]#ping sdu.edu.cn PING sdu.edu.cn (202.194.15.6): 56 data bytes 64 bytes from 202.194.15.6: seq=0 ttl=58 time=25.015 ms 64 bytes from 202.194.15.6: seq=1 ttl=58 time=24.863 ms 64 bytes from 202.194.15.6: seq=2 ttl=58 time=27.460 ms
--- sdu.edu.cn ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 24.863/25.779/27.460 ms |
ping域名、内网外网ip,都没有问题。
2、nfs client
NFS client is on now and the mounted point is /mnt/nfs |
看看启动信息就可以了。
3、telnet client and server
[root@listentec ~]#telnet 192.168.1.100 Entering character mode Escape character is '^]'.
listentec login: root login[792]: root login on `pts/0 |
4、时间校正
22 Mar 16:34:12 ntpdate[722]: step time server 210.72.145.44 offset 1206174847.300081 sec |
5、df -h
[root@listentec ~]#df -h Filesystem Size Used Available Use% Mounted on rootfs 3.0M 2.1M 884.0k 71% / /dev/root 3.0M 2.1M 884.0k 71% / mdev 14.7M 0 14.7M 0% /dev 192.168.1.106:/home/armlinux/nfs 11.2G 5.1G 5.5G 48% /mnt/nfs |
6、busybox ftpget ftpput
这个没有什么问题,只不过我觉得不太方便。还是要移植一个比较好用的ftp client。待完成。
7、boa server
这个是按照Tekkaman Nin的笔记来的。测试没有问题,比较稳定。后续功能可以逐步开发。
8、tinylogin
也算是一个功能吧。不过现在还有个bug,就是在输入用户名的时候,退格键不起作用,需要解决。
9、ftp server
现在移植好了vsftpd。估计抽时间研究一下配置问题。
后续工作还有很多。希望把大部分可能用到的功能都做一下,选出最优方案定型。这样从bootloader,到kernel,到fs,就都做稳定了。需要什么功能,只需要根据情况再次裁减rootfs和kernel就可以了。也算是自己的工作完成了吧,争取4月底完成所有的工作和整理文档。