在嵌入式开发中,由于嵌入式开发板资源有限,不能进行文件编译,因此我们都是将写好都代码在宿主机(Linux虚拟机)上进行调试编译好后生成二进制文件,然后通过tftp或NFS来进行传输到开发板上运行。
但是如何来配置tftp呢?经过一番配置,我终于成功了。
硬件开发环境:TQ2440开发板
linux内核:linux2.6.25
PC系统:红帽LINUX
第一步:实现PC机、LINUX虚拟机和开发板 三者之间的网络搭建 即可互相ping通
具体做法:
注意:在此之前,先说一下我的开发板和PC机或者虚拟机的连接情况,开发板通过串口线与PC机连接,通过网线直接将开发板和PC机连接,还有通过下载线和PC机相连,PC机连接无线网络。
PC机的本地连接IP(192.168.1.140,手动设置)、无线IP(192.168.1.101)
虚拟机IP(192.168.1.102)
开发板IP(192.168.1.6)
步骤1:虚拟机一定要选择桥接(bridged)
步骤2:设置虚拟机的“Virtual Network Editor”
切记!!一定要选择PC机的本地网卡,不是虚拟网卡以及无线网卡(不要选择automatic选项,因为它有可能会选到无线网卡,因此虚拟机一定ping不通开发板)
步骤3:设置PC机、虚拟机、以及开发板的IP在同一个网段,即192.168.1.*,其他掩码、网关、DNS都设置一样
步骤4:通过以上的配置,就可以实现PC机、虚拟机、开发板直接的互相PING通。注意:此时发现PC机通过本地连接IP(192.168.1.140)可以实现与虚拟机以及开发板直接的ping通
第二步:实现PC机、虚拟机、开发板三者之间互相ping通之后,开始搭建TFTP开发环境
首先,我们需要以宿主机(Linux虚拟机)作为服务器端,因为我们是要将虚拟机上的文件下载到开发板上。
步骤1:在虚拟机上安装tftp服务
1.加载光盘
#mount /dev/cdrom /mnt
2.安装tftp服务的服务器端
# rpm -ivh tftp-server-0.49-7.el6.i686.rpm
3.安装tftp服务的客户端
# rpm -ivh tftp-0.49-7.el6.i686.rpm
步骤2:配置tftp服务
安装完后,开始配置tftp服务:
1.编辑vi /etc/xinetd.d/tftp,
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot -c
disable = no
}
将disable改为no,保存退出。
2.建立默认的tftp根目录,要跟上面的server_args的路径一样,这里是/tftpboot,即在根目录下创建tftpboot文件夹
3,启动ttfp服务器
# /etc/rc.d/init.d/xinetd restart
停止 xinetd: [ 确定 ]
启动 xinetd: [ 确定 ]
4.在命令行中输入setup
#setup
选择<system services>选中tftp并去掉iptables选项
还得选中portmap(端口映射),如果系统中没有那个选项,还得安装相关服务,#rpm -ivh portreserver-0.0.4-9.el6.i686.rpm就OK,
5.再次运行 # /etc/rc.d/init.d/xinetd restart
这时,tftp就配置好了。
第三步:Tftp服务搭建完成,可以实现开发板(PC机)从虚拟机上下载/上传文件
注意:tftp功能的实现必须要以三者之间可以互相PING通为前提
最好先做个测试:本机测试tftp服务器功能
1.在虚拟机上启动tftp服务器
# /etc/init.d/xinetd restart
2.任意目录下在虚拟机上tftp虚拟机自身
#tftp 192.168.1.102
3. 利用get <文件>来从/tftpboot下载文件
4. 利用put <文件>将文件上传到/tftpboot
若能实现上述功能,则说明tftp服务可用。可继续下面的试验。
Part1. PC机作为客户端,与虚拟机文件共享
在PC机上运行 tftpd32.exe 客户端软件
选择Tftp客户端,主机填虚拟机IP,本地文件是PC机上文件,远程文件是虚拟机上/tftpboot下的文件,点击上传或下载。即可实现。
Part2 .开发板作为客户端,与虚拟机文件共享
此时客户端(开发板)就可以上传下载文件到虚拟机上的/tftpboot目录下了。
那么在客户端是如何使用tftp上传下载文件的呢。这个和在虚拟机上还是有点不一样的。
步骤1:在开发板上的终端输入
# tftp
Usage: tftp [OPTION]... HOST [PORT]
Transfer a file from/to tftp server
Options:
-l FILE Local FILE
-r FILE Remote FILE
-g Get file
-p Put file
-b SIZE Transfer blocks of SIZE octets
参数说明:
-l 是local的缩写,后跟本地或下载到本地后重命名的文件名。
-r 是remote的缩写,后跟远程即PC机tftp服务器根目录中的文件名,或上传到PC机后重命名后的文件名。
-g 是get的缩写,下载文件时用,后跟PC机的IP地址
-p 是put的缩写,上传文件时用,后跟PC机的IP地址
tftp 默认占用的是69端口
步骤2:下载/上传命令
下载文件:[[email protected] /]# tftp -l hello.c -r hello.c -g 192.168.1.102 69
上传文件:[[email protected] /]# tftp -l hello.c -r hello.c -p 192.168.1.102 69
其中,192.168.1.102是虚拟机的ip
注意:下载或上传文件时,服务器和本地文件名最好相同,否则会出现得到了文件,但文件大小却是 0k 的现象。如果出现了这种现象,请多敲几次命令,因为tftp服务是基于udp协议,不能保证文件正确的传输。
安装过程中出现的问题及原因
现象一:
tftp> get test.log
Transfer timed out.
原因:tftpd服务没有启动
现象二
tftp> put test2
Error code 0: Permission denied
原因:运行命令,查看系统日志
#tail /var/log/messages
发现有如下一段文字:
Mar 24 19:05:26 localhost setroubleshoot:
SELinux is preventing /usr/sbin/in.tftpd (tftpd_t) "write" to tftpboot (tftpdir_t).
For complete SELinux messages.
run sealert -l 40a5a6bf-8ded-4bfa-ab6e-fa669a25fc6c
知道这是是由SELinux造成的,在FC3和FC3以后的FC版本中SELinux默认的都是开启的,现关掉它,
修改文件 /etc/sysconfig/selinux,设定其中的SELINUX=disabled然后重启电脑即可,或者执行命令 system-config-securitylevel 打开 “安全级别配置”对话框,将SELinux(S)选项中“强制”改为“允许”。
现象三:
tftp> put ex070416.log
Error code 1: File not found
原因:指定的文件不存在;或tftpd启动参数中没有指定-c选项,允许上传文件
现象四:
tftp> get test.log
Error code 2: Only absolute filenames allowed
原因:
在/etc/xinetd.d/tftpd中设置的server_args为/etc/default/tftpd-hpa
cat /etc/default/tftpd-hpa
#Defaults for tftpd-hpa
RUN_DAEMON="no"
OPTIONS="-s /home/tftpd -c -p -U 077 -u tftpd"
设置的时候只要将server_args=改为你自己设定的服务器文件夹就行了
第四步:搭建NFS开发环境
在应用程序开发环境,NFS方式比TFTP方式的执行效率要高的多,因为它不需要将linux服务器上的程序下载到嵌入式目标系统当中去就可以调试。
NFS服务端:虚拟机当中的NFS服务器
NFS客户端:开发板
实现NFS开发环境的前提也是相互PING通
步骤1:建立NFS开发环境
在虚拟机上安装NFS软件包
一是虚拟机上的NFS服务器支持,二是开发板上的NFS客户端支持
以root身份登录,编译文件/etc/exports
#vi /etc/exports
加入语句:/nfsfile 192.168.1.*(rw,sync,no_root_squash),表示的意思是:允许IP范围在192.168.1.*段的计算机来访问共享目录/nfsfile,具体参数自查。
步骤2:启用保护机制
配置/etc/hosts.deny和/etc/hosts.allow
步骤3:启动NFS
注意,关闭防火墙
1.首先必须启动portreserve(portmap,即端口映射)服务,这是NFS本身需要的
#service portreserve restart
2.启动NFS服务器
#service nfs resatrt。此时NFS会激活守护进程,然后开始监听客户端的请求。
3.在虚拟机上进行NFS回环测试
在虚拟机上执行命令:
#mount -o nolock -t nfs 192.168.1.102:/nfsfile /nfsfile1
#ls /nfsfile1
若挂载成功,即可在nfsfile1文件夹下看到和nfsfile一样的内容
4.在开发板上执行命令
##mount -o nolock -t nfs 192.168.1.102:/nfsfile /mnt
#ls /mnt
挂载成功,可在/mnt文件夹下看到和nfsfile一样的内容,且两个文件夹内的内容的修改时同步的