Most of my personal workloads today run in the cloud, but there are use cases (e.g. this annoying Unifi Bug) where I want a server inside our home network. I recently set up an Intel NUC (specifically, a NUC11PAH with an i5) for this version with the awesome free version of ESXi for provisioning workloads. If you are a VCDX or similar you can probably do this in your sleep, but for the rest of us here are step-by-step instructions.
The main challenge is that the standard ESXi installer currently doesn’t have the necessary networking drivers for the NUC11. This means we have to roll our own offline install image. To do this, you will need a Windows host. While there is a MacOS version of Powershell and PowerCLI, it doesn’t support the functionality to create custom .iso images yet.
Creating the custom offline ISO image
First we need to download the standard ESXi ISO image. Go to VMware Customer Connect, create an account, select License and Download and download the zip file (NOT the .iso). The download page also gives you a free license key. Copy it, you will need it later.
Next download the Community Networking Driver here. It’s a “Fling” which is VMware’s term for semi-supported projects. Officially no support but in practice major critical infra probably runs on some of these. You should now have something like these two:
Next, run Powershell in Windows (macOS won’t work, Linux likely won’t work either). You will likely have to run it as admin as otherwise some commands will fail.
PS> Install-Module -Name VMware.PowerCLI NuGet provider is required to continue PowerShellGet requires NuGet provider version '126.96.36.199' or newer to interact with NuGet-based repositories. The NuGet provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or 'C:\Users\guido\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by running 'Install-PackageProvider -Name NuGet -MinimumVersion 188.8.131.52 -Force'. Do you want PowerShellGet to install and import the NuGet provider now? [Y] Yes [N] No [S] Suspend [?] Help (default is "Y"): y Untrusted repository You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from 'PSGallery'? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): y
Next, we add the depot files to let the tool know where to take the components from. File names need to match the ones that you downloaded.
PS> Add-EsxSoftwareDepot "4.\VMware-ESXi-7.0U2a-17867351-depot.zip" Depot Url --------- zip:C:\Users\guido\VMware-ESXi-7.0U2a-17867351-depot.zip?index.xml PS C:\Users\guido\> Add-EsxSoftwareDepot ".\Net-Community-Driver_184.108.40.206-1vmw.700.1.0.15843807_18835109.zip" Depot Url --------- zip:C:\Users\guido\Net-Community-Driver_220.127.116.11-1vmw.700.1.0.15843807_18835109.zip?index.xml
To create the profile, we first want to figure out how the old profile is called and then copy it.
PS> Get-EsxImageProfile Name Vendor Last Modified Acceptance Level ---- ------ ------------- ---------------- ESXi-7.0U2a-17867351-no-tools VMware, Inc. 4/9/2021 5:5... PartnerSupported ESXi-7.0U2a-17867351-standard VMware, Inc. 4/29/2021 12... PartnerSupported PS C:\Users\guido> New-EsxImageProfile -CloneProfile "ESXi-7.0U2a-17867351-standard" -name "ESX-NUC" cmdlet New-EsxImageProfile at command pipeline position 1 Supply values for the following parameters: (Type !? for Help.) Vendor: whatever Name Vendor Last Modified Acceptance Level ---- ------ ------------- ---------------- ESX-NUC anet 4/29/2021 12... PartnerSupported PS> Add-EsxSoftwarePackage -ImageProfile "ESX-NUC" -SoftwarePackage "net-community" Name Vendor Last Modified Acceptance Level ---- ------ ------------- ---------------- ESX-NUC anet 12/10/2021 1... PartnerSupported PS> Export-ESXImageProfile -ImageProfile "ESX-NUC" -ExportToISO -filepath ESXi-NUC.iso
Boot the NUC from the USB drive, and ESXi installed without any issues for me. Add the license key, and you are done. The actual workloads I run inside docker containers on Alpine Linux. I looked at running kubernetes, but the networking model is still very hard for home use cases (e.g. workloads listening to broadcast traffic on the host network).
Thanks to Shu Wu, Songtao Zhen and William Lam for the community driver, and JeanD-SYD for his comment on the NUC11.