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
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
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.
Omer says
Nice writeup William. Thanks for sharing !!
I use a nested ESXi setup and need to reinstall ESXI hosts multiple times a month. For now, i follow the console based setup on to a vmdk.
Do you think we could automate that too ? And if so any direction would help.
Thanks
Jean Laganière says
Omer, why don't you just use Vmware snapshots instead of reinstalling you nested ESXI hosts?
Jean Laganière says
William, maybe I missed something, but if you install ESXi on the same USB drive from which you have booted, this would mean you cannot reuse it for future reinstallation? You would then need to recreate a new USB with unetbootin, edit boot.cfg and kickstart file etc?
William Lam says
Yes, that's correct. It all depends on what you're trying to do 🙂 If you're hardcoding the IP, then it's not really useful beyond a single installation or you're constantly updating it. The point here is that you can automate a single or many installations. My example showed installing on the same USB key (as that's quite common for home labs). You can certainly install onto another USB device or even a local disk
Fabian Dietl says
Cheers guys, we use a standard password containing a # which is implying a comment... 'password#1' doesn't seem to fix it, any suggestions besides changing the password? 😛
Thanks in advance!
James Bishop says
I've found in testing that when using Rufus to create the USB stick, it's best to select MBR instead of GPT. I found when using GPT that it failed to find KS.CFG.
David Dreggors says
I also have this issue, I have found many articles that say to call for the file name in uppercase as well so I tried that too (i.e. ks=cdrom:/ks.cfg and ks=cdrom:/KS.CFG) and neither test case works, file is never found.
I place the same ks.cfg on an http server and I can use it just fine though.
jojo says
tried to use unetbootin and rufus, but failed to find KS.CFG on the usb.
install goes until to search for kickstart file and hang up with the following
"exception.HandledError: Error (See Log for more info) cannot find kickstart file on usb with path -- /ks.cfg"
used ks=usb:/KS.CFG
but
it s working with ks=cdrom:/KS.CFG
could not find any info
any help William?
Varun Kumar says
While I use NFS path, the KS file is getting accepted but once it completes line 5 & 6 it is showing installation is completed successfully, whereas I have vswitch configuration are written (it is not accepting those lines).
The same script is running when I mount KS.CFG file into the iso and boot using ILO (virtual CD device).
sample1 says
Sorry, i have a question:
it's possible on firstboot option make a reboot and resume firstboot after reboot?
Keith says
Hi, in the line:
install --firstdisk=usb --overwritevmfs --novmfsondisk
what does the option "--novmfsondisk" do? I could not find anything on it.
Kiran Basawaraj Zond says
Is it possible to automate esxi deployment without having dhcp ?
William Lam says
Yes, it’s called statically assigned networking 🙂
Shane says
This link gets a 404
https://www.williamlam.com/vmware-kickstart?_gl=1*1e4opbu*_ga*MTA5Njk1NTk3NC4xNzA5NjY4NDM2*_ga_4XVSZD148F*MTcwOTc0NDQxMy4yLjEuMTcwOTc0NDUyNC4wLjAuMA..
William Lam says
Fixed. It should have just pointed you to all posts tagged with "kickstart"
RSS says
good morning William, in what environment (bios, esx pre-boot, etc) does the network command run? Trying to tshoot an issue on a specific hardware platfrom.
William Lam says
This is when ESXi installer is fully booted up (definitely after BIOS, etc). Best way to debug is to manually load it up installer, then switch to console and see if you're able to reach a certain network/etc.