UEFI开发探索50 – UEFI与网络2

请保留-> 【原文:  https://blog.csdn.net/luobing4365http://yiiyee.cn/blog/author/luobing/】

3 在VirtualBox中使用网络

在UEFI开发探索系列博客的第48篇中,我介绍了如何在VirtualBox中搭建UEFI Shell。本节就在这篇博客的基础上,让VirtualBox下的UEFI Shell有访问网络的功能。

1) 安装网络驱动和网络协议驱动

我使用的是VirtualBox6.1.4,其虚拟网卡为Intel Pro/1000MT Desktop。网卡驱动下载地址为:

https://downloadcenter.intel.com/download/27539/Ethernet-Intel-Ethernet-Connections-Boot-Utility-Preboot-Images-and-EFI-Drivers

下载版本为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

检查网络配置情况:

图1 VirtualBox的UEFI Shell中查看IP

3) 测试网络连接

我的主机IP地址为192.168.1.42,VirtualBox虚拟机通过NAT方式与主机相连的。测试情况如下:

图2 VirtualBox的UEFI shell中网络连接测试

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获取本机的网络接口:

图3 获取网络接口

然后按照如下步骤操作,当然,也可以写个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宿主机,情况如下:

图4 Qemu虚拟机与宿主机的网络连接测试

用了两篇博客的篇幅,尝试了三类不同的UEFI网络的搭建方法。对平常的编程来说,可能用得最多的还是Nt32的模拟环境。

从下篇开始,尝试UEFI下的TCP和UDP编程。

325 total views, 1 views today

发表评论

电子邮件地址不会被公开。