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