How to customize a VMware ESXi image and install it in a Hyper-V VM

I’ve been doing recently  VMware ESXi deployment in my lab environment and would like to share main steps required to make it work on nested Hyper-V. Needless to say, nested virtualization works great only for demo and labs, therefore, running ESXi under Hyper-V is a completely unsupported in production environments.

Anyway, carry out the following steps to install ESXi (6.0, in my case. although these steps should work for newer versions as well):

1. Download VMWare ESXi offline bundle available at product download page (e.g. ESXi6.0). You can also download a ESXi image customized by vendor. For example, here is a direct download link for Dell’s ESXi 6.0 image which includes Dell’s VIBs in addition to built-in installation bundles provided by VMware.

2. Download the driver  which allows running ESXi as a VM under Microsoft Hyper-V (net-tulip, it’s actually a network driver which should be added to ESXi image. Otherwise, ESXi installation will be blocked)

3. Copy the downloaded files to the same folder (e.g. ‘D:\Images\VMware ESXi 6\’). It’ll be used as a work folder.

4. Download and install VMware PowerCLI 6.3 or newer

5. Once PowerCLI is installed,  run it and set location to the folder containing the files, then add offline depot ZIP files to the current PowerCLI session as shown below:

cd 'D:\Images\VMware ESXi 6\'
Add-EsxSoftwareDepot .\
Add-EsxSoftwareDepot .\

6. Retrieve the name of the standard image profile and note it (it’ll will be used as a clone for a new profile):

Get-EsxImageProfile|ft Name

7. Create a new image profile by cloning existing profile which name you just noted, and then add the driver’s package to the profile:

#Create a new image profile
New-EsxImageProfile -CloneProfile ESXi-6.0.0-2494585  -Name -Vendor custom

#Add custom packages
Add-EsxSoftwarePackage -ImageProfile -SoftwarePackage net-tulip -Force


If AcceptanceLevel is set to PartnerSupported by default (as in the picture above) and custom packages which you are going to add to the image profile have Community acceptance level, you will receive an error during creating an ESXi ISO and it’s installation . To resolve this, set the acceptance level of the image profile to CommunitySupported by running the following command: Set-EsxImageProfile -AcceptanceLevel CommunitySupported –ImageProfile


8. Now it’s time to create an ISO from the customized ESXi image.To do this, run the following command:

Export-EsxImageProfile -ImageProfile -FilePath D:\Images\esxi60_custom.iso -ExportToIso -Force

Create a new VM with the following settings:

  • Generation 1
  • Static RAM (> 4Gb is recommended)
  • More than 1vCPU
  • Legacy network adapter connected to the switch

A sample of VM’s configuration is shown below:


9. Once you finished to configure a VM, enable virtualization extensions on the VM’s CPU. Optionally, you can download a script available at github to check VM’s configuration and  enable nested virtualization. Both options are allowed:

#Option 1
Set-VMProcessor -VMName "vHost-01" -ExposeVirtualizationExtensions $True

 .\Enable-NestedVM.ps1 -vmName "vHost-01"

10. Turn on the VM, attach the created ESXi ISO and press TAB on the boot screen, then type ignoreHeadless=TRUE and press Enter. Otherwise, ESXi boot will hang while booting  (I assume it’s all because ESXi is running on non-HCL hardware. VM is a bit out of the HCL list..).

esxi on hyper-v_1

11. Complete ESXi installation process (as usual), reboot it and press SHIFT+O during the startup, and then enable ignoreHeadless option again as shown in the screenshot:

esxi on hyper-v_4

Once ESXi is successfully started, define settings for management network, enable a Shell, and then press Alt+F1 to enter to a console. We need to set a VMKernel boot-time parameter. Otherwise, you will always need to enable ignoreHeadless after every reboot.

Provide root credentials and  type esxcfg-advcfg -k TRUE ignoreHeadless

esxi on hyper-v_6

Close the console by pressing ALT+F2, reboot ESXi and verify that it starts up seamlessly.

That’s it. Now you have a ESXi host running on a Hyper-V VM.

Until then,

enjoy your day :)!

How to enable nested virtualization in Azure

We have already mentioned new Azure VM series Dv3 and Ev3 which enable running VMs inside Azure VMs or just nested virtualization. Today we are going to get it configured and to run our first nested VM in Azure.

But before we start, let’s review some Dv3 and Ev3 facts:

  • they introduce Hyper-Threading Technology running on the Intel® Broadwell E5-2673 v4 2.3GHz processor and Intel® Haswell 2.4 GHz E5-2673 v3
  • they made shift from physical core to virtual CPUs (thanks to HT technology) to support larger VM sizes
  • they are the first Azure VMs running on Windows Server 2016 hosts
  • Dv3 VMs are up to 64 vCPUs and 256 GB RAM
  • Ev3 VMs are up to 64 vCPUs and 432 Gb RAM
  • they are currently available only for certain regions (West Europe, US East, US West 2, Asia Pacific Southeast)
  • they already come with ExposeVirtualizationExtensions enabled. we don’t need to enable CPU extensions as we have to do for on-premises WS2016 hosts

To get started with “nesting” you need to create one or more Dv3/Ev3 VMs in Azure within compatible region. For quick demo purposes, I created D2S_V3  VM with Windows Server 2016 DC , standard managed disk with no data disks attached.

TIP: actually you can , for instance, create 2 or more VMs , add data disks and configure storage spaces between them to achieve higher IO performance.

Then you need to install Hyper-V role and restart VM to apply changes

Install-WindowsFeature Hyper-V -IncludeManagementTools -Restart

nested virtualization azure 1

Verify that Hyper-V role is installed and add internal switch. New adapter “vEthernet (switchname)” will be created under network connections list (ncpa.cpl)

Define a new IP address for this adapter (I’m using subnet).  This network will be used as a NAT gateway for new VMs in order to allow internet access from nested VMs.

#Check Hyper-V role state
Get-WindowsFeature Hyper-V|ft InstallState, PostConfigurationNeeded

#Add new internal switch
New-VMSwitch -SwitchName "NSW01" -SwitchType Internal

# IP Configuration for vNIC
New-NetIPAddress -InterfaceAlias "vEthernet (NSW01)" -IPAddress -PrefixLength 24

nested virtualization azure 2

Configure NAT rule to provide “access” to our nested VMs

New-NetNat -Name Nat_VM -InternalIPInterfaceAddressPrefix


Now our nested VMs can assign IP addresses from subnet  (manual assignment). If you want to have dynamic IP assignment – create add. VM and configure DHCP. Continue reading “How to enable nested virtualization in Azure”