I frequently re-install ESXi on my physical host for various types of testing as I normally work with a number of future releases. Although the process just takes a couple of minutes, having to enter the exact same information each time and also requiring a keyboard and monitor is not really ideal. For the majority, this is really not a problem and manually going through the install workflow is fine for most folks, especially as this is an infrequent operation.

However, with some recent customer conversations, I thought it was worth while to re-visit this topic and demonstrating just how easy it is to automate the installation of ESXi with just a single bootable USB device and embedding an ESXi Kickstart Script. Even for infrequent installation and/or upgrades of ESXi for home labs, this can be a time saver, especially if you do not have monitor and keyboard just lying around. Below are instructions including a reference Kickstart example that folks can use as a starting point. For more advanced automation, please take a look at my ESXI Kickstart Resources as well as the official VMware documentation for ESXi Scripted Installations.

Step 1 - Create a bootable ESXi image on a USB device using any ESXi ISO downloaded from VMware. I personally use Unetbootin for this process and the tool is multi-platform which is also really nice. Do not eject or unplug the device after the flashing has completed.

Step 2 - Using a code editor like Microsoft Code, open both BOOT.CFG and EFI/BOOT/BOOT.CFG from the USB device and replace the default kernelopt=cdromBoot runweasel with kernelopt=ks=usb:/KS.CFG which tells ESXi to not start the default interactive installer but rather a scripted install and look for the Kickstart file in the root of the USB device, which we will create in the next step.

bootstate=0 title=Loading ESXi installer timeout=5 prefix= kernel=/b.b00 kernelopt=ks=usb:/KS.CFG modules=/jumpstrt.gz --- /useropts.gz --- /features.gz --- /k.b00 --- /chardevs.b00 --- /user.b00 --- /procfs.b00 --- /uc_intel.b00 --- /uc_amd.b00 --- /uc_hygon.b00 --- /vmx.v00 --- /vim.v00 --- /sb.v00 --- /s.v00 --- /ata_liba.v00 --- /ata_pata.v00 --- /ata_pata.v01 --- /ata_pata.v02 --- /ata_pata.v03 --- /ata_pata.v04 --- /ata_pata.v05 --- /ata_pata.v06 --- /ata_pata.v07 --- /block_cc.v00 --- /bnxtnet.v00 --- /bnxtroce.v00 --- /brcmfcoe.v00 --- /char_ran.v00 --- /ehci_ehc.v00 --- /elxiscsi.v00 --- /elxnet.v00 --- /hid_hid.v00 --- /i40en.v00 --- /iavmd.v00 --- /igbn.v00 --- /ima_qla4.v00 --- /ipmi_ipm.v00 --- /ipmi_ipm.v01 --- /ipmi_ipm.v02 --- /iser.v00 --- /ixgben.v00 --- /lpfc.v00 --- /lpnic.v00 --- /lsi_mr3.v00 --- /lsi_msgp.v00 --- /lsi_msgp.v01 --- /lsi_msgp.v02 --- /misc_cni.v00 --- /misc_dri.v00 --- /mtip32xx.v00 --- /ne1000.v00 --- /nenic.v00 --- /net_bnx2.v00 --- /net_bnx2.v01 --- /net_cdc_.v00 --- /net_cnic.v00 --- /net_e100.v00 --- /net_e100.v01 --- /net_enic.v00 --- /net_fcoe.v00 --- /net_forc.v00 --- /net_igb.v00 --- /net_ixgb.v00 --- /net_libf.v00 --- /net_mlx4.v00 --- /net_mlx4.v01 --- /net_nx_n.v00 --- /net_tg3.v00 --- /net_usbn.v00 --- /net_vmxn.v00 --- /nfnic.v00 --- /nhpsa.v00 --- /nmlx4_co.v00 --- /nmlx4_en.v00 --- /nmlx4_rd.v00 --- /nmlx5_co.v00 --- /nmlx5_rd.v00 --- /ntg3.v00 --- /nvme.v00 --- /nvmxnet3.v00 --- /nvmxnet3.v01 --- /ohci_usb.v00 --- /pvscsi.v00 --- /qcnic.v00 --- /qedentv.v00 --- /qfle3.v00 --- /qfle3f.v00 --- /qfle3i.v00 --- /qflge.v00 --- /sata_ahc.v00 --- /sata_ata.v00 --- /sata_sat.v00 --- /sata_sat.v01 --- /sata_sat.v02 --- /sata_sat.v03 --- /sata_sat.v04 --- /scsi_aac.v00 --- /scsi_adp.v00 --- /scsi_aic.v00 --- /scsi_bnx.v00 --- /scsi_bnx.v01 --- /scsi_fni.v00 --- /scsi_hps.v00 --- /scsi_ips.v00 --- /scsi_isc.v00 --- /scsi_lib.v00 --- /scsi_meg.v00 --- /scsi_meg.v01 --- /scsi_meg.v02 --- /scsi_mpt.v00 --- /scsi_mpt.v01 --- /scsi_mpt.v02 --- /scsi_qla.v00 --- /sfvmk.v00 --- /shim_isc.v00 --- /shim_isc.v01 --- /shim_lib.v00 --- /shim_lib.v01 --- /shim_lib.v02 --- /shim_lib.v03 --- /shim_lib.v04 --- /shim_lib.v05 --- /shim_vmk.v00 --- /shim_vmk.v01 --- /shim_vmk.v02 --- /smartpqi.v00 --- /uhci_usb.v00 --- /usb_stor.v00 --- /usbcore_.v00 --- /vmkata.v00 --- /vmkfcoe.v00 --- /vmkplexe.v00 --- /vmkusb.v00 --- /vmw_ahci.v00 --- /xhci_xhc.v00 --- /elx_esx_.v00 --- /btldr.t00 --- /esx_dvfi.v00 --- /esx_ui.v00 --- /esxupdt.v00 --- /weaselin.t00 --- /lsu_hp_h.v00 --- /lsu_inte.v00 --- /lsu_lsi_.v00 --- /lsu_lsi_.v01 --- /lsu_lsi_.v02 --- /lsu_lsi_.v03 --- /lsu_lsi_.v04 --- /lsu_smar.v00 --- /native_m.v00 --- /qlnative.v00 --- /rste.v00 --- /vmware_e.v00 --- /vsan.v00 --- /vsanheal.v00 --- /vsanmgmt.v00 --- /tools.t00 --- /xorg.v00 --- /imgdb.tgz --- /imgpayld.tgz build= updated=0 1 2 3 4 5 6 7 8 9 bootstate = 0 title = Loading ESXi installer timeout = 5 prefix = kernel = / b . b00 kernelopt = ks = usb : / KS . CFG modules = / jumpstrt . gz -- - / useropts . gz -- - / features . gz -- - / k . b00 -- - / chardevs . b00 -- - / user . b00 -- - / procfs . b00 -- - / uc_intel . b00 -- - / uc_amd . b00 -- - / uc_hygon . b00 -- - / vmx . v00 -- - / vim . v00 -- - / sb . v00 -- - / s . v00 -- - / ata_liba . v00 -- - / ata_pata . v00 -- - / ata_pata . v01 -- - / ata_pata . v02 -- - / ata_pata . v03 -- - / ata_pata . v04 -- - / ata_pata . v05 -- - / ata_pata . v06 -- - / ata_pata . v07 -- - / block_cc . v00 -- - / bnxtnet . v00 -- - / bnxtroce . v00 -- - / brcmfcoe . v00 -- - / char_ran . v00 -- - / ehci_ehc . v00 -- - / elxiscsi . v00 -- - / elxnet . v00 -- - / hid_hid . v00 -- - / i40en . v00 -- - / iavmd . v00 -- - / igbn . v00 -- - / ima_qla4 . v00 -- - / ipmi_ipm . v00 -- - / ipmi_ipm . v01 -- - / ipmi_ipm . v02 -- - / iser . v00 -- - / ixgben . v00 -- - / lpfc . v00 -- - / lpnic . v00 -- - / lsi_mr3 . v00 -- - / lsi_msgp . v00 -- - / lsi_msgp . v01 -- - / lsi_msgp . v02 -- - / misc_cni . v00 -- - / misc_dri . v00 -- - / mtip32xx . v00 -- - / ne1000 . v00 -- - / nenic . v00 -- - / net_bnx2 . v00 -- - / net_bnx2 . v01 -- - / net_cdc_ . v00 -- - / net_cnic . v00 -- - / net_e100 . v00 -- - / net_e100 . v01 -- - / net_enic . v00 -- - / net_fcoe . v00 -- - / net_forc . v00 -- - / net_igb . v00 -- - / net_ixgb . v00 -- - / net_libf . v00 -- - / net_mlx4 . v00 -- - / net_mlx4 . v01 -- - / net_nx_n . v00 -- - / net_tg3 . v00 -- - / net_usbn . v00 -- - / net_vmxn . v00 -- - / nfnic . v00 -- - / nhpsa . v00 -- - / nmlx4_co . v00 -- - / nmlx4_en . v00 -- - / nmlx4_rd . v00 -- - / nmlx5_co . v00 -- - / nmlx5_rd . v00 -- - / ntg3 . v00 -- - / nvme . v00 -- - / nvmxnet3 . v00 -- - / nvmxnet3 . v01 -- - / ohci_usb . v00 -- - / pvscsi . v00 -- - / qcnic . v00 -- - / qedentv . v00 -- - / qfle3 . v00 -- - / qfle3f . v00 -- - / qfle3i . v00 -- - / qflge . v00 -- - / sata_ahc . v00 -- - / sata_ata . v00 -- - / sata_sat . v00 -- - / sata_sat . v01 -- - / sata_sat . v02 -- - / sata_sat . v03 -- - / sata_sat . v04 -- - / scsi_aac . v00 -- - / scsi_adp . v00 -- - / scsi_aic . v00 -- - / scsi_bnx . v00 -- - / scsi_bnx . v01 -- - / scsi_fni . v00 -- - / scsi_hps . v00 -- - / scsi_ips . v00 -- - / scsi_isc . v00 -- - / scsi_lib . v00 -- - / scsi_meg . v00 -- - / scsi_meg . v01 -- - / scsi_meg . v02 -- - / scsi_mpt . v00 -- - / scsi_mpt . v01 -- - / scsi_mpt . v02 -- - / scsi_qla . v00 -- - / sfvmk . v00 -- - / shim_isc . v00 -- - / shim_isc . v01 -- - / shim_lib . v00 -- - / shim_lib . v01 -- - / shim_lib . v02 -- - / shim_lib . v03 -- - / shim_lib . v04 -- - / shim_lib . v05 -- - / shim_vmk . v00 -- - / shim_vmk . v01 -- - / shim_vmk . v02 -- - / smartpqi . v00 -- - / uhci_usb . v00 -- - / usb_stor . v00 -- - / usbcore_ . v00 -- - / vmkata . v00 -- - / vmkfcoe . v00 -- - / vmkplexe . v00 -- - / vmkusb . v00 -- - / vmw_ahci . v00 -- - / xhci_xhc . v00 -- - / elx_esx_ . v00 -- - / btldr . t00 -- - / esx_dvfi . v00 -- - / esx_ui . v00 -- - / esxupdt . v00 -- - / weaselin . t00 -- - / lsu_hp_h . v00 -- - / lsu_inte . v00 -- - / lsu_lsi_ . v00 -- - / lsu_lsi_ . v01 -- - / lsu_lsi_ . v02 -- - / lsu_lsi_ . v03 -- - / lsu_lsi_ . v04 -- - / lsu_smar . v00 -- - / native_m . v00 -- - / qlnative . v00 -- - / rste . v00 -- - / vmware_e . v00 -- - / vsan . v00 -- - / vsanheal . v00 -- - / vsanmgmt . v00 -- - / tools . t00 -- - / xorg . v00 -- - / imgdb . tgz -- - / imgpayld . tgz build = updated = 0

Step 3 - Using a code editor like Microsoft Code, create a new file called KS.CFG (it must be all capitalized) on the root USB device which will contain the ESXi installation configuration and any additional automation you wish to run. Below is a very basic ESXi Kickstart which sets a static network address, password, enables ESXi Shell/SSH, suppresses the UI warnings and will then automatically install ESXi on the same USB device. For more advanced automation, please see the references noted earlier.

vmaccepteula install --firstdisk=usb --overwritevmfs --novmfsondisk reboot network --bootproto=static --ip=192.168.30.13 --netmask=255.255.255.0 --gateway=192.168.30.1 --hostname=hades-canyon.primp-industries.com --nameserver=192.168.30.1 --addvmportgroup=1 rootpw VMware1! %firstboot --interpreter=busybox # enable & start SSH vim-cmd hostsvc/enable_ssh vim-cmd hostsvc/start_ssh # enable & start ESXi Shell vim-cmd hostsvc/enable_esx_shell vim-cmd hostsvc/start_esx_shell # Suppress ESXi Shell warning esxcli system settings advanced set -o /UserVars/SuppressShellWarning -i 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 vmaccepteula install -- firstdisk = usb -- overwritevmfs -- novmfsondisk reboot network -- bootproto = static -- ip = 192.168.30.13 -- netmask = 255.255.255.0 -- gateway = 192.168.30.1 -- hostname = hades - canyon . primp - industries . com -- nameserver = 192.168.30.1 -- addvmportgroup = 1 rootpw VMware1 ! % firstboot -- interpreter = busybox # enable & start SSH vim - cmd hostsvc / enable_ssh vim - cmd hostsvc / start_ssh # enable & start ESXi Shell vim - cmd hostsvc / enable_esx_shell vim - cmd hostsvc / start_esx_shell # Suppress ESXi Shell warning esxcli system settings advanced set - o / UserVars / SuppressShellWarning - i 1

Step 4 - Eject the USB device and plug that into your physical ESXi host and just power it on and watch the magic happen 🙂 Once the system reboots, it should be accessible on your network assuming everything was configured correctly.