在針對嵌入式開發中,常常我們需要事先配置好一些網路服務,才能使開發板方便的下載或掛載主機的核心和檔案系統。系統在啟動BootLoader後,通過tftp來下載Linux核心鏡像到記憶體運行,然後通過NFS來啟動Linux主機上的目標檔案系統,並通過DHCP伺服器來為開發板分配IP地址。這裡僅僅是搭建伺服器環境。在配置TFTP服務一般遇到的問題都是比較多的。經過幾次失敗嘗試後,總結了以下經驗以共用:
一、檢查是否已經安裝好TFTP
caoyi@ubuntu:/home/study$ sudo netstat -nulg | grep 69
udp 0 0 0.0.0.0:69 0.0.0.0:*
或者
caoyi@ubuntu:/home/study$ sudo netstat -au | grep tftp
udp 0 0 *:tftp *:*
則表示已經安裝成功,如果沒有出現以上資訊或當行資訊都表示有錯誤!
一、檢查是否安裝相關服務(一般沒有)
首先得確定自己的主機或虛擬機器已經連上網了,並且得確定下載過程是可靠的。
(1)、安裝tftp(用戶端)、tftpd(服務端)
caoyi@ubuntu:/home/study$ sudo apt-get install tftpd tftp
(2)、安裝tftpd-hpa、tftp-hpa(功能增強TFTP伺服器)
caoyi@ubuntu:/home/study$ sudo apt-get install tftpd-hpa tftp-hpa
(3)、安裝openbsd-inetd xinetd(網路管理服務。Ubuntu中,tftp不能獨立運行,需要網路管理伺服器 支援。)
caoyi@ubuntu:/home/study$ sudo apt-get install xinetd openbsd-inetd
二、配置TFTP伺服器
(1)、配置tftpd-hpa(服務端)
caoyi@ubuntu:/home/study$ sudo vim /etc/default/tftpd-hpa
1 # /etc/default/tftpd-hpa
2 RUN_DAEMON="yes"
3 TFTP_USERNAME="tftp"
4 TFTP_DIRECTORY="/tftpboot" 這裡為TFTP伺服器目錄
5 TFTP_ADDRESS="0.0.0.0:69"
6 TFTP_OPTIONS="-l -s /tftpboot"
(2)、配置inetd
caoyi@ubuntu:/home/study$ sudo vim /etc/inetd.conf
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot (在最末添加之)
(3)、建立設定檔
在/etc/xinetd.d/下建立一個設定檔tftp
sudo vim tftp
在檔案中輸入以下內容:
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
儲存退出
(4)、重啟TFTP相關服務
caoyi@ubuntu:/home/study$ sudo /etc/init.d/openbsd-inetd reload
* Reloading internet superserver inetd [ OK ]
caoyi@ubuntu:/home/study$ sudo /etc/init.d/openbsd-inetd restart
* Restarting internet superserver inetd [ OK ]
caoyi@ubuntu:/home/study$ sudo service tftpd-hpa restart (如果沒有反應,應重新安裝sudo apt-get install tftpd-hpa)
tftpd-hpa start/running
caoyi@ubuntu:/home/study$ sudo /etc/init.d/xinetd restart
* Stopping internet superserver xinetd [ OK ]
* Starting internet superserver xinetd [ OK ]
三、測試
(1)、在本地根目錄下建立我們的TFTP伺服器目錄
caoyi@ubuntu:/home/study$ cd /
caoyi@ubuntu:/home/study$ sudo mkdir tftpboot
然後,放置一些測試檔案,我這裡放的是uImage 和 空檔案a.c
caoyi@ubuntu:/home/study$ sdo chmod 777 -R tftpboot
caoyi@ubuntu:/home/study$ ls /tftpboot
a.c uImage
(2)、進入/home目錄下載/tftpboot/目錄下的uImage檔案(前面設定好了/tftpboot/目錄為TFTP預設服務類別目錄):
caoyi@ubuntu:/home/study$ sudo tftp 127.0.0.1
tftp> get uImage
Received 1508808 bytes in 0.2 seconds
tftp> quit
caoyi@ubuntu:/home/study$ ls
uImage
然後進行對/tftpboot/目錄上傳檔案
caoyi@ubuntu:/home/study$ sudo tftp 127.0.0.1
tftp> put b.c
Error code 2: Access violation
(注意:當對TFTP檔案進行上傳是,應該在/tftpboot/目錄下要有一個待上傳同名檔案)
(3)、在前面我的/tftpboot/目錄中有一個a.c的空檔案,那麼我就可以對它上傳一個名字為a.c的檔案
caoyi@ubuntu:/home/study$ sudo tftp 127.0.0.1
tftp> put a.c
Sent 15 bytes in 0.0 seconds
tftp> quit
caoyi@ubuntu:/home/study$
(4)、在開發板上測試,首先設定好參數自動下載:然後boot
FS2410# boot
TFTP from server 192.168.7.112; our IP address is 192.168.7.239
Filename 'uImage'.
Load address: 0x30800000
Loading: #################################################################
######################################
done
至此關於Linux下TFTP服務配置完成!其間也會出現一些因版本或其它的錯誤,應該重複的確定你已經安裝好所有的服務,然後不斷重啟,測試!