最近試著在嵌入式系統(tǒng)建立一個ftp服務器。從網(wǎng)上搜羅了一大堆,但是下載下來編譯的時候卻發(fā)現(xiàn)自己對交叉編譯方面的知識知道的太少了。哎,于是抱著網(wǎng)絡,狂搜了一通,終于多少有點頭緒。但是運氣比較差,很多程序源碼都不能正確的編譯,目前只有這個vsftpd和tftp編譯通過了。真的好不容易呀,對于我這種菜鳥來說。所以,還是將這期間的一些東西記錄下來,也免得健忘的我以后再也回憶不起來了。
正題:
1. FTP相關知識
1.1 綜述
文件傳輸協(xié)議(File Transfer Protocol,F(xiàn)TP)的目的是在互聯(lián)網(wǎng)上進行平臺無關的數(shù)據(jù)傳輸,它基于客戶機Client/服務器Server框架。RFC959規(guī)定FTP將通過兩個信道(端口)傳輸,一個傳輸數(shù)據(jù)(端口20),另外一個傳輸控制信息(端口21)。在控制信道之上,雙方交換用于發(fā)起數(shù)據(jù)傳輸?shù)拿睢?
一個FTP連接包含4個步驟:用戶鑒權;建立控制信道;建立數(shù)據(jù)信道;關閉連接。
FTP的連接控制使用傳輸控制協(xié)議(Transmission Control Protocol,TCP),從而保證了數(shù)據(jù)的可靠傳輸。因此,F(xiàn)TP在數(shù)據(jù)傳輸中不需要關系分組丟失和數(shù)據(jù)錯誤檢測。
1.2 vsftpd
在UNIX和Linux中,從安全角度上考慮的話,首推的就是VSFTPD(Very Secure FTP Daemon)
,它可以運行在諸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服務器不支持的特征。比如: 非常高的安全性需求
帶寬限制
良好的可伸縮性
創(chuàng)建虛擬用戶的可能性
IPnG(譯注:IPv6)支持
中等偏上的性能
分配虛擬 IP 的可能性 高速
(其實以上的綜述是我東拼西湊出來了,因為我目前也還沒有感到它的優(yōu)點。呵呵?。?
1.3 tftp
TFTP(Trivial File Transfer Protocol,簡單文件傳輸協(xié)議)也是TCP/IP協(xié)議族中的用于客戶機與服務器之間進行簡單文件傳輸?shù)膮f(xié)議,只是其提供不復雜、開銷不大的文件傳輸服務。值得注意的是TFTP承載在UDP上,故而不提供可靠的數(shù)據(jù)流傳輸服務、不提供存取授權與認證機制,其通過超時重傳方式來保證數(shù)據(jù)的到達。與FTP相比,TFTP要小的多,所以它只能從遠程服務器上讀、寫文件(郵件)或者讀、寫文件傳送給遠程服務器,不能列出目錄并且用戶認證。另外,與FTP不同的是,TFTP采用默認端口69#來進行傳輸。
2. 編譯系統(tǒng)
編譯環(huán)境:虛擬機Fedora3.0;
交叉編譯工具:mipsel-linux;
3. 源碼下載
官方網(wǎng)站:http://vsftpd.beasts.org/
下載地址:ftp://vsftpd.beasts.org/users/cevans/
?。ㄗ钚碌陌姹荆簐sftpd-2.0.5.tar.gz)
http://sourceforge.net/
?。?.0的簡單版本的tftp server和client C程序)
4. vstftp編譯細節(jié)
為了避免出錯,我在寫該部分的時候對整個下載以及編譯過程重新執(zhí)行了一遍,確保在我的系統(tǒng)上是Success的。
4.1 交叉編譯
?。ar -zxvf vsftpd-2.0.5.tar.gz
?。d vsftpd-2.0.5
?。i Makefile
根據(jù)自己的編譯器修改CC選項,我的修改為: CC=mipsel-linux-gcc
?。ake
如果順利的話,應該生成vsftpd文件。
4.2 安裝
因為我們是要將其放置到我們的嵌入式系統(tǒng)中的,所以不能使用make install來直接安裝,需要我們自己手動來拷貝一些文件到自己系統(tǒng)的相關目錄下。這個從INSTALL文件中有很詳細的說明,但這里我還是羅嗦一下吧(備注:我這里提到了目標路徑均是嵌入式系統(tǒng)的相關路徑):
#cp vsftpd /usr/local/sbin/ 或者 /usr/sbin/
?。p vstftpd.conf.5 /usr/local/man/man5/ 或者 /usr/share/man/man5/
或者/usr/man/man5/
?。p vsftpd.8 /usr/local/man/man8 或者 /usr/share/man/man5/
或者/usr/man/man5/
?。p xinetd.d/vsftpd.conf /etc/vsftpd.conf
注:vsftpd的配置選項均在vsftpd.conf文件中,根據(jù)自己的需求可以增添或者刪減一些內容。
4.3 運行模式
現(xiàn)在大致我們已經(jīng)將vsftpd移植到我們的嵌入式平臺中去了。但是vsftpd有三種運行模式:inetd、xinted和standalone模式。對于RPM包管理的系統(tǒng),有xinted服務器一說,對于非RPM包管理系統(tǒng),沒有xinted,一般都使用inetd或者standalone來啟動和管理服務器,這也就是獨立運行模式。
為了能讓vsftpd在系統(tǒng)中運行,我們必須檢查以下幾個方面:
1) 是否存在用戶nobody
?。seradd nobody/ftp
2) 目錄/usr/share/empty
3) 如果支持用戶匿名訪問,在需要創(chuàng)建目錄/var/ftp
?。kdir /var/ftp/
?。seradd –d /var/ftp ftp
在以上的基礎上,我們就可以按照以下三種方式來運行vsftpd。
(1) inetd
我們需要編輯配置文件/etc/inetd.conf,并在文中的FTP那行,有則修改無則增添如下項目:
ftp stream tcp nowait root /usr/sbin/tcpd vsftpd
?。?) xinted
需要修改源碼xinted.d/vsftpd文件。對如下的內容需要在server欄填入4.2中的拷貝的vsftpd路徑,另外默認disable=no,即每次開機會自動啟動該項服務,如果需要手動啟動的話,將其更改為yes。
service ftp
{
socket_type = stream
wait = no
user = root
server = /usr/local/sbin/vsftpd
# server_args = # log_on_success += DURATION USERID # log_on_failure += USERID nice = 10 disable = no } 通過service xinetd restart或者/etc/init.d/xinetd restart來啟動該項服務(在修改了以上配置或者采用手動啟動方式)。
注:選用inted或者xinted模式運行的時候vsftpd.conf中的listen選項為no。
(3) standalone模式
選用standalone模式的時候需要將vsftpd.conf文件中l(wèi)isten選項改為yes。
對于以上三種模式來說,均可以使用通用的vsftpd啟動模式,即:
/usr/sbin/vsftpd & 或者/usr/local/vsftpd &
通常會犯的錯誤就是在鍵入上述命令之后系統(tǒng)提示:“500 OOPS: could not bind listening IPv4 socket”的出錯信息,這往往是由于沒有修改好vsftpd.conf文件使得xinetd已經(jīng)啟動了vsftpd,而vsftpd卻設置成了standalone模式。所以,先使用service xinetd stop停止xinetd服務,然后再通過上面的命令來啟動?;蛘呷绻麅H使用standalone模式來啟動,可以刪除掉/etc/xinetd/vsftpd文件。
當然,你可以通過pgrep vsftpd來檢查vsftpd是否運行起來,當屏幕上出現(xiàn)一個阿拉伯數(shù)字的時候,恭喜你,嵌入式系統(tǒng)中的vsftpd服務器已經(jīng)建立起來了。之后就可以與通信的另外一個PC主機或者同樣的嵌入式系統(tǒng)(當然,這個系統(tǒng)中應當有ftp的客戶端程序,如:ftp命令、lftp以及gftp等工具)進行測試連接了。
5. tftp編譯細節(jié)
5.1 交叉編譯
?。ar -zxvf tftp-1.0.tar.gz
?。d tftp-1.0
#vi Makefile
根據(jù)自己的編譯器修改CC選項,我的修改為:
CC=mipsel-linux-gcc
同時,將strip 修改為mipsel-linux-strip.
#make
如果順利的話,應該生成tftpc(client端)和tftpd(server端)文件。
5.2 安裝
因為我們是要將其放置到我們的嵌入式系統(tǒng)中的,所以不能使用make install來直接安裝,需要我們自己手動將生成的tftpc和tftpd拷貝到自己系統(tǒng)的目錄下(我放到根目錄下,其實這個是個不好的習慣,應該也放到sbin下)。
5.3 運行
現(xiàn)在我們已經(jīng)可以在嵌入式系統(tǒng)中運行tftp的server以及client了。當通信鏈路建立起來之后,tftp server端可以通過運行./tftpd 來啟動。從端的啟動就要略微負責些了,因為要指定一些東西。比如我們需要從IP地址為192.168.81.123的tftp server端取到一個test.doc的文件,則需要在從端輸入如下命令:./tftpc 192.168.81.123 –P 69# -g test.doc
簡單說明一下:-P 69#是指采用端口69通信;-g 從server端得到文件;-p就是發(fā)送文件到server端嘍。
Tftp運行起來很簡單,且不需要鑒權,但其目前還是不能提供目錄瀏覽的功能。
6. 小結
總結起來,在進行以上編譯的時候,我不知道犯了多少錯誤,完全是Linux的菜鳥,但這一周以來我真的懂得了很多這方面的知識,所以加油、加油!我要繼續(xù)努力!