基于vsftp的嵌入式设备受控访问方法
2012-08-13张传凯马少飞
张传凯,马少飞
(北京万集科技股份有限公司,北京100085)
嵌入式设备与通用计算机相比,一般不具备像硬盘那样大容量的存储介质,大多使用闪存(NAND Flash)作为存储介质。对于采用Linux操作系统的嵌入式设备,64 MB的NAND Flash可以满足Bootloader、内核和文件系统的存放,如果使用过程中涉及大容量的数据读写,则多采用SD卡作为扩展存储介质。这里的SD卡是指普通SD卡、MiniSD卡和MicroSD卡三种类型的存储卡。对SD卡上的数据进行访问一般有两种解决方法:(1)将SD卡从嵌入式设备中取出,使用特定的读卡器连接到PC上进行操作。这种方法需要用户购买特定的读卡器,使用不方便,用户也不愿意接受;(2)在嵌入式设备上增加一个USB从设备接口,为嵌入式设备开发USB从设备驱动(USB gadget driver),将SD卡模拟成U盘设备进行访问。这种方法涉及到硬件的改动和驱动的开发,开发难度大,耗费时间长。本文提供了一种方便快捷的方法,可以满足用户对SD卡上文件的访问。
vsftp是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,具有非常安全且快速稳定的特点,目前已经被许多大型站点所采用。vsftp可以方便地移植到嵌入式Linux操作系统中,如果将嵌入式设备作为FTP服务器,以PC作为客户端,用户即可通过FTP客户端软件实现PC与嵌入式设备之间的文件传输。如果再将SD卡挂载到文件系统的某个目录下,用户就可通过FTP服务来访问SD卡。
1 移植vsftp到ARM-Linux系统
1.1 交叉编译
要移植vsftp,首先到vsftpd官方网站下载程序源码,本文使用的是vsftpd-2.3.4.tar.gz。解压vsftpd-2.3.4.tar.gz,然后进入vsftpd-2.3.4目录,修改 Makefile文件,将“CC=gcc”修 改 为 “CC=/usr/local/arm/4.3.2/bin/arm-linux-gcc”,即使用交叉编译器进行编译。执行make指令,会出现“/lib/libcap.so.1:could not read symbols:File in wrong format”编译错误,提示找不到libcap.so.1库文件,修改 vsftpd-2.3.4目录下的vsf_findlibs.sh文件,注释掉如下语句:
将vsftpd拷贝到嵌入式设备文件系统的/usr/sbin目录下。
1.2 查看依赖及其相应的配置文件
执行arm-linux-readelf–d vsftpd指令查看vsftpd需要的动态链接库,则显示如下语句:
将以上所列的动态库从/usr/local/arm/4.3.2/armnone-linux-gnueabi/libc/lib目录下拷贝到嵌入式设备文件系统的/lib目录下;将vsftpd-2.3.4目录下的默认配置文件vsftpd.conf拷贝到嵌入式设备文件系统的/etc目录下。
1.3 启动设置
在嵌入式设备文件系统的/etc/rc.d/init.d目录下添加名为vsftpd的脚本,内容如下:
在/etc/init.d/rcS文件中添加/usr/sbin/vsftpd&语句,以便在开机时启动vsftpd服务器。
2 用户和目录设置
为了使用户登录FTP服务器后能够直接进入SD卡目录中,需要对用户及目录进行设置。vsftpd提供了匿名用户、本地用户、虚拟用户三种访问方式。
(1)匿名用户形式:在默认安装的情况下,系统只提供匿名用户访问。
(2)本地用户方式:以/etc/passwd中的用户名为认证方式。
(3)虚拟用户方式:支持将用户名和口令保存在数据库文件或数据库服务器中。
由于创建用户较为麻烦,可以采用从host直接拷贝的方式,将/etc目录下的 passwd、passwd-、group、group-、shadow和shadow-文件拷贝到嵌入式设备文件系统的/etc目录下。
执行下面命令为访问SD的用户创建一个本地用户,创建好之后就可以用admin登录,并且其主目录为/sdcard。这里使用/sdcard作为SD卡的挂载目录。
admin用户存在的问题就是可以对主目录的上层目录进行访问。处于安全的考虑,大多数情况下需要对用户隐藏掉系统文件以防止用户的误操作造成的系统崩溃。这就需要对admin用户的权限进行限制,使其只可访问/sdcard主目录文件,其他文件都对用户不可见。对vsftpd.conf配置文件做如下修改:
然后把admin用户名添加到文件vsftpd.chroot_list中即可(一行一个用户名)。vsftpd.chroot_list是一个用户名列表,其中存放的是禁止访问上层目录的用户名。
3 访问SD卡
使用网线连接嵌入式设备和PC,启动嵌入式设备,vsftpd服务器会在开机过程中自启动。将嵌入式设备和PC的IP地址设置在同一网段,在PC端打开FTP客户端软件,在服务器栏中输入嵌入式设备的IP地址,使用用户名和密码进行连接登录。快速连接界面如图1所示。
登录成功后,用户将会看到如图2所示的界面,从界面右侧的地址栏可以看到/sdcard目录已被作为用户的根目录/,用户无法看到上层目录的内容,达到了使用户受控访问的目的。
图2 FTP客户端
实验测试表明,用户可以方便地通过FTP客户端软件访问到SD卡,而且通过使用该方法,可以创建不同的用户,通过为其设定不同的主目录,使用户能够对嵌入式设备的不同目录进行访问。如果用户需要最高的权限,则可允许其他访问到嵌入式设备的所有目录和文件,只要不将该用户名添加到vsftpd.chroot_list中即可。这种灵活性是将嵌入式设备模拟成USB从设备难以做到的。
[1]CORBET J,RUBINI A,HARTMAN G K.Linux Device drivers[M].O’reilly Media,Inc,2005.
[2]彭颍,王方.基于 LINUX的VSFTPD服务的实现[J].信息系统工程,2010(10).
[3]李传伟,胡金春.嵌入式 Linux下 USB Gadget驱动框架研究[J].航天控制,2006(3).
[4]周余,王自强,都思丹.Linux Gadget系统及其在 S3c2410上的海量存储研究[J].计算机应用,2006(S2).