tftp英文全称(Trivial File Transfer Protocol),是一种简单的文件传输协议,该协议可用于网络主机与服务器之间传输小型文件。
在嵌入式linux开发中,我们一般是在自己的个人电脑或者服务器上进行linux相关的编译构建,在编译构建完成后,生成的系统镜像、系统组件等文件需要烧写到具体的目标机子上。然而,在实际调试开发过程中,如果每修改一次系统镜像和组件就向目标机子烧写一次,这将是一件繁杂且低效率的事情,这时候,我们则可以在开发电脑和目标平台之间搭建tftp服务环境。这么做,我们可以很方便的通过tftp下载开发主机上的文件到目标平台上。
在目前嵌入式linux开发中,u-boot
作为一款常用的引导加载程序,它对tftp的支持很好,我们则可以通过tftp将开发主机上的linux内核镜像、设备树等文件下载到目标板卡的内存中执行。这么做,则有一个很重要的优点:那就是不用每修改一次内核或设备树就执行一次镜像烧写,从而减少烧写次数,加快开发效率。
在上图中,虚拟机ubuntu和目标硬件平台之间通过路由器连接在一起,且路由器关闭了DHCP功能,使用网线将运行虚拟机ubuntu的电脑和硬件板卡连接到路由器的两个Lan口(将路由器当做交换机来使用)。并设置虚拟机ubuntu与物理机之间网络为:桥接模式
。
在ubuntu终端中执行以下命令安装tftp服务:
sudo apt-get install tftp-hpa tftpd-hpa
安装完成后,创建tftp服务的工作目录。这个目录可以自定义目录路径(一般是放在家目录下),本文将其放置在/home
下,并命名为tftp_boot_server:
mkdir -p /home/tftp_boot_server
创建完成后如下图所示:
使用下列命令修改tftp_boot_server的权限:
chmod 777 /home/tftp_boot_server
(权限修改后,上面会有颜色覆盖)
使用编辑器打开tftp配置文件:
sudo gedit /etc/default/tftpd-hpa
将文件修改如下:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/tftp_boot_server"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l-c-s"
上述参数中,TFTP_OPTIONS
可选的参数有三个:
-l :表示以standalone/listen模式启动tftp服务。
-c :表示可创建新文件。默认情况下,tftp只允许覆盖原有文件,不能创建新文件。
-s :安全模式访问。启用该选项,访问tftp服务器时不再需要输入访问目录的完整路径,会自动使用配置文件中已经配置好的文件路径。
配置文件修改完成后,保存退出,在终端下输入下列命令重启tftpd-hpa服务:
sudo service tftpd-hpa restart
在本小节中,让我们把目标板卡接入虚拟机ubuntu。
首先使用ifconfig
查看一下虚拟机ubuntu的IP地址:
在硬件平台启动的过程中,进入u-boot命令行下,使用setenv
命令设置主机ip地址、tftp服务器的ip地址和网关:
#设置硬件板卡的ip地址
setenv ipaddr 192.168.255.253
#设置tftp服务器的ip地址(这里则是虚拟机ubuntu的地址)
setenv serverip 192.168.255.254
#设置网关地址
serenv gateway 192.168.255.255
设置完成以后,在u-boot的命令行下使用ping
命令检测硬件板卡与虚拟机ubuntu之间是否网络通畅。
如上图红框所示,当看见“host xxx.xxx.xxx.xxx is alive”类似信息输出,则证明网络通畅。接下来,我们便可以在目标板卡的u-boot命令行下,使用tftp下载linux内核镜像文件和设备树文件了。
经过上述步骤,硬件板卡与虚拟机ubuntu之间的网络互联成功,我们就可以使用tftp来加载linux内核和设备树了,从而方便调试linux内核和设备树。
然后在u-boot的命令行终端下使用:
setenv bootcmd "tftpboot 0x08300000 rk3568-evb1-ddr4-v10-linux.dtb;tftpboot 0x0027f800 boot.img ; bootm 0x0027f800 - 0x08300000"
设置bootcmd
环境变量参数。bootcmd是启动命令参数,用于存储u-boot的命令操作。在上述命令中:
rk3568-evb1-ddr4-v10-linux.dtb
是用于描述硬件平台的设备树文件。boot.img
是linux内核镜像文件。命令的意思是:使用tftpboot将rk3568-evb1-ddr4-v10-linux.dtb设备树文件下载到0x08300000;使用tftpboot命令将boot.img文件下载到0x0027f800;然后使用bootm从上述两个内存启动应用镜像。这里则是存放于0x0027f800的linux内核和存放于0x08300000的设备树。
接着使用:
env run bootcmd
执行启动命令。随后,u-boot会自动以tftp方式从虚拟机ubuntu上下载linux内核和设备树文件,然后会运行linux内核。如下图所示
在嵌入式linux开发中,tftp是经常使用到的一种文件传输方式,具体的参数配置可能由于不同环境有所不同,但是其tftp搭建和使用思路和方法大同小异,均可按照文本步骤和方法来使用。