一、前言
在进行ARM Linux开发的时候经常会遇到这样的问题,在虚拟机上安装一个Ubuntu,开发时将Ubuntu和开发板都设置为静态IP,将二者用网线连接,可以用NFS挂载。但有时Ubuntu需要连接互联网,这时就要将Ubuntu的IP设置为动态IP,并将Ubuntu的网络连接模式设置为NAT模式,使用完之后又设置为桥接模式和静态IP,这样改来改去比较麻烦,而且有时希望开发板也能连接到互联网中去,这样就需要一种比较完美的解决办法。
二、修改虚拟机配置
首先,vmware一定要用管理员方式打开。
在虚拟机的菜单栏中点击“编辑”->“虚拟网络编辑器”,如下图:
在弹出的界面中,会有3张网卡,其中VMnet0一定是桥接模式,并且将其桥接到windows的物理网卡,如下图:
其中物理网卡的名字在控制面板的网络连接里可以看到,如下图:
如果没有出现VMnet0,首先检查是否用管理员方式打开,如果确认了是用管理员方式打开的,但依然没有出现VMnet0,则点击“还原默认设置”,若还是没出现VMnet0,那么点击“添加网络”,将VMnet0手动添加进去,在弹出的界面中要选择某个文件,否则即便添加了VMnet0,但VMnet0不能设置为桥接模式(由于缺少素材,这里没有配图)。
之后重启vmware。
在虚拟机的菜单栏中点击“虚拟机”->“设置”,如下图:
在弹出的界面中点击“添加”,如下图:
点击“网络适配器”,然后点击“下一步”,如下图:
选择“NAT 模式”,然后点击“完成”,如下图:
这时虚拟机的硬件设备里就有两个网络适配器了,需要保证第一个网络适配器为桥接模式,第二个网络适配器为NAT模式,如下图:
点击“确定”之后等待下图所示进度条走完:
三、修改Ubuntu配置
3.1 修改配置文件
在终端执行命令:sudo vim /etc/network/interfaces
将文件修改为:
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.1.3 netmask 255.255.255.0 gateway 192.168.1.1 auto eth1 iface eth1 inet dhcp
然后保存退出,这个文件指定了网卡eth0的IP为静态IP,IP地址为192.168.1.3,子网掩码为255.255.255.0,网关为192.168.1.1。网卡eth1的IP为动态获取。
设置完成之后重启虚拟机。
之后在终端中使用ifconfig命令就可以发现,已经有三张网卡了,如下图:
其中eth0是静态网卡,IP地址与/etc/network/interfaces文件中写入的address一致,eth1是动态网卡, 其IP地址是通过DHCP动态获取的,lo是回环网卡。
3.2 使用iptables设置转发规则
在Ubuntu中执行下面两条命令:
sudo modprobe ip_tables
sudo modprobe ip_nat_ftp
3.3 修改网卡地址转发的配置文件
修改/etc/sysctl.conf文件(需要用sudo),默认情况下这个文件里所有的内容都是用#注释掉的,将有net.ipv4.ip_forward = 1的这行(大概在第28行)最前面的“#”去掉,然后保存退出。
执行下面4条命令:
sudo sysctl -p sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT
3.4 设置网络
使用ifconfig命令查看eth0和eth1的IP地址,如下图:
记住这两个IP,然后执行命令:
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 192.168.237.129
上面这条命令包含两个IP地址,第一个IP地址由eth0的IP地址决定,但是把最后一位设置为0,第二个IP地址与eth1的IP地址相同
3.5 添加默认路由
执行命令:sudo route可以查看路由表
执行下面2条命令:
sudo route del default sudo route add default gw 192.168.237.2
上述命令中的“192.168.237.2”的前三个数与eth1的IP地址相同。执行sudo route命令查看路由表,如下图:
此时执行ping www.baidu.com是可以成功的,如果成功不了就试一下ping百度的IP:ping 104.193.88.123
如果ping域名通不了,但是ping IP能通,则是DNS设置的有问题,如果IP都ping不通,那再检查之前的步骤有没有做错。
四、修改开发板配置
4.1 修改配置文件
执行命令:vi /etc/eth0-setting
写入如下内容:
IP=192.168.1.90 Mask=255.255.255.0 Gateway=192.168.1.3 DNS=114.114.114.114 MAC=08:90:90:90:90:90
其中,IP为开发板的IP地址,Gateway为Ubuntu网卡eth0的IP地址。
执行命令:vi /etc/resolv.conf
写入如下内容:
nameserver 114.114.114.114
4.2 重设路由表
执行如下命令,重新设置路由表:
route del default route add default gw 192.168.1.3
五、联网测试
在开发板端执行命令:
ping www.baidu.com
能够ping通,说明开发板已经可以连接互联网了,如下图:
六、问题分析与注意事项
1) 有些板子每次重启都需要重新修改/etc/resolv.conf文件,如tiny4412。
2)每次开发板重启都需要重新设置路由表,即执行4.2节中的命令。否则开发板能ping通网关,即192.168.1.3,但无法ping通外网。
3)每次Ubuntu重启都需要重新执行3.2~3.5节中的命令,为了方便,可以将这些命令写成一个脚本,如下:
#!/bin/bash sudo modprobe ip_tables sudo modprobe ip_nat_ftp sudo sysctl -p sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 192.168.237.129 sudo route del default sudo route add default gw 192.168.237.2
将其命名为net.sh,并执行命令:chmod +x net.sh为其添加可执行权限,每次Ubuntu重启时运行这个文件(用超级用户权限)。
特别注意:如果将上述命令添加为一个脚本,那么这个脚本一定要在Ubuntu下编辑,不能在windows上编辑好后再拷贝到Ubuntu中,因为windows中的换行符为"\r\n"而linux中的换行符为“\n”,当脚本执行成功时,会打印出“net.ipv4.ip_forward = 1”,如下图,如果没打印出“net.ipv4.ip_forward = 1”,则表明没有执行成功。
4)如果配置没有问题,但板子依然无法联网,则确认一下windows的防火墙是否关闭,没关闭的话将其关闭。
5)虚拟网络编辑器里只有两张网卡,没有VMnet0,如下图:
首先确认虚拟机是否用管理员方式打开的,如果是,则点击“虚拟网络编辑器”对话框左下角的“还原默认设置”,这样VMnet0就出来了。之后还要将VMnet0桥接到电脑的网卡上,通常叫PCIe什么什么的,不同电脑不一样,上述内容中有说怎么看网卡名。