張傳凱,馬少飛
(北京萬集科技股份有限公司,北京100085)
嵌入式設(shè)備與通用計算機相比,一般不具備像硬盤那樣大容量的存儲介質(zhì),大多使用閃存(NAND Flash)作為存儲介質(zhì)。對于采用Linux操作系統(tǒng)的嵌入式設(shè)備,64 MB的NAND Flash可以滿足Bootloader、內(nèi)核和文件系統(tǒng)的存放,如果使用過程中涉及大容量的數(shù)據(jù)讀寫,則多采用SD卡作為擴展存儲介質(zhì)。這里的SD卡是指普通SD卡、MiniSD卡和MicroSD卡三種類型的存儲卡。對SD卡上的數(shù)據(jù)進行訪問一般有兩種解決方法:(1)將SD卡從嵌入式設(shè)備中取出,使用特定的讀卡器連接到PC上進行操作。這種方法需要用戶購買特定的讀卡器,使用不方便,用戶也不愿意接受;(2)在嵌入式設(shè)備上增加一個USB從設(shè)備接口,為嵌入式設(shè)備開發(fā)USB從設(shè)備驅(qū)動(USB gadget driver),將SD卡模擬成U盤設(shè)備進行訪問。這種方法涉及到硬件的改動和驅(qū)動的開發(fā),開發(fā)難度大,耗費時間長。本文提供了一種方便快捷的方法,可以滿足用戶對SD卡上文件的訪問。
vsftp是一個基于GPL發(fā)布的類Unix系統(tǒng)上使用的FTP服務(wù)器軟件,具有非常安全且快速穩(wěn)定的特點,目前已經(jīng)被許多大型站點所采用。vsftp可以方便地移植到嵌入式Linux操作系統(tǒng)中,如果將嵌入式設(shè)備作為FTP服務(wù)器,以PC作為客戶端,用戶即可通過FTP客戶端軟件實現(xiàn)PC與嵌入式設(shè)備之間的文件傳輸。如果再將SD卡掛載到文件系統(tǒng)的某個目錄下,用戶就可通過FTP服務(wù)來訪問SD卡。
要移植vsftp,首先到vsftpd官方網(wǎng)站下載程序源碼,本文使用的是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”,即使用交叉編譯器進行編譯。執(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文件,注釋掉如下語句:
將vsftpd拷貝到嵌入式設(shè)備文件系統(tǒng)的/usr/sbin目錄下。
執(zhí)行arm-linux-readelf–d vsftpd指令查看vsftpd需要的動態(tài)鏈接庫,則顯示如下語句:
將以上所列的動態(tài)庫從/usr/local/arm/4.3.2/armnone-linux-gnueabi/libc/lib目錄下拷貝到嵌入式設(shè)備文件系統(tǒng)的/lib目錄下;將vsftpd-2.3.4目錄下的默認配置文件vsftpd.conf拷貝到嵌入式設(shè)備文件系統(tǒng)的/etc目錄下。
在嵌入式設(shè)備文件系統(tǒng)的/etc/rc.d/init.d目錄下添加名為vsftpd的腳本,內(nèi)容如下:
在/etc/init.d/rcS文件中添加/usr/sbin/vsftpd&語句,以便在開機時啟動vsftpd服務(wù)器。
為了使用戶登錄FTP服務(wù)器后能夠直接進入SD卡目錄中,需要對用戶及目錄進行設(shè)置。vsftpd提供了匿名用戶、本地用戶、虛擬用戶三種訪問方式。
(1)匿名用戶形式:在默認安裝的情況下,系統(tǒng)只提供匿名用戶訪問。
(2)本地用戶方式:以/etc/passwd中的用戶名為認證方式。
(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卡的掛載目錄。
admin用戶存在的問題就是可以對主目錄的上層目錄進行訪問。處于安全的考慮,大多數(shù)情況下需要對用戶隱藏掉系統(tǒng)文件以防止用戶的誤操作造成的系統(tǒng)崩潰。這就需要對admin用戶的權(quán)限進行限制,使其只可訪問/sdcard主目錄文件,其他文件都對用戶不可見。對vsftpd.conf配置文件做如下修改:
然后把admin用戶名添加到文件vsftpd.chroot_list中即可(一行一個用戶名)。vsftpd.chroot_list是一個用戶名列表,其中存放的是禁止訪問上層目錄的用戶名。
使用網(wǎng)線連接嵌入式設(shè)備和PC,啟動嵌入式設(shè)備,vsftpd服務(wù)器會在開機過程中自啟動。將嵌入式設(shè)備和PC的IP地址設(shè)置在同一網(wǎng)段,在PC端打開FTP客戶端軟件,在服務(wù)器欄中輸入嵌入式設(shè)備的IP地址,使用用戶名和密碼進行連接登錄??焖龠B接界面如圖1所示。
登錄成功后,用戶將會看到如圖2所示的界面,從界面右側(cè)的地址欄可以看到/sdcard目錄已被作為用戶的根目錄/,用戶無法看到上層目錄的內(nèi)容,達到了使用戶受控訪問的目的。
圖2 FTP客戶端
實驗測試表明,用戶可以方便地通過FTP客戶端軟件訪問到SD卡,而且通過使用該方法,可以創(chuàng)建不同的用戶,通過為其設(shè)定不同的主目錄,使用戶能夠?qū)η度胧皆O(shè)備的不同目錄進行訪問。如果用戶需要最高的權(quán)限,則可允許其他訪問到嵌入式設(shè)備的所有目錄和文件,只要不將該用戶名添加到vsftpd.chroot_list中即可。這種靈活性是將嵌入式設(shè)備模擬成USB從設(shè)備難以做到的。
[1]CORBET J,RUBINI A,HARTMAN G K.Linux Device drivers[M].O’reilly Media,Inc,2005.
[2]彭潁,王方.基于 LINUX的VSFTPD服務(wù)的實現(xiàn)[J].信息系統(tǒng)工程,2010(10).
[3]李傳偉,胡金春.嵌入式 Linux下 USB Gadget驅(qū)動框架研究[J].航天控制,2006(3).
[4]周余,王自強,都思丹.Linux Gadget系統(tǒng)及其在 S3c2410上的海量存儲研究[J].計算機應(yīng)用,2006(S2).