(请保留-> 作者: 罗冰   https://blog.csdn.net/luobing4365)

在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中网络连接测试

在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连接。

配置虚拟机内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编程。

UEFI开发探索50 – UEFI与网络2相关推荐

  1. UEFI开发探索99 – UEFI Shell下截屏工具

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI Shell下截屏工具 1 PrintScreenLogger的代码结构 1)Print ...

  2. UEFI开发探索97 – EDK2模拟器搭建网络环境

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) EDK2模拟器搭建网络环境 1 搭建EDK2开发环境 1)工具安装 2)下载代码库 3)更新子模 ...

  3. UEFI开发探索QA – 问题辑录(持续更新)

    最近正在尝试在Unbutu16上搭建开发和调试环境,其中过程一言难尽,到现在也没完成到符合我要求的程度. 正是因为遇到障碍,我今天早上回到Win10+UDK2018的环境下,想重新编译下AppPkg, ...

  4. UEFI开发探索95 – 弹跳小游戏

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI下的弹跳小游戏 1 Bounce游戏 1.1 游戏架构 1.2 移植和编写代码 1)编写 ...

  5. UEFI开发探索85- YIE002USB开发板(08 制作HID设备)

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之制作HID设备-编程 1 YIE002-STM32的USB编程 2 调 ...

  6. UEFI开发探索02 – 环境搭建1

    (请保留->作者:罗冰 ) 开发初期的目的就是做出可以在pci rom上跑的Oprom,当然是在uefi bios下.我的计划大致如下: 1 搭建完整的编译环境,了解使用哪些库进行编译: 2 我 ...

  7. UEFI开发探索94 – 迷宫小游戏

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI下的迷宫小游戏 1 Maze程序结构分析 1)定义全局变量 2)设置迷宫 3) 游戏控制 ...

  8. UEFI开发探索100 – 《UEFI编程实践》发布啦

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) <UEFI编程实践>发布 1 内容简介 第一部分 UEFI环境搭建及UEFI应用构建 ...

  9. UEFI开发探索81- YIE002USB开发板(04 制作HID设备)

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之制作HID设备-USB系统概述 1 USB规范简介 2 软件工程师眼中 ...

  10. UEFI开发探索74- YIE002USB开发板(03 Windows编程)

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之Windows编程 1 添加库文件 2 枚举HID设备 2.1 Set ...

最新文章

  1. python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝
  2. 大话中文文本分类之fastText
  3. [原]Oracle数据文件损坏的模拟和修复(一) |ORA-01578 data block corrupted|
  4. 写 Python 爬虫 5 年,复制粘贴一直是我赖以生存的核心技能,直到我看到这些腾讯阿里大佬们的技术公众号,太强了...
  5. Bootstrap table 行编辑导航
  6. mysql5.5表的创建源码_mysql5.5 源码安装
  7. LeetCode 1382. 将二叉搜索树变平衡(中序遍历+二分递归)
  8. 计算机四级计算机组成与接口总结,计算机等级测验四级计算机组成与接口.docx...
  9. 我的三年研究生(CS)学习与工作经历(ZT)
  10. [HAOI2010]软件安装(树形背包,tarjan缩点)
  11. 计算机工程学院运动会方阵口号,运动会方阵口号(精选多篇)
  12. 八大排序算法总结以及python实现
  13. 15个顶级多线程面试题及答案
  14. java计算器功能_java实现简易计算器功能
  15. Android 手机锁屏解锁后Activity走了onDestroy
  16. MySQL学习宝典之最全的常用语法语句
  17. 公司给你调岗降薪,逼你主动辞职如何应对?
  18. excel矩阵小tips
  19. 在java中 以下关于集合框架_在Java中LinkedList类和ArrayList类同属于集合框架类,下列...
  20. 【建议收藏】数据结构和算法面试题

热门文章

  1. 互联网+时代的7个引爆点(读书笔记)
  2. 兰州理工大学计算机考研好考吗,兰州理工大学考研难吗
  3. Plist图集批量拆解工具大全
  4. Codeforces 1194D
  5. 熊出没机器人光头强_《熊出没》中的这个小细节你注意到了吗?光头强或许只是诱饵...
  6. 使用版本控制软件TortoiseSVN对程序和文档进行控制的说明
  7. 智能时代“无人区”的开拓者,国防科大智能科学学院推免生源大起底
  8. 1.42 财务测量指标——静态评价法(投资回报率+投资回收期)
  9. ORA-20011(外部表收集统计信息异常报错)
  10. python中空格怎么打_191012 python3关于空格打印、赋值、+=符号的小坑