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