Short answer: When you enable vSAN ESA from vCenter or VCF, the hosts are validated against the vSAN ESA hardware compatibility list, and the virtual NVMe devices of a nested ESXi VM are not on it. William Lam’s community VIB installs a mock hardware description so the check passes. Set the host acceptance level to CommunitySupported, install the VIB, and restart vsanmgmtd. It is unsupported and meant for nested labs only.
Why nested ESXi fails the vSAN ESA HCL check
vSAN ESA is stricter than OSA about hardware. Broadcom’s vSAN ESA ReadyNode hardware guidance expects hosts built from certified components, with NVMe devices attached directly to PCIe. When you create an ESA cluster, vCenter and the VCF installer compare each host’s storage devices with the vSAN HCL database. A nested ESXi VM with a virtual NVMe controller presents devices that no real HCL entry matches, so the validation fails and the VCF workflow stops.
Check first: is the vSAN HCL DB up to date?
On physical hardware, the same symptom can simply mean an old HCL database. Broadcom KB 412606 describes the VCF 9 installer failing with No vSAN ESA certified disks found on the ESXi Host when all.json is older than 90 days. The fix is to download the current file from https://vvs.broadcom.com/service/vsan/all.json and place it on the installer appliance:
# mv /nfs/vmware/vcf/nfs-mount/all.json /nfs/vmware/vcf/nfs-mount/vsan-hcl
# chown vcf_lcm:vcf /nfs/vmware/vcf/nfs-mount/vsan-hcl/all.json
Then click Re-run Validations. In vCenter, upload the same file via the vSAN HCL DB up-to-date health finding and Update From File, as described in KB 315556. If the hosts are nested, an up-to-date database will still not list virtual NVMe, and that is where the mock VIB comes in.
What the mock VIB does
The nested-vsan-esa-mock-hw-vib project packages a stress.json file into a VIB. The file describes mock vSAN ESA hardware for a nested ESXi VM with an NVMe storage controller, and the vSAN management service uses it during the HCL pre-check. Nothing changes in vCenter or VCF. Prebuilt VIB and offline bundle files are on the project’s Releases page; the repository also contains a Docker-based build script.
Install with ESXCLI
Copy the VIB to the nested host and run:
esxcli software acceptance set --level CommunitySupported
esxcli software vib install -v /nested-vsan-esa-mock-hw.vib --no-sig-check
/etc/init.d/vsanmgmtd restart
With the offline bundle, use esxcli software component apply -d /nested-vsan-esa-mock-hw-offline-bundle.zip --no-sig-check instead of the second line. No reboot is required; the vsanmgmtd restart is.
Install with vSphere Lifecycle Manager
- Import the offline bundle in Lifecycle Manager > Actions > Import Updates.
- Edit the cluster image, add the Nested vSAN ESA Mock HW component and save.
- Remediate the cluster, then restart vsanmgmtd on each host.
The image-based approach keeps the component on the hosts after remediation and is the practical choice when you rebuild nested labs often.
Remove it
esxcli software vib remove -n nested-vsan-esa-mock-hw
# or, if installed as a component:
esxcli software component remove -n nested-vsan-esa-mock-hw
Support status: lab only
This is a community tool, not a Broadcom product. Per Broadcom’s acceptance level documentation, CommunitySupported VIBs have not gone through a VMware-approved testing program and are not supported by VMware Technical Support or partners. Lowering the acceptance level also weakens host security. Do not use it on production hosts, and never use it to make unsupported physical hardware pass the ESA check: the HCL exists because ESA performance and data integrity depend on certified devices.
For building the lab itself, see my notes on deploying a minimal VCF 9.0 lab and the esxcli commands for ESXi 8.0.
Further reading
- William Lam: vSAN ESA HCL hardware mock VIB for Nested ESXi (original post; check it for updates on newer releases)
- Broadcom KB 412606: VCF 9 installer fails the vSAN HCL check because the HCL database is over 90 days old
- Broadcom KB 315556: Updating the vSAN HCL database manually