《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于vsftp的嵌入式设备受控访问方法
基于vsftp的嵌入式设备受控访问方法
来源:电子技术应用2012年第6期
张传凯,马少飞
北京万集科技股份有限公司,北京100085
摘要: 介绍了嵌入式Linux系统上vsftp的搭建和配置方法。给出了一种不使用Linux USB gadget driver API进行复杂的驱动开发仍能方便快捷地访问嵌入式设备SD卡等多种外设的统一方法,并介绍了利用用户权限来实现嵌入式设备受控访问的方法。
中图分类号: TP399
文献标识码: A
文章编号: 0258-7998(2012)06-0018-02
A method of controlled access to embedded devices based on vsftp
Zhang Chuankai,Ma Shaofei
Beijing Wanji Technology Co., Ltd, Beijing 100085,China
Abstract: The paper indroduces the method of how to set up and configure vsftp on Linux system. Gives unified approach of access to the SD cards and other peripherals, avoiding the complex driven development using the Linux USB gadget driver API, and how to use the user permissions to achieve controlled access to embedded devices.
Key words : vsftp;embedded Linux;SD card;controlled access

    嵌入式设备与通用计算机相比,一般不具备像硬盘那样大容量的存储介质,大多使用闪存(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文件,注释掉如下语句:
    if locate_library /lib/libcap.so.1; then
       echo "/lib/libcap.so.1";
    elif locate_library /lib/libcap.so.2; then
       echo "/lib/libcap.so.2";
    else
       locate_library /usr/lib/libcap.so && echo "-lcap";
       locate_library /lib/libcap.so && echo "-lcap";
       locate_library /lib64/libcap.so && echo "-lcap";
    fi
    再次执行make指令,编译成功,生成vsftpd文件,执行file vsftpd指令,则可显示如下语句:
    vsftpd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked(uses shared libs), for GNU/Linux 2.6.14, stripped
    将vsftpd拷贝到嵌入式设备文件系统的/usr/sbin目录下。
1.2 查看依赖及其相应的配置文件
    执行arm-linux-readelf –d vsftpd指令查看vsftpd需要的动态链接库,则显示如下语句:
Dynamic section at offset 0x16a9c contains 29 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/4.3.2/arm-none-linux-gnueabi/libc/lib目录下拷贝到嵌入式设备文件系统的/lib目录下;将vsftpd-2.3.4目录下的默认配置文件vsftpd.conf拷贝到嵌入式设备文件系统的/etc目录下。
1.3 启动设置
    在嵌入式设备文件系统的/etc/rc.d/init.d目录下添加名为vsftpd的脚本,内容如下:
    #!/bin/sh
    base=vsftpd
    # See how we were called.
    case "$1" in
        start)
            /usr/sbin/$base
            ;;
       stop)
        pid=`/bin/pidof $base`
        if [ -n "$pid" ]; then
            kill -9 $pid
        fi
            ;;
    esac
    exit 0
    在/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卡的挂载目录。
    #adduser admin –h /sdcard -D
    #passwd 123456
    admin用户存在的问题就是可以对主目录的上层目录进行访问。处于安全的考虑,大多数情况下需要对用户隐藏掉系统文件以防止用户的误操作造成的系统崩溃。这就需要对admin用户的权限进行限制,使其只可访问/sdcard主目录文件,其他文件都对用户不可见。对vsftpd.conf配置文件做如下修改:
    chroot_local_user=NO
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd.chroot_list
然后把admin用户名添加到文件vsftpd.chroot_list中即可(一行一个用户名)。vsftpd.chroot_list是一个用户名列表,其中存放的是禁止访问上层目录的用户名。
3 访问SD卡
    使用网线连接嵌入式设备和PC,启动嵌入式设备,vsftpd服务器会在开机过程中自启动。将嵌入式设备和PC的IP地址设置在同一网段,在PC端打开FTP客户端软件,在服务器栏中输入嵌入式设备的IP地址,使用用户名和密码进行连接登录。快速连接界面如图1所示。

    登录成功后,用户将会看到如图2所示的界面,从界面右侧的地址栏可以看到/sdcard目录已被作为用户的根目录/,用户无法看到上层目录的内容,达到了使用户受控访问的目的。

 

 

    实验测试表明,用户可以方便地通过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).

此内容为AET网站原创,未经授权禁止转载。