嵌入式开发中常用的开发方式:windows上做实际开发,虚拟机上装Linux当服务器交叉编译程序, ARM开发板运行程序。通常三者连接时,会遇到各种问题,此文档就是从分析到实例解决该问题。
更多详情,请访问http://www.100ask.org/
对于搞不懂桥接、Nat和only-host 三者区别的可以参考:
一、网络设置
虚拟机我们通常采用的桥接,是网络设置的关键。最主要的问题,我们使用桥接方式时,ARM开发板、windows以及windows上的虚拟机上的Linux存在三者互ping不通的情况。
在没有接ARM开发板的情况,windows连入网络使用的物理网卡是无线网卡,虚拟网卡桥接到无线网卡,IP地址与物理无线网卡同网段;windows连入网络使用的物理网卡是有线网卡,虚拟网卡桥接到线网卡,IP地址与物理有线网卡同网段。无论windows ping Linux,还是Linux ping windows 都不会存在互ping不通的情况。
但当加入ARM开发板,情况就变得复杂,我们往往会出现windows 和 Linux之间可以互ping成功,但是却与ARM开发板无法互ping成功。其实我们只要抓住问题的本质就不会出现这些问题。在连接ARM开发板的情况下,我们必须先确定Linux与ARM开发板的网络物理连接方式。
ARM开发板是有线网卡的情况下:
1. 无路由器
1.1电脑和ARM开发板通过网线(双绞线)直接连接 (情况一)
Windows:有线网卡 需要手动设置本地IP地址
Linux:桥接到有线网卡 需要手动设置IP地址
ARM开发板、Linux和Windows的IP地址都必须在同一网段。
2. 有路由器
2.1 电脑和路由器无网线(双绞线)连接,Windows通过无线网卡接到路由器,ARM开发板和路由器通过网线(双绞线)连接。(情况二)
Windows:无线网卡 不需要手动设置本地IP地址
Linux:桥接到无线网卡 不需要手动设置IP地址
ARM开发板、Linux都要和Windows的无线网卡的IP地址在同一网段。
2.2 电脑和路由器有网线(双绞线)连接,Windows通过无线网卡连接到路由器, ARM开发板和电脑通过双绞线连接。(情况三)
Windows:无线网卡 需要手动设置本地IP地址
Linux:桥接到有线网卡 需要手动设置IP地址
ARM开发板、Linux和Windows的本地IP地址都必须在同一网段,但是必须要和Windows的无线网卡的IP地址不在同一网段。
2.3 电脑和路由器有网线(双绞线)连接,Windows通过无线网卡连接到路由器,ARM开发板和路由器通过双绞线连接。(情况四)
A、
Windows:无线网卡 需要手动设置本地IP地址
Linux:桥接到有线网卡 需要手动设置IP地址
B、
Windows:无线网卡 不需要手动设置本地IP地址
Linux:桥接到无线网卡 需要手动设置IP地址
只要保证ARM开发板、Linux、Windows的无线网卡的IP地址和Windows的本地IP地址都在同一网段。
2.4 电脑和路由器有网线(双绞线)连接,Windows通过有线网卡连接到路由器, ARM开发板和路由器通过双绞线连接。(情况五)
Windows:有线网卡 不需要手动设置本地IP地址
Linux:桥接到有线网卡需要手动设置IP地址
ARM开发板、Linux要和Windows的本地IP地址都在同一网段。
二、关闭防火墙
1、关闭windows的防火墙
2、关闭Linux的防火墙
三、实例分析
以曾经我遇到的一个三者互ping不通的错误来作为实例来分析。
硬件:电脑连接无线,开发板通过网线和电脑连接
问题:
开发板 ping 电脑上的windows :失败
开发板 ping 虚拟机上的Linux : 失败
虚拟机上的Linux ping电脑上的Windows :成功
电脑上的Windows ping虚拟机上的Linux :成功
其实最重要的一点我没有领悟,我们在使用开发板和电脑以网线连接、电脑同过无线连入网络时,此时如果我们想要三者互ping成功,此时我们的电脑使用的无线网卡没错,但是我们的ARM开发板和电脑建立的网络连接是连接到了PC机的有线网卡,因为ARM开发板用的是网线直接连接电脑,所以此时我们的虚拟机要和ARM开发板通信就必须通过PC机的有线网卡,我们虚拟机网络设置时应该选择有线网卡,并且还需要手动设置此时PC机的本地连接(有线网卡)的IP地址,即上面我们所提到的有路由的情况三。
解决方案:
A、 虚拟机的桥接模式中选择有线网卡
B、 在“本地连接”的“IPV4的属性”中手动配置IP(和电脑的无线网卡的IP处不同网段)
要点:电脑上的Windows连入无线网络使用无线网卡,虚拟机上的Linux必须使用有线网卡,手动设置本地IP地址
本例的连接方式属于上面的(情况三),所有设置为:
Windows:无线网卡 需要手动设置本地IP地址
Linux:桥接到有线网卡 需要手动设置IP地址
ARM开发板、Linux和Windows的本地IP地址都必须在同一网段,但是必须要和Windows的无线网卡的IP地址不在同一网段。
解决步骤:
1. 电脑的本地IP的设置
1.1 运行cmd.exe ==》输入”config/all”命令 查看无线网卡的IP、DNS服务器地址记下
(我的是192.168.1.100, DNS服务器地址:114.114.114.114 和 101.226.4.6)
1.2 打开Windows的网络和共享中心 ==》更改适配器,进入如下界面
1.3 打开VMnet1、WMnet8以及本地连接 三个的属性,勾上“VMware Bridge Protocol”选项,如下图:
1.4 手动配置本地连接的IPv4,配置如下图:(是否需要配置请参考上面的分析,确定自己的属于那种连接方式,就可以确定是否需要设置)
注:
A、IP地址不要和上面查看的无线网卡获得的IP在同一个网段
例:我的无线网卡的IP为:192.160.1.100, 此时我的IP地址设置一定不能使192.168.1.0-192.168.1.255内的地址,我将IP 地址设为:192.168.0.112
B、 DNS服务器地址就是cmd 中运行 “ifconfig/all” 命令中的DNS服务后的东西。
2. 关掉防火墙 (自己百度)
3. 虚拟机上的Linux网络的设置
3.1 虚拟机上的“编辑” ==》“虚拟网络编辑器”
3.2 选择 “桥接模式” ==》 桥接到有线网卡(桥接到那个网卡请参考上面的分析,确定自己的属于那种连接方式,就可以确定桥接到那个网卡)
3.3 设置虚拟机上的Ubuntu的IP,照着下面的两种图设置:
注:
A、上图中的Address : 必须和电脑Windows上“本地连接”手动设置的IP处同一网段
B、 上图中的Netmask:设置成255.255.255.0就行
C、 上图中的Getway: 设置成与Address同一网段的地址就行
D、上图中的DNS services:设置成114.114.114.144就行
E、 以后可以用 sudo ifconfig eth4192.168.0.111 的命令去设置了。
4. 开发板IP设置
注:
serverip 是虚拟机上的Linux设置的IP
ipaddr 是设置成和虚拟机上的Linux同网段的IP地址就可以。
此时所有的IP的情况:
A、 电脑Windows上的无线网卡的IP:192.168.1.100
B、 电脑Windows上的有线网卡的IP:192.168.0.112 (本地连接处设置的IP)
C、 虚拟机上的Ubuntu的IP:192.168.1.0.111
D、 开发板上的IP:192.168.0.230
注:
A、 对于在U-boot上操作的用户,你只能从开发板上ping通电脑上的Windows和虚拟机上的Ubuntu,电脑上的Windows和虚拟机上的Ubuntu是互ping不同的,并且SecureCRT以及Cuteftp这些工具都是无法使用的。
B、对于在挂在根文件系统后操作的用户,开发板、电脑上的Windows和虚拟机上的Ubuntu这三者是可以互ping成功的。如果是自动挂载的用户,记得修改根文件系统的/etc/init.d/rcS中的IP地址。