ESXi on Hyper-V 嵌套虚拟化游记


VMware vSphere ESXi on Hyper-V 嵌套虚拟化游记

知识梳理

梳理一下 Windows 的 Hyper-V、Hypervisor

Microsoft Hyper-V 限制

安装向导

  • 虚拟机代数需选择 Generation 1
  • 网络驱动器只能存在传统驱动器

虚拟化通告

Set-VMProcessor -VMName "<Hyper-V 虚拟机名称>" -ExposeVirtualizationExtensions $true

CPU 核数

ESXi 安装时,要求 CPU 核数 > 2,所以需要转到 Hyper-V 管理器中:

  1. 在处理器处添加不少于 2 个虚拟处理器 (但此时相当于两个核,并不是两个能被 ESXi 识别的 CPU )
  2. 转到 NUMA 选单中,将NUMA拓扑中最大处理器数量改为上一步 vCPU 数量的一半
  3. 检查内存大小以及单宿主机 CPU 插槽上最大 NUMA 节点数

无法安装 Hyper-V

无法安装 Hyper-V: 虚拟机监控程序已在运行中。

在配置文件末尾附加:

hypervisor.cpuid.v0 = “FALSE”
mce.enable = “TRUE”

VMware vSphere ESXi 限制

驱动封锁

官方在 ESXi-6.0.0-20170604001 之后的版本中封锁了这种方法,基于 Hyper-V 的嵌套虚拟化暂时不再可行。

另一说是 ESXi 6.5(

EoL 版本的下载地址藏得比较深,在专门的一个分类里。

无法识别虚拟网卡

现象为安装时提示无网络,只能重启。

需要先安装 ESXi-Customizer-PS 后,自己对 Offline Bundle 格式的 ESXi 安装包集成网络适配器驱动,脚本会自动导出 ISO 文件。

ESXi-Customizer-PS.ps1 -iZip "path\to\esxi\installer\in\zip\ESXi600-201706001.zip" -pkgDir "path\to\dir\contains\tulip"

这里我采用离线安装,如果需要在线安装 net-tulip 驱动包的话,需要把 -pkgDir ... 替换为 -vft -load net-tulip 参数。

启动失败

在进入引导后按 Tab,附加启动参数 ignoreHeadless=TRUE.

内核参数 bypass

在系统安装成功之后,在 Shell 或 SSH 中执行命令:

[root@localhost:~] esxcfg-advcfg -k TRUE ignoreHeadless

后,先 F12 关机,再次开启 vSphere ESXi 即可。

注意:在我的环境中,这一步按 F12 后如果重启是无法写入内核参数,导致命令看似无效。

共存解决方案:Windows Hypervisor Platform

开启 Windows Hypervisor Platform

虚拟机无法联网

由于整个 ESXi Hypervisor 都要通过 Hyper-V 的 vNIC 与外界联网,所以需要做一个 MAC 地址欺骗。

注意在网上找到的英文教程中,会提示要在 ESXi vSwitch 中开启混杂模式,这样做恰恰相反了。教程中是在 ESXi 中嵌套了 Windows Server 所自带的 Hyper-V,这时需要为 ESXi 的虚拟交换机开启混杂模式。

而我们的宿主机和客户机的 Hypervisor 是反过来的,所以需要为 Windows Server 中 Hyper-V 的 vNIC 开启混杂模式。

步骤

  1. Hyper-V 虚拟交换机需关闭 SR-IOV 多VM增强模式(直通)支持
  2. 开启 MAC 地址欺骗:Get-VMNetworkAdapter -VMName <VMName> | Set-VMNetworkAdapter -MacAddressSpoofing On

Hyper-V 官方脚本

RUN A NESTED VM ON KVM / QEMU VM IN HYPER-V Microsoft 虚拟化文档 https://github.com/MicrosoftDocs/Virtualization-Documentation/blob/main/hyperv-tools/Nested/Enable-NestedVm.ps1

Hyper-V vNIC 开启混杂模式

Hyper-V promiscuous mode for monitoring external traffic

NAT(可选)

首先在宿主虚拟机(中间VM)中创建一个虚拟 NAT 交换机。注意 IP 地址只是一个示例,会因环境而异。

New-VMSwitch -Name VmNAT -SwitchType Internal
New-NetNat –Name LocalNAT –InternalIPInterfaceAddressPrefix “192.168.100.0/24”

然后为 vNIC 分配一个 IP 地址:

Get-NetAdapter "vEthernet (VmNat)" | New-NetIPAddress -IPAddress 192.168.100.1 -AddressFamily IPv4 -PrefixLength 24

每个嵌套的虚拟机都必须有一个分配给它的 IP 地址和缺省网关。请注意,网关 IP 必须指向上一步中的 NAT 适配器。可能还需要分配 DNS 服务器:

Get-NetAdapter "vEthernet (VmNat)" | New-NetIPAddress -IPAddress 192.168.100.2 -DefaultGateway 192.168.100.1 -AddressFamily IPv4 -PrefixLength 24
Netsh interface ip add dnsserver “vEthernet (VmNat)” address=<my DNS server>

VM 无法启动

需要在 VM 配置中或 vSphere Client 高级设置 中添加 vmx.allowNested = TRUE 以允许嵌套虚拟化。

但这是无法再为客户机 VM 开启虚拟化通告了(无法多层嵌套虚拟化)。

有用的链接

参考


文章作者: sfc9982
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 sfc9982 !
  目录