使用TFTP进行文件传输

在嵌入式系统开发中,经常需要从主机上传送映像、文件等到目标机上。实现的方法有很多。如tftp,scp等。
TFTP(Trivial File Transfer Protocol)是用来下载远程文件的最简单的网络协议,它基于UDP协议而实现。

一、TFTP的建立

嵌入式linux的tftp开发环境包括两个方面:一是linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp-client支持。因为u-boot本身内置支持tftp-client,所以嵌入式目标系统端就不用配置了。我们要做的是在服务器端(即主机)上安装TFTP服务,并且正确地配置TFTP服务的路径和参数。
首先需要安装:tftp-hpa
sudoapt-get install tftp-hpa
sudoapt-get install tftpd-hpa
tftp-hpa是客户端,作用是从别人的TFTP服务器端上传/下载东西。
tftpd-hpa是服务端,字母d代表daemon,作用是为别人提供TFTP服务,供别人上传/下载东西。

2、创建TFTP目录

首先需要建立一个TFTP目录,以供上传和下载。当然也可以使用现有的目录。然后需要设定该目录的权限,决定是否能够下载和上传文件。对于日常使用,我们一般就将其权限设置为最高,为所有用户组都添加所有权限(读+写+执行=4+2+1=7):
sudomkdir ~/tftp_boot
sudochmod 777 tftp_boot –R
我们的TFTP目录为/home/ghostar/tftp_boot,其权限已经是最高。

3、修改配置文件

修改tftpd-hpa相应的配置文件
sudogedit /etc/default/tftpd-hpa
原始的内容如下:

/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:必须改为当前的用户名,或者root;
TFTP_DIRECTORY:我们设定的TFTP根目录;
TFTP_OPTIONS:TFTP启动参数。意义如下:
-l:以standalone/listen模式启动TFTP服务,而不是从inetd启动。
(这里也表明,再像前面一样装xinetd,其实是多此一举)
-c:可创建新文件。默认情况下,TFTP只允许覆盖原有文件,不能创建新文件。
-s:改变TFTP启动的根目录。加了-s后,客户端使用TFTP时,不再需要输入指定目录,填写文件的完整路径,而是使用配置文件中写好的目录。这样也可以增加安全性。

我一开始没有注意TFTP_USERNAME这一项,随便取了一个名字,一直没有成功,后来改用自己的用户名,才测试成功。

4、重新启动服务

重启tftpd-hpa服务:
sudo service tftpd-hpa restart
如果显示如下,说明配置正确:
tftpd-hpastart/running, process 2290
之前我没有把TFTP_USERNAME该为用户名,而是随便取了一个,则会提示如下:
tftpd-hpastart/running
对比发现,这里并没有启动进程,因为配置中TFTP_USERNAME不正确,也就没有成功开启TFTP

5、确认tftp服务是否已经开启

查看tftp相关进程可以用以下指令:
psaux |grep tftp
弹出以下信息
ghostar@ubuntu:~$ ps aux|grep tftp
root 3151 0.0 0.0 15128 152 ? Ss 23:19 0:00 /usr/sbin/in.tftpd --listen --user ghostar --address 0.0.0.0:69 -l -c -s /home/ghostar/tftp_boot
ghostar 3156 0.0 0.0 15956 956 pts/12 S+ 23:20 0:00 grep --color=auto tftp
可以看到, /usr/sbin/in.tftpd已经启动,说明TFTP服务已经开启了,进程号正是3151。
--listen对应配置文件中的参数 -l
--user ghostar 就是配置文件中的TFTP_USERNAME
/home/ghostar/tftp_boot是配置文件中的TFTP_DIRECTORY

另一种方法:
netstat-a|grep tftp
如果看到如下提示,说明TFTP服务开启了。
udp 0 0 *:tftp :

二、TFTP的使用

1、连接本机
连接本机有三种方法,一是输入真实的IP地址,可以用ifconfig查得;二是用localhost来代表本机;三是使用地址127.0.0.1,这个IP地址始终代表本机的IP。

先在TFTP目录下新建一个文件a,在里面随便写一些内容,然后修改其权限为777。接着,输入以下指令的任意一条,进入TFTP命令行。
tftp 192.168.1.201 (自己设定的IP)
tftp localhost
tftp127.0.0.1
TFTP命令行的基本指令:
put:将文件上传到TFTP目录
get:取得TFTP目录上的文件
quit/q:退出TFTP

因为TFTP服务将某一设定的目录视为根目录,因此不需要打出完整的路径。既然该目录下已经有一个文件a,我们就下面输入指令:
tftp>get a
tftp>put a
如果没有任何提示,则说明传输成功。

下面看看当配置参数和文件权限改变时,会出现什么现象。我列举了一些常见问题:
tftp>get a
Transfer timed out.
原因:tftpd服务没有启动。

需要注意的是,必须使TFTP的用户名和当前的系统的用户名一致,否则就无法成功启动tftpd服务。
tftp>get a
permission denied
原因:操作者权限不够,比如当前的目录是/etc,不能随便get文件下来。需要提升权限。切换到root账户,或者直接执行sudo tftp。

tftp>put t1
tftp: t1: No such file or directory
原因:当前目录下没有t1文件

tftp>get d
Error code 1: File not found
原因:TFTP根目录下没有该文件

Error code 2: Only absolute filenamesallowed
原因:TFTP启动配置参数没有-s,或者在DIRECTORY中没有填写目录

tftp>put b
Error code 1: File not found
原因:启动配置参数无-c,根目录下无同名文件
(注意和前面情况的区别,不是当前目录下没有b文件,而是TFTP目录下找不到同名文件b)

tftp>put b
Error code 2: File must have global writepermissions
原因:根目录下有同名文件,该文件无写权限(启动配置参数有无-c都这样)

经测试,在tftp-hpa方法下,下列情况可以put成功:
l 启动配置参数无-c,根目录下有同名文件,有写权限
l 启动配置参数有-c,根目录下无同名文件
l 启动配置参数有-c,根目录下有同名文件,有写权限

2、连接实验箱(未完成)

     实验箱操作系统中的TFTP服务已经装好,是在BusyBox v1.12.0中的。它的用法与本机的略有区别,但原理是一样的。

基本参数:
-g: get,获取文件
-p: put,长传文件
-l FILE:本地的文件,名为FILE
-r FILE:远程的文件,名为FILE
实验箱的IP地址为192.168.1.200,我主机的IP地址为192.168.1.201。两者的IP应该在一个网段内,才能顺利通信。

使用举例:
sudo minicom
进入了实验箱的Linux操作系统。

  #cd /home
  #tftp -g 192.168.1.201 -r./hello -l./hello
  将主机TFTP目录下的文件hello下载到实验箱的当前目录(/home)。
  #tftp -p 192.168.1.201 -r./led -l./led
  将实验箱的当前目录(/home)的文件led上传到主机TFTP目录下。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容