用OMAPL138这段时间以来,深深体会ARM9+DSP的强大数据采集和处理能力,难怪TI这一年也希望OMAPL138能在国内推广开来,现在我来拿国内一家做OMAPL138很到位的广州创龙电子公司的SOM-OMAPL138开发套件来说说,谈谈其基于ubuntu10.04的tftp开发环境搭建。
开发平台:广州创龙电子公司的OMAPL138开发板平台
开发环境:Ubuntu10.04(虚拟机建议采用VM7.0或以上)
首先我先说说tftp简介。
简单文件传输协议或称小型文件传输协议(英文:Trivial File Transfer Protocol,缩写tftp),是一种简化的文件传输协议,于1980年定义。
tftp是用来下载远程文件的最简单网络协议,它其于UDP协议而实现。嵌入式Linux的tftp最常用来完成开发板和开发环境Linux系统之间的的文件传输功能,避免了频繁的U盘拷贝的过程。Linux下的tftp开发环境建立包括两个方面:一是Linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp-client支持。本文将介绍基于ubuntu10.04发行版的Linux服务器端tftp-server的配置和在主机和目标机之间的tftp文件传输方法。
接下来,我给大家详细的简介TFTP开发环境的搭建步骤:
1.Linux服务器端tftp-server的配置
1.1安装tftp所需的软件
安装软件前务必保证虚拟机可以上网。虚拟机要访问网络必须在“Virtual Machine setting”菜单下选择NetworkAdapter->Network connection->NAT:Used to share the host's IP address,设置如下图:
需要安装tftp-hpa和tftpd-hpa(前者是客户端,后者是服务程序)以及xinetd。在终端下输入如下命令安装tftp-hpa、tftpd-hpa和xinetd:
tl@tl-desktop:~$sudo apt-get install tftp-hpa
tl@tl-desktop:~$sudo apt-get install tftpd-hpa
tl@tl-desktop:~$sudo apt-get install xinetd
1.2配置相关服务文件
进入根目录下的etc文件夹(cd /etc/),首先看目录中有没有一个xinetd.conf文件,如果没有则新建一个,有的话运行“cat xinetd.conf”查看其内容,看是否与下面的一致,若不一致则运行“sudo gedit xinetd.conf”修改为相同,内容如下图:
打开配置文件tftpd-hpa命令如下:
tl@tl-desktop:/etc$sudo gedit /etc/default/tftpd-hpa
将内容修改成:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/tl/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
修改完成后如下图:
TFTP_DIRECTORY="/home/tl/tftpboot":表示tftp服务器的工作目录。
保存退出,然后执行命令“mkdir –p /home/tl/tftpboot”新建tftp工作目录,并修改权限为777,命令为“sudo chmod 777 /home/tl/tftpboot”。777是最松的权限,这样不仅可以允许别的主机或者目标机下载同时允许上传文件。
然后进入/etc下面的xinetd.d文件夹(cd/etc/xinetd.d),查看是否有一个tftp文件,如果没有就运行“sudo gedit tftp”新建一个并输入以下内容,如果有的话就查看内容是否与下面的一致,不一致则修改,内容如下:
service tftp
{
socket_type = dgram
wait = yes
disable = no
user = root
protocol = udp
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot -c
#log_on_success += PID HOSTDURATION
#log_on_failure += HOST
per_source = 11
cps =100 2
flags =IPv4
}
其中server_args一行是配置服务器的文件存放的位置,就是进行tftp传输的时候,都是从该文件夹中搜索文件的。然后保存文件,并退出编辑。
1.3重新启动服务
执行“sudo service tftpd-hpa restart”重启tftpd-hpa,,提示如下图:
执行“sudo /etc/init.d/xinetd reload”重新加载一下xinetd进程,提示如下图:
执行“sudo /etc/init.d/xinetd restart”重启xinetd服务,提示如下图:
每次修改完配置文件后,都需要重新启动一下服务。
1.4本地tftp文件传输功能测试
首先在/home/tl/tftpboot中新建一个文件test,在其中随便输入内容,例如内容如下图:
然后进入一个不是“/home/tl/tftpboot”的目录。再在终端中输入“sudo tftplocalhost”,进入tftp命令符下,如下图:
可以在其中输入help查看命令和命令的作用,提示如下:
接着输入 “get test”再按回车,如果没有任何提示,就说明传输成功了。然后输入 q 退出tftp命令符,如下图:
在当前目录下运行“ls”就可以看到一个test文件,可以使用“cat test”命令查看其内容,可以发现是与开始新建的那个test的内容是一致的。
修改test文件后,可以在tftp命令中输入 “put test”,把修改过的test文件上传到服务器文件夹中。
2开发板文件系统和虚拟机之间tftp文件传输功能实现
开发板和Windows主机先通过直连网线插到路由器,这样Winsows主机、虚拟机、开发板就相当于在同一个局域网了。若没有路由器,也可以通过交叉网线将开发板和Windows主机互联。
2.1查看PC机Windows主机的IP地址
在Windows主机<开始>菜单栏的最下方输入“cmd”,然后按回车进入dos操作界面,再输入执行"ipconfig"查看Windows主机的IP地址,如下图所示:
在Windows主机<开始>菜单栏的最下方输入“cmd”,然后按回车进入dos操作界面,再输入执行"ipconfig"查看Windows主机的IP地址,如下图所示:
2.2修改开发板的IP地址
开发板上电,进入开发板系统后设置IP的前三个字段和Windows主机的一样,最后一个字段务必不能相同,同时设置子网掩码为一致。只有前三个在字段和子网掩码相同,Windows主机、Ubuntu虚拟机、开发板三者之间才能互相ping通。例如,针对Windows主机的IP:192.168.0.2,子网掩码:255.255.255.0,可以设置开发板的IP地址为:192.168.0.8,子网掩码:255.255.255.0,设置命令如下:
root@tl:~# ifconfigeth0 192.168.0.8 netmask 255.255.255.0
可以通过ifconfig命令查看修改后的IP和子网掩码等信息,操作如下图:
一种更简便的方法是使用“udhcpc”命令让开发板自动获取路由器给它分配的IP,如下图所示:
2.3设置Ubuntu虚拟机IP地址
在设置之前先将虚拟机和主机的网络连接方式设置为桥接,点击虚拟机"VM->Setting",弹出以下设置界面:
点击“Network Adapter->Network Connection->Bridged”选项,如下图所示:
点击OK,完成设置。、
进入虚拟机Ubuntu系统后设置IP的前三个字段和Windows主机的一样,最后一个字段务必不能相同,同时设置子网掩码为一致。只有前三个在字段和子网掩码相同,Windows主机、Ubuntu虚拟机、开发板三者之间才能互相ping通。例如,针对Windows的IP:192.168.0.2,子网掩码:255.255.255.0,可以设置虚拟机的的IP地址为:192.168.0.5,子网掩码:255.255.255.0。
执行以下命令配置IP:
tl@tl-desktop:~$ sudoifconfig eth0 192.168.0.5 netmask 255.255.255.0
通过ifconfig命令查看修改后的IP和子网掩码等信息,结果如下图:
2.4Windos主机、开发板、虚拟机三者之间ping命令测试
2.4.1虚拟机ping开发板和Windows主机
在虚拟机分别执行以下两个命令,Linux系统的ping命令不会像Windows一样自动停止显示,需要执行“Ctrl+C”命令才能停止。
tl@tl-desktop:~$ ping 192.168.0.8
tl@tl-desktop:~$ ping 192.168.0.2
成功ping通提示如下图:
备注:
(1)假如虚拟机出现“From *.*.*.*icmp_seq=1 Destination Host Unreachable”的错误提示,说明了没有成功ping通,请检查网线和地址的正确性。
(2)假如通过(1)步骤还是存在错误,请运行“ifconfig”命令查看ip,有些用户会提示如下图:
可以看到网络名字不是eth0而是eth2,这个是由于用户手动设置了网络名字的原因,MAC地址被缓存了,配置网络的时候可能会出现“eth0: ERROR while gettinginterface flags: No such device。Network service start”,真正原因是MAC地址缓存了,所以eth0配置的MAC打不到,就是提示以上内容。
解决办法:在虚拟机下执行命令“sudorm /etc/udev/rules.d/70-persistent-net.rules”,然后关闭虚拟机,重启Windows系统,再开启虚拟机重新设置虚拟机IP即可。
2.4.2主机ping Ubuntu虚拟机和开发板
将开发板和主机用网线连接起来,在Windows主机<开始>菜单栏的最下方输入“cmd”,然后按回车进入dos操作界面,分别执行以下两个命令:
ping 192.168.0.5(请以实际主机IP作参考)
ping 192.168.0.8(请以实际主机IP作参考)
成功ping通提示如下图:
在开发板分别执行以下两个命令,Linux系统的ping命令不会像Windows一样自动停止显示,需要执行“Ctrl+C”命令才能停止。
root@tl:~# ping192.168.0.5
root@tl:~# ping192.168.0.2
成功ping通提示如下图:
2.5开发板下载虚拟机tftp服务器文件
在开发板/home/tl目录下执行以下命令:
root@tl:/home/tl# tftp-g -r test 192.168.0.5
-g:代表get,下载文件
-r:代表remote,远程服务器
test:远程服务器tftpboot目录下的文件名字
192.168.0.5:远程服务器的ip地址,这里指Ubuntu虚拟机
执行命令后可以在当前目录看到test文件,使用“cat test”命令查看其内容是否和服务器tftpboot目录下的test文件内容一样,结果如下图所示:
3.tftp下载内核到内存
通过tftp在uboot中下载内核文件,可以避免频繁的U盘拷贝和FLASH烧写,特别是用于测试的内核文件。
3.1在uboot中设置加载文件系统参数
在下载内核前,先设置加载文件系统的参数,决定文件系统的加载方式,这样就在下载内核后可以直接启动文件系统。
(1)SD卡启动文件系统设置
先插上已经正常使用的SD卡,在uboot执行以下命令:
U-Boot >setenv bootargs console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext3 mem=128M
U-Boot >saveenv
(2)NFS起根文件系统设置
此设置见《基于ubuntu10.04的nfs开发环境搭建》的“nfs起根文件系统”章节。
3.2在uboot中设置网络环境变量
开发板上电后,按任意键进入uboot命令行,输入以下命令设置虚拟机TFTP服务器的IP地址变量serverip:
U-Boot > setenvserverip 192.168.0.5
输入以下命令设置开发板的IP地址变量ipaddr:
U-Boot > setenvipaddr 192.168.0.8
另外一个变量ethaddr已经在uboot里面写好了,无需设置。设置会提示无法覆盖,如下图所示:
执行以下命令保存环境变量:
U-Boot >saveenv
保存后重新上电就不用再次设置了,提示如下图:
执行以下命令测试网络的连通性:
U-Boot > ping192.168.0.5
若提示“host *.*.*.*is alive”说明网络畅通,如下图所示:
3.3在uboot中通过tftp下载内核文件到内存
保证有测内核文件uImage在虚拟机的tftp服务器目录“/home/tl/tftpboot”,如下图所示:
在uboot中输入以下命令下载内核文件:
U-Boot > tftpc0700000 uImage
c0700000:指定的运行内存地址
uImage:tftp服务器中的内核镜像
成功下载图示如下:
执行“bootm c0700000”命令运行刚才下载的内核文件,结果如下图:
需要上电自动通过tftp下载uImage的客户,可以在uboot里面设置bootcmd参数,设置命令如下:
U-Boot > setenvbootcmd 'tftp c0700000 uImage;bootm c0700000'
U-Boot > saveenv
操作如下图所示:
重启后就自动进入SD卡或者nfs服务器的文件系统。