文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2012)06-0018-02
嵌入式設(shè)備與通用計(jì)算機(jī)相比,一般不具備像硬盤(pán)那樣大容量的存儲(chǔ)介質(zhì),大多使用閃存(NAND Flash)作為存儲(chǔ)介質(zhì)。對(duì)于采用Linux操作系統(tǒng)的嵌入式設(shè)備,64 MB的NAND Flash可以滿足Bootloader、內(nèi)核和文件系統(tǒng)的存放,如果使用過(guò)程中涉及大容量的數(shù)據(jù)讀寫(xiě),則多采用SD卡作為擴(kuò)展存儲(chǔ)介質(zhì)。這里的SD卡是指普通SD卡、MiniSD卡和MicroSD卡三種類型的存儲(chǔ)卡。對(duì)SD卡上的數(shù)據(jù)進(jìn)行訪問(wèn)一般有兩種解決方法:(1)將SD卡從嵌入式設(shè)備中取出,使用特定的讀卡器連接到PC上進(jìn)行操作。這種方法需要用戶購(gòu)買(mǎi)特定的讀卡器,使用不方便,用戶也不愿意接受;(2)在嵌入式設(shè)備上增加一個(gè)USB從設(shè)備接口,為嵌入式設(shè)備開(kāi)發(fā)USB從設(shè)備驅(qū)動(dòng)(USB gadget driver),將SD卡模擬成U盤(pán)設(shè)備進(jìn)行訪問(wèn)。這種方法涉及到硬件的改動(dòng)和驅(qū)動(dòng)的開(kāi)發(fā),開(kāi)發(fā)難度大,耗費(fèi)時(shí)間長(zhǎng)。本文提供了一種方便快捷的方法,可以滿足用戶對(duì)SD卡上文件的訪問(wèn)。
vsftp是一個(gè)基于GPL發(fā)布的類Unix系統(tǒng)上使用的FTP服務(wù)器軟件,具有非常安全且快速穩(wěn)定的特點(diǎn),目前已經(jīng)被許多大型站點(diǎn)所采用。vsftp可以方便地移植到嵌入式Linux操作系統(tǒng)中,如果將嵌入式設(shè)備作為FTP服務(wù)器,以PC作為客戶端,用戶即可通過(guò)FTP客戶端軟件實(shí)現(xiàn)PC與嵌入式設(shè)備之間的文件傳輸。如果再將SD卡掛載到文件系統(tǒng)的某個(gè)目錄下,用戶就可通過(guò)FTP服務(wù)來(lái)訪問(wèn)SD卡。
1 移植vsftp到ARM-Linux系統(tǒng)
1.1 交叉編譯
要移植vsftp,首先到vsftpd 官方網(wǎng)站下載程序源碼,本文使用的是vsftpd-2.3.4.tar.gz。解壓vsftpd-2.3.4.tar.gz,然后進(jìn)入vsftpd-2.3.4目錄,修改Makefile文件,將“CC=gcc”修改為“CC=/usr/local/arm/4.3.2/bin/arm-linux-gcc”,即使用交叉編譯器進(jìn)行編譯。執(zhí)行make指令,會(huì)出現(xiàn)“/lib/libcap.so.1: could not read symbols: File in wrong format”編譯錯(cuò)誤,提示找不到libcap.so.1庫(kù)文件,修改vsftpd-2.3.4目錄下的vsf_findlibs.sh文件,注釋掉如下語(yǔ)句:
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
再次執(zhí)行make指令,編譯成功,生成vsftpd文件,執(zhí)行file vsftpd指令,則可顯示如下語(yǔ)句:
vsftpd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked(uses shared libs), for GNU/Linux 2.6.14, stripped
將vsftpd拷貝到嵌入式設(shè)備文件系統(tǒng)的/usr/sbin目錄下。
1.2 查看依賴及其相應(yīng)的配置文件
執(zhí)行arm-linux-readelf –d vsftpd指令查看vsftpd需要的動(dòng)態(tài)鏈接庫(kù),則顯示如下語(yǔ)句:
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]
將以上所列的動(dòng)態(tài)庫(kù)從/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib目錄下拷貝到嵌入式設(shè)備文件系統(tǒng)的/lib目錄下;將vsftpd-2.3.4目錄下的默認(rèn)配置文件vsftpd.conf拷貝到嵌入式設(shè)備文件系統(tǒng)的/etc目錄下。
1.3 啟動(dòng)設(shè)置
在嵌入式設(shè)備文件系統(tǒng)的/etc/rc.d/init.d目錄下添加名為vsftpd的腳本,內(nèi)容如下:
#!/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 &語(yǔ)句,以便在開(kāi)機(jī)時(shí)啟動(dòng)vsftpd服務(wù)器。
2 用戶和目錄設(shè)置
為了使用戶登錄FTP服務(wù)器后能夠直接進(jìn)入SD卡目錄中,需要對(duì)用戶及目錄進(jìn)行設(shè)置。vsftpd提供了匿名用戶、本地用戶、虛擬用戶三種訪問(wèn)方式。
(1)匿名用戶形式:在默認(rèn)安裝的情況下,系統(tǒng)只提供匿名用戶訪問(wèn)。
(2)本地用戶方式:以/etc/passwd中的用戶名為認(rèn)證方式。
(3)虛擬用戶方式:支持將用戶名和口令保存在數(shù)據(jù)庫(kù)文件或數(shù)據(jù)庫(kù)服務(wù)器中。
由于創(chuàng)建用戶較為麻煩,可以采用從host直接拷貝的方式,將/etc目錄下的passwd、passwd-、group、group-、shadow和shadow-文件拷貝到嵌入式設(shè)備文件系統(tǒng)的
/etc目錄下。
執(zhí)行下面命令為訪問(wèn)SD的用戶創(chuàng)建一個(gè)本地用戶,創(chuàng)建好之后就可以用admin登錄,并且其主目錄為/sdcard。這里使用/sdcard作為SD卡的掛載目錄。
#adduser admin –h /sdcard -D
#passwd 123456
admin用戶存在的問(wèn)題就是可以對(duì)主目錄的上層目錄進(jìn)行訪問(wèn)。處于安全的考慮,大多數(shù)情況下需要對(duì)用戶隱藏掉系統(tǒng)文件以防止用戶的誤操作造成的系統(tǒng)崩潰。這就需要對(duì)admin用戶的權(quán)限進(jìn)行限制,使其只可訪問(wèn)/sdcard主目錄文件,其他文件都對(duì)用戶不可見(jiàn)。對(duì)vsftpd.conf配置文件做如下修改:
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
然后把a(bǔ)dmin用戶名添加到文件vsftpd.chroot_list中即可(一行一個(gè)用戶名)。vsftpd.chroot_list是一個(gè)用戶名列表,其中存放的是禁止訪問(wèn)上層目錄的用戶名。
3 訪問(wèn)SD卡
使用網(wǎng)線連接嵌入式設(shè)備和PC,啟動(dòng)嵌入式設(shè)備,vsftpd服務(wù)器會(huì)在開(kāi)機(jī)過(guò)程中自啟動(dòng)。將嵌入式設(shè)備和PC的IP地址設(shè)置在同一網(wǎng)段,在PC端打開(kāi)FTP客戶端軟件,在服務(wù)器欄中輸入嵌入式設(shè)備的IP地址,使用用戶名和密碼進(jìn)行連接登錄??焖龠B接界面如圖1所示。
登錄成功后,用戶將會(huì)看到如圖2所示的界面,從界面右側(cè)的地址欄可以看到/sdcard目錄已被作為用戶的根目錄/,用戶無(wú)法看到上層目錄的內(nèi)容,達(dá)到了使用戶受控訪問(wèn)的目的。
實(shí)驗(yàn)測(cè)試表明,用戶可以方便地通過(guò)FTP客戶端軟件訪問(wèn)到SD卡,而且通過(guò)使用該方法,可以創(chuàng)建不同的用戶,通過(guò)為其設(shè)定不同的主目錄,使用戶能夠?qū)η度胧皆O(shè)備的不同目錄進(jìn)行訪問(wèn)。如果用戶需要最高的權(quán)限,則可允許其他訪問(wèn)到嵌入式設(shè)備的所有目錄和文件,只要不將該用戶名添加到vsftpd.chroot_list中即可。這種靈活性是將嵌入式設(shè)備模擬成USB從設(shè)備難以做到的。
參考文獻(xiàn)
[1] CORBET J,RUBINI A,HARTMAN G K.Linux Device drivers[M].O’reilly Media,Inc,2005.
[2] 彭潁,王方.基于LINUX的VSFTPD服務(wù)的實(shí)現(xiàn)[J].信息系統(tǒng)工程,2010(10).
[3] 李傳偉,胡金春.嵌入式Linux下USB Gadget驅(qū)動(dòng)框架研究[J].航天控制,2006(3).
[4] 周余,王自強(qiáng),都思丹.Linux Gadget系統(tǒng)及其在S3c2410上的海量存儲(chǔ)研究[J].計(jì)算機(jī)應(yīng)用,2006(S2).