36

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

 3 years ago
source link: http://yiiyee.cn/blog/2020/03/26/uefi%e5%bc%80%e5%8f%91%e6%8e%a2%e7%b4%a250-uefi%e4%b8%8e%e7%bd%91%e7%bb%9c2/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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编程。

654 total views, 4 views today


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK