文章目录
- 1、uboot及linux版本网络设置
- 1、宿主机虚拟网卡创建
- 2、uboot使用tap0网卡
- 3、启动测试
- 2、访问外网设置
在上一篇Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动中,我们制作了AB分区系统镜像,并成功通过uboot加载kernel以及dtb并引导进入了系统,但目前uboot和系统还无法进行网络,这对于我们开发非常不便,在本节中,我们将讲解如何对uboot以及系统进行网络连接。
1、uboot及linux版本网络设置
1、宿主机虚拟网卡创建
uboot联网这里我们使用tap进行连接,在使用之前,我们需要通过下面命令安装相应工具:
sudo apt install uml-utilities
安装成功之后我们就可以使用如下命令创建tap0网卡:
sudo tunctl -u root -t tap0
然后通过ifconfig -a
即可查看到我们已经创建了tap0网卡了。
但是目前还没有ip,并且还未启动,我们通过如下命令设置ip并启动tap0网卡。
sudo ifconfig tap0 172.16.0.3 promisc up
通过上面配置,我们在宿主机上创建了虚拟网卡,接下来,我们将在uboot中使用该网卡。
2、uboot使用tap0网卡
修改./script/run_uboot_with_img.sh
启动脚本,将原内容修改为如下启动命令:
ROOT_PATH=$(pwd)
qemu-system-arm -M vexpress-a9 -m 512M \
-kernel $ROOT_PATH/out/u-boot-arm/u-boot \
-net tap,ifname=tap0,script=no,downscript=no \
-net nic,macaddr=00:16:3e:00:00:01 \
-nographic \
-no-reboot \
-sd out/ab_img/vexpress_ab.img
上面主要就是加了-net tap,ifname=tap0,script=no,downscript=no
,该语句用来指定使用那个网卡,以及网卡的类型,这里使用tap网卡。
以及-net nic,macaddr=00:16:3e:00:00:01
用来设置mac地址。
然后在我们之前做环境变量的文件/etc/uboot_env.txt
文件内容修改为如下:
bootcmd=mmc read 0x60003000 0x3800 0x10000;mmc read 0x60500000 0x1800 0x400;bootm 0x60003000 - 0x60500000
bootargs=root=/dev/mmcblk0p9 init=/usr/sbin/init console=ttyAMA0 ip=172.16.0.6:172.16.0.3:172.16.0.3:255.255.0.0::eth0:off
ipaddr=172.16.0.5
netmask=255.255.0.0
这里需要就是添加了uboot的ip以及掩码设置,同时在bootargs中添加了ip=172.16.0.6:172.16.0.3:172.16.0.3:255.255.0.0::eth0:off
,用来设置开发板ip地址。
其中:各字段含义为:
ip=开发板 IP 地址:宿主机IP 地址:网关地址:子网掩码::开发板网口:off
这里我们设置开发板网卡eth0的ip为172.16.0.6,掩码为:255.255.0.0,同时设置默认网关为:172.16.0.3,因为我们宿主机的网卡ip为172.16.0.3。
上述工作做好之后,我们需要重新运行./script/make_AB_img.sh
脚本进行镜像制作,因为我们修改了uboot镜像的值。
3、启动测试
进行做好之后,我们通过运行sudo ./script/run_uboot_with_img.sh
启动uboot,注意这里需要加sudo,因为tap0网卡需要root权限进行访问。
在uboot界面我们按下回车,进入uboot控制台,使用ping命令查看uboot网络是否正常。
可以看到,uboot网络是可以正常ping通宿主机的。
然后我们运行run bootcmd
启动kernel.
在linux中使用ping命令查看是否能正常ping通宿主机。
可以可以正常ping通宿主机,并且网卡ip也是正常的。
然后查看linux系统中默认网关是否正常:route -n
可以参考默认网关也是正常的。
2、访问外网设置
有时,我们还需要能访问外网,以模拟tox相关功能,那开发板如何鞥通过宿主机网络访问外网呢?
这里我们需要再宿主机中开启网络转发的功能,将tapo的网络请求转发到宿主机能上网的这张网卡,并通过该网卡进行上网。
我的主机网卡情况如下:
其中:enp6s18
是我主机的网卡,用以访问外网,tap0
是虚拟网卡,用以连接qemu开发板。现在我们需要配置将tap0
的外网请求转发到enp6s18
以进行外网访问:
1、首先开启ubuntu内核转发功能:
临时生效:
echo "1" > /proc/sys/net/ipv4/ip_forward
永久生效的话,需要修改/etc/sysctl.conf
:
net.ipv4.ip_forward = 1
执行sysctl -p马上生效
查看是否开启成功:
执行该条命令,cat /proc/sys/net/ipv4/ip_forward
如果输出1则说明开启成功!
2、配置iptables
在终端输入如下命令:
sudo iptables -A FORWARD -i tap0 -o enp6s18 -j ACCEPT
sudo iptables -A FORWARD -i enp6s18 -o tap0 -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o enp6s18 -j MASQUERADE
注意上面tap0网卡和enp6s18 网卡需要根据自己物理机情况修改为自己网卡名字即可。
执行之后,只会临时起效,重启之后就失效了。
永久保存:
iptables-save > /etc/sysconfig/iptables
3、修改其他电脑的网关
将局域网中想要访问外网的电脑的网关改成服务器的局域网IP:172.16.0.3
这一步我们已经做过了,就是前面uboot传递bootargs的时候设置的网关地址。
上面工作做好之后,我们就可以启动开发板,看能否正常上网了。
可以看到,现在开发板已经可以成功访问外网网络了。