请保留-> 【原文: https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】
3 在VirtualBox中使用网络
在UEFI开发探索系列博客的第48篇中,我介绍了如何在VirtualBox中搭建UEFI Shell。本节就在这篇博客的基础上,让VirtualBox下的UEFI Shell有访问网络的功能。
1) 安装网络驱动和网络协议驱动
我使用的是VirtualBox6.1.4,其虚拟网卡为Intel Pro/1000MT Desktop。网卡驱动下载地址为:
下载版本为22.10的PREBOOT.exe,双击安装。将目录/APPS/EIF/EFIx64下的驱动E3522X2.EFI拷贝到虚拟机的硬盘中。同时,将之前编译好x64的Ipv4网络协议驱动(MdeModulePkg)也拷贝到虚拟机的硬盘中。
启动虚拟机,进入UEFI Shell,执行如下命令,加载网卡驱动和网络协议驱动:
Shell>fs0:
fs0:>load E3522X2.EFI
fs0:> load SnpDxe.efi MnpDxe.efi ArpDxe.efi Ip4Dxe.efi VlanConfigDxe.efi Udp4Dxe.efi Dhcp4Dxe.efi Mtftp4Dxe.efi Tcp4Dxe.efi
2) 配置网卡。
使用ifconfig命令设置:
fs0:\>ifconfig -s eth0 dhcp
检查网络配置情况:
3) 测试网络连接
我的主机IP地址为192.168.1.42,VirtualBox虚拟机通过NAT方式与主机相连的。测试情况如下:
4 在Qemu中使用网络
以下的实验,OVMF的镜像在VS2015+UDK2018下编译,Qemu的网络实验在Ubuntu16.04 LTS下进行。
官方的文档中,OVMF的实验一直都是以Qemu为例的。Qemu的功能很强大,也非常灵活,带来的问题是配置相对复杂。因此,除了需要进行源码级调试时,我也很少使用。
在Qemu中搭建网络测试环境,可按照如下步骤进行:
1) 编译OVMF镜像。
在Intel网站上下载E3522X2.EFI,这是网卡E1000的驱动,上一节中已经给出了下载地址。进入UEFI的编译目录,新建目录Intel3.5/EFIX64,将E3522X2.EFI拷贝到这个目录下。
编译OVMF镜像,编译命令为:
C:\Myworkspace> build -p OvmfPkg/OvmfPkgX64.dsc -a X64 -D E1000_ENABLE -D DEBUG_ON_SERIAL_PORT
同时按照之前的方法编译UEFI下64位Ipv4的网络协议,将编译好的镜像OVMF.fd和网络协议驱动拷贝出来,准备下面的步骤。
2) 安装Qemu和必要的网络工具
使用apt-get 安装,命令为:
$ sudo apt-get install qemu
$ sudo apt-get install bridge-utils #虚拟网桥设置工具
$ sudo apt-get install uml-utilities #UML(User-mod linux)工具
3) 搭建Qemu的网络通道
在之前的编译中,已经将网卡驱动包含在VOMF镜像所启动的UEFI shell中了。如果不指定任何网络设置,Qemu将使用带有内置DHCP服务器的用户模式(user)网络。当虚拟机运行时,可设定为DHCP模式,它能够通过QEMU伪装的IP来访问物理主机的网络。
不过,这种情况下,能通信的仅限于TCP和UDP协议,因此ICMP协议(包括ping)将不起作用。因此,我们准备采用tap模式,使用桥接的方法,让虚拟机和外部通信起来。
首先用命令ifconfig获取本机的网络接口:
然后按照如下步骤操作,当然,也可以写个sh文件,批量处理:
$sudo ifconfig ens33 down # 先关闭ens33接口
$sudo brctl addbr br0 # 增加一个虚拟网桥br0
$sudo brctl addif br0 ens33 # 在br0中添加一个接口ens33
$sudo brctl stp br0 off # 只有一个网桥,所以关闭生成树协议
$sudo brctl setfd br0 1 # 设置br0的转发延迟
$sudo brctl sethello br0 1 # 设置br0的hello时间
$sudo ifconfig br0 0.0.0.0 promisc up # 打开br0接口
$sudo ifconfig ens33 0.0.0.0 promisc up # 打开ens33接口
$sudo dhclient br0 # 从dhcp服务器获得br0的IP地址
$sudo tunctl -t tap0 -u root # 创建一个tap0接口,只允许root用户访问
$sudo brctl addif br0 tap0 # 在虚拟网桥中增加一个tap0接口
$sudo ifconfig tap0 0.0.0.0 promisc up # 打开tap0接口
其作用为创建虚拟网桥br0和虚拟网卡接口tap0,并将tap0和宿主机的网络接口(ens33)作为网桥的两个接口。这样,宿主机的接口作为网桥接口,与外部网络连接;TAP设备作为网桥的另一个接口,与Qemu虚拟机中的Vlan连接。
4 配置虚拟机内UEFI网卡
将之前的Ipv4的64位驱动文件,拷贝到hda.img中,拷贝的方法在之前的博客《UEFI开发探索39》中已经详细描述过。
启动虚拟机:
$sudo qemu-system-x86_64 -bios OVMF.fd -hdd hda.img -net nic -net tap,ifname=tap0 -serial stdio
进入UEFI shell后,设置网卡的IP地址,注意要与宿主机的网卡地址同一网段。
FS0:\> ifconfig -s eth0 static 192.168.171.111 255.255.255.0 192.168.171.141
至此,完成了所有的配置过程,虚拟机的网卡和宿主机网卡连通完毕。可以按照之前介绍的方法,加载Ipv4相关的网络协议驱动,以备后续的实验。
5) 测试网络连接
从宿主机ping虚拟机,以及从虚拟机中ping宿主机,情况如下:
用了两篇博客的篇幅,尝试了三类不同的UEFI网络的搭建方法。对平常的编程来说,可能用得最多的还是Nt32的模拟环境。
从下篇开始,尝试UEFI下的TCP和UDP编程。
3,144 total views, 3 views today