VMware vSphere ESXi on Hyper-V 嵌套虚拟化游记
知识梳理
Microsoft Hyper-V 限制
安装向导
- 虚拟机代数需选择 Generation 1
- 网络驱动器只能存在传统驱动器
虚拟化通告
Set-VMProcessor -VMName "<Hyper-V 虚拟机名称>" -ExposeVirtualizationExtensions $true
CPU 核数
ESXi 安装时,要求 CPU 核数 > 2,所以需要转到 Hyper-V 管理器中:
- 在处理器处添加不少于 2 个虚拟处理器 (但此时相当于两个核,并不是两个能被 ESXi 识别的 CPU )
- 转到 NUMA 选单中,将NUMA拓扑中最大处理器数量改为上一步 vCPU 数量的一半
- 检查内存大小以及单宿主机 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 中执行命令:
[[email protected]:~] esxcfg-advcfg -k TRUE ignoreHeadless
后,先 F12 关机,再次开启 vSphere ESXi 即可。
注意:在我的环境中,这一步按 F12 后如果重启是无法写入内核参数,导致命令看似无效。
共存解决方案:Windows Hypervisor Platform
虚拟机无法联网
由于整个 ESXi Hypervisor 都要通过 Hyper-V 的 vNIC 与外界联网,所以需要做一个 MAC 地址欺骗。
注意在网上找到的英文教程中,会提示要在 ESXi vSwitch 中开启混杂模式,这样做恰恰相反了。教程中是在 ESXi 中嵌套了 Windows Server 所自带的 Hyper-V,这时需要为 ESXi 的虚拟交换机开启混杂模式。
而我们的宿主机和客户机的 Hypervisor 是反过来的,所以需要为 Windows Server 中 Hyper-V 的 vNIC 开启混杂模式。
步骤
- Hyper-V 虚拟交换机需关闭 SR-IOV 多VM增强模式(直通)支持
- 开启 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 开启混杂模式
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 开启虚拟化通告了(无法多层嵌套虚拟化)。
有用的链接
参考
- https://dscottraynsford.wordpress.com/2016/04/22/install-a-vmware-esxi-6-0-hypervisor-in-a-hyper-v-vm/
- Install ESXi on Hyper-V
- http://woshub.com/install-vmware-esxi-on-hyper-v-vm/
- http://realtechtalk.com/Relocating_modules_and_starting_up_the_kernel_VMWare_ESXi_67_Error_and_Solution-2032-articles
- 驱动整合
- https://communities.vmware.com/t5/Nested-Virtualization/VMware-ESXi-5-1-can-run-Microsoft-Hyper-V-Server-2012-VMs-too/m-p/424504?start=0&tstart=0
- https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/nested-virtualization
- https://communities.vmware.com/t5/ESXi-Discussions/Running-VMs-in-VMware-ESXi-VM-on-Hpyer-V/td-p/1752644
- https://communities.vmware.com/t5/Nested-Virtualization/Running-ESX-under-KVM-with-VM-x-EPT/td-p/2668850