使用TFTP進(jìn)行文件傳輸 (系統(tǒng)版本: Ubuntu 14.04或以上)
在嵌入式系統(tǒng)開發(fā)中,經(jīng)常需要從主機(jī)上傳送映像、文件等到目標(biāo)機(jī)上。實(shí)現(xiàn)的方法有很多。如tftp,scp等。 TFTP(Trivial File Transfer Protocol)是用來下載遠(yuǎn)程文件的最簡(jiǎn)單的網(wǎng)絡(luò)協(xié)議,它基于UDP協(xié)議而實(shí)現(xiàn)。
一、TFTP的建立 嵌入式linux的tftp開發(fā)環(huán)境包括兩個(gè)方面:一是linux服務(wù)器端的tftp-server支持,二是嵌入式目標(biāo)系統(tǒng)的tftp-client支持。因?yàn)閡-boot本身內(nèi)置支持tftp-client,所以嵌入式目標(biāo)系統(tǒng)端就不用配置了。我們要做的是在服務(wù)器端(即主機(jī))上安裝TFTP服務(wù),并且正確地配置TFTP服務(wù)的路徑和參數(shù)。
下面我嘗試了搭建TFTP的方法,實(shí)測(cè)成功。
首先需要安裝:tftp-hpa sudoapt-get install tftp-hpa sudoapt-get install tftpd-hpa
tftp-hpa是客戶端,作用是從別人的TFTP服務(wù)器端上傳/下載東西。 tftpd-hpa是服務(wù)端,字母d代表daemon,作用是為別人提供TFTP服務(wù),供別人上傳/下載東西。
2、創(chuàng)建TFTP目錄 首先需要建立一個(gè)TFTP目錄,以供上傳和下載。當(dāng)然也可以使用現(xiàn)有的目錄。然后需要設(shè)定該目錄的權(quán)限,決定是否能夠下載和上傳文件。對(duì)于日常使用,我們一般就將其權(quán)限設(shè)置為最高,為所有用戶組都添加所有權(quán)限(讀+寫+執(zhí)行=4+2+1=7): sudomkdir ~/tftp_boot sudochmod 777 tftp_boot –R
我們的TFTP目錄為/home/ghostar/tftp_boot,其權(quán)限已經(jīng)是最高。
3、修改配置文件 修改tftpd-hpa相應(yīng)的配置文件 sudogedit /etc/default/tftpd-hpa
原始的內(nèi)容如下: #/etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/var/lib/tftpboot" TFTP_ADDRESS="[...]:69" TFTP_OPTIONS="--secure"
我將其修改為: #/etc/default/tftpd-hpa TFTP_USERNAME="ghostar" TFTP_DIRECTORY="/home/ghostar/tftp_boot" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="-l-c -s"
說明: TFTP_USERNAME:必須改為當(dāng)前的用戶名,或者root; TFTP_DIRECTORY:我們?cè)O(shè)定的TFTP根目錄; TFTP_OPTIONS:TFTP啟動(dòng)參數(shù)。意義如下:
-l:以standalone/listen模式啟動(dòng)TFTP服務(wù),而不是從inetd啟動(dòng)。 (這里也表明,再像前面一樣裝xinetd,其實(shí)是多此一舉) -c:可創(chuàng)建新文件。默認(rèn)情況下,TFTP只允許覆蓋原有文件,不能創(chuàng)建新文件。 -s:改變TFTP啟動(dòng)的根目錄。加了-s后,客戶端使用TFTP時(shí),不再需要輸入指定目錄,填寫文件的完整路徑,而是使用配置文件中寫好的目錄。這樣也可以增加安全性。
我一開始沒有注意TFTP_USERNAME這一項(xiàng),隨便取了一個(gè)名字,一直沒有成功,后來改用自己的用戶名,才測(cè)試成功。
4、重新啟動(dòng)服務(wù)
重啟tftpd-hpa服務(wù): sudo service tftpd-hpa restart 如果顯示如下,說明配置正確: tftpd-hpastart/running, process 2290
之前我沒有把TFTP_USERNAME該為用戶名,而是隨便取了一個(gè),則會(huì)提示如下: tftpd-hpastart/running 對(duì)比發(fā)現(xiàn),這里并沒有啟動(dòng)進(jìn)程,因?yàn)榕渲弥蠺FTP_USERNAME不正確,也就沒有成功開啟TFTP。
5、確認(rèn)tftp服務(wù)是否已經(jīng)開啟 下面確認(rèn)tftp服務(wù)是否開啟。 查看tftp相關(guān)進(jìn)程可以用以下指令: psaux |grep tftp 彈出以下信息 ghostar@ubuntu:~$ ps aux|grep tftp 可以看到, /usr/sbin/in.tftpd已經(jīng)啟動(dòng),說明TFTP服務(wù)已經(jīng)開啟了,進(jìn)程號(hào)正是3151。 --listen對(duì)應(yīng)配置文件中的參數(shù) -l --user ghostar 就是配置文件中的TFTP_USERNAME /home/ghostar/tftp_boot是配置文件中的TFTP_DIRECTORY
另一種方法: netstat-a|grep tftp 如果看到如下提示,說明TFTP服務(wù)開啟了。 udp 0 0 *:tftp *:*
二、TFTP的使用 1、連接本機(jī) 連接本機(jī)有三種方法,一是輸入真實(shí)的IP地址,可以用ifconfig查得;二是用localhost來代表本機(jī);三是使用地址127.0.0.1,這個(gè)IP地址始終代表本機(jī)的IP。 先在TFTP目錄下新建一個(gè)文件a,在里面隨便寫一些內(nèi)容,然后修改其權(quán)限為777。接著,輸入以下指令的任意一條,進(jìn)入TFTP命令行。 tftp 192.168.1.201 (自己設(shè)定的IP) tftp localhost tftp127.0.0.1
TFTP命令行的基本指令: put:將文件上傳到TFTP目錄 get:取得TFTP目錄上的文件 quit/q:退出TFTP
因?yàn)門FTP服務(wù)將某一設(shè)定的目錄視為根目錄,因此不需要打出完整的路徑。既然該目錄下已經(jīng)有一個(gè)文件a,我們就下面輸入指令: tftp>get a
tftp>put a
如果沒有任何提示,則說明傳輸成功。
下面看看當(dāng)配置參數(shù)和文件權(quán)限改變時(shí),會(huì)出現(xiàn)什么現(xiàn)象。我列舉了一些常見問題:
tftp>get a Transfer timed out. 原因:tftpd服務(wù)沒有啟動(dòng)。 需要注意的是,必須使TFTP的用戶名和當(dāng)前的系統(tǒng)的用戶名一致,否則就無法成功啟動(dòng)tftpd服務(wù)。
tftp>get a permission denied 原因:操作者權(quán)限不夠,比如當(dāng)前的目錄是/etc,不能隨便get文件下來。需要提升權(quán)限。切換到root賬戶,或者直接執(zhí)行sudo tftp。
tftp>put t1 tftp: t1: No such file or directory 原因:當(dāng)前目錄下沒有t1文件
tftp>get d Error code 1: File not found 原因:TFTP根目錄下沒有該文件
Error code 2: Only absolute filenamesallowed 原因:TFTP啟動(dòng)配置參數(shù)沒有-s,或者在DIRECTORY中沒有填寫目錄
tftp>put b Error code 1: File not found 原因:?jiǎn)?dòng)配置參數(shù)無-c,根目錄下無同名文件 (注意和前面情況的區(qū)別,不是當(dāng)前目錄下沒有b文件,而是TFTP目錄下找不到同名文件b)
tftp>put b Error code 2: File must have global writepermissions 原因:根目錄下有同名文件,該文件無寫權(quán)限(啟動(dòng)配置參數(shù)有無-c都這樣)
經(jīng)測(cè)試,在tftp-hpa方法下,下列情況可以put成功: l 啟動(dòng)配置參數(shù)無-c,根目錄下有同名文件,有寫權(quán)限 l 啟動(dòng)配置參數(shù)有-c,根目錄下無同名文件 l 啟動(dòng)配置參數(shù)有-c,根目錄下有同名文件,有寫權(quán)限
2、連接實(shí)驗(yàn)箱(未完成) 實(shí)驗(yàn)箱操作系統(tǒng)中的TFTP服務(wù)已經(jīng)裝好,是在BusyBox v1.12.0中的。它的用法與本機(jī)的略有區(qū)別,但原理是一樣的。
基本參數(shù): -g: get,獲取文件 -p: put,長(zhǎng)傳文件 -l FILE:本地的文件,名為FILE -r FILE:遠(yuǎn)程的文件,名為FILE
實(shí)驗(yàn)箱的IP地址為192.168.1.200,我主機(jī)的IP地址為192.168.1.201。兩者的IP應(yīng)該在一個(gè)網(wǎng)段內(nèi),才能順利通信。
使用舉例: sudo minicom 進(jìn)入了實(shí)驗(yàn)箱的Linux操作系統(tǒng)。
# cd /home # tftp -g 192.168.1.201 -r./hello -l./hello 將主機(jī)TFTP目錄下的文件hello下載到實(shí)驗(yàn)箱的當(dāng)前目錄(/home)。 # tftp -p 192.168.1.201 -r./led -l./led 將實(shí)驗(yàn)箱的當(dāng)前目錄(/home)的文件led上傳到主機(jī)TFTP目錄下。
|
|