Cloning a VM in ESXi 5.x standalone hypervisor using vmkfstools

If you run ESXi 5.5 hypervisor in a standalone setup and not managed by vCenter you do not have the ability to clone a VM via the GUI. Any VM that is managed by vCenter can be cloned by simply right-clicking on it and selecting Clone, per the below:


When you have spent many man hours configuring a VM, it’s guest OS and the applications that run within it, it makes no sense re-doing all the same work if you need to deploy a new server that will run the same applications and perform the same role. This is one of the main reasons cloning a VM is such as useful feature. My current setup contains only 1 x Centos VM called lnx-svr-01.vsysad.local, per the below:


As you can see, the clone option is not available in the GUI:


The aim here is to clone lnx-svr-01.vsysad.local and create new VM called lnx-svr-02.vsysad.local. So I will clone the existing  VM via CLI using vmkfstools to produce the new one. So to proceed perform the following steps:

1. Shutdown he VM you are going to clone, in my case this is lnx-svr-01.vsysad.local.

2. Connect to the ESXi hypervisor via ssh.

3. Browse the datastore that contains the VM folders, the datastore in question here is hyp1-local-1:

~ # ls /vmfs/volumes/hyp1-local-1/
ISO lnx-svr-01.vsysad.local
Imports vmkdump
~ #

As you can see from the above the only VM folder is lnx-svr-01.vsysad.local because it’s the only one I have running on this hypervisor at the moment.

4. Create a new folder called lnx-svr-02.vsysad.local. This is where our new VM is going to reside on the datastore. To do so run:

~ # mkdir /vmfs/volumes/hyp1-local-1/lnx-svr-02.vsysad.local

Then run ls to verify it has been created:

~ # ls /vmfs/volumes/hyp1-local-1/
ISO lnx-svr-01.vsysad.local vmkdump
Imports lnx-svr-02.vsysad.local
~ #

We can see from the output that a folder called lnx-svr-02.vsysad.local has been successfully created.

5. Now list the contents of the folder lnx-svr-01.vsysad.local by running:

~ # ls /vmfs/volumes/hyp1-local-1/lnx-svr-01.vsysad.local

We can see all the VM files above. The one we are going to copy is called lnx-svr-01.vsysad.local.vmx.

6. Copy lnx-svr-01.vsysad.local.vmx to the folder lnx-svr-02.vsysad.local we created in step 3 above by running:

~ # cp /vmfs/volumes/hyp1-local-1/lnx-svr-01.vsysad.local/lnx-svr-01.vsysad.local.vmx /vmfs/volumes/hyp1-local-1/lnx-svr-02.vsysad.local/lnx-svr-02.vsysad.local.vmx

Notice that we are copying it and renaming it to lnx-svr-02.vsysad.local.vmx.

7. Next, we use the vmkfstools command to clone the virtual hard disk (vmdk) of lnx-svr-01.vsysad.local into a new vmdk. If you look back at step 4 you will see the file called lnx-svr-01.vsysad.local.vmdk – we will clone this file into a new one called lnx-svr-02.vsysad.local.vmdk located in the lnx-svr-02.vsysad.local folder we created in step 3. To proceed, I run the following:

~ # vmkfstools -i /vmfs/volumes/hyp1-local-1/lnx-svr-01.vsysad.local/lnx-svr-01.vsysad.local.vmdk /vmfs/volumes/hyp1-local-1/lnx-svr-02.vsysad.local/lnx-svr-02.vsysad.local.vmdk -d zeroedthick

You will see the following output:

~ # vmkfstools -i /vmfs/volumes/hyp1-local-1/lnx-svr-01.vsysad.local/lnx-svr-01.vsysad.local.vmdk /vmfs/volumes/hyp1-local-1/lnx-svr-02.vsysad.local/lnx-svr-02.vsysad.local.vmdk -d zeroedthick
Destination disk format: VMFS zeroedthick
Cloning disk '/vmfs/volumes/hyp1-local-1/lnx-svr-01.vsysad.local/lnx-svr-01.vsysad.local.vmdk'...
Clone: 10% done.

Eventually it will complete successfully:

~ # vmkfstools -i /vmfs/volumes/hyp1-local-1/lnx-svr-01.vsysad.local/lnx-svr-01.vsysad.local.vmdk /vmfs/volumes/hyp1-local-1/lnx-svr-02.vsysad.local/lnx-svr-02.vsysad.local.vmdk -d zeroedthick
Destination disk format: VMFS zeroedthick
Cloning disk '/vmfs/volumes/hyp1-local-1/lnx-svr-01.vsysad.local/lnx-svr-01.vsysad.local.vmdk'...
Clone: 100% done.
~ #

Please note the option -d zeroedthick that I run in the vmkfstools command. I wanted the disk to be created as zeroed thick, you can change this option to thin if you want it to be thin provisioned. More options are listed on this VMware KB article.

8. So at this stage, we have a new folder called lnx-svr-02.vsysad.local that contains three new files:

~ # ls /vmfs/volumes/hyp1-local-1/lnx-svr-02.vsysad.local/
lnx-svr-02.vsysad.local-flat.vmdk lnx-svr-02.vsysad.local.vmdk
~ #

We copied the lnx-svr-02.vsysad.local.vmx file and lnx-svr-02.vsysad.local.vmdk was created by the clone process. But you’ll notice a third file, lnx-svr-02.vsysad.local-flat.vmdk. This is the actual virtual disk that contains the data, lnx-svr-02.vsysad.local.vmdk is a descriptor file that simply points to it. The clone process created this file also.

9. The next thing we need to to is edit the lnx-svr-02.vsysad.local.vmx file using vi. I am making an assumption that you know how to use vi to edit files. If you don’t, see this link, which covers the basics. To do so, run:

~ # vi /vmfs/volumes/hyp1-local-1/lnx-svr-02.vsysad.local/lnx-svr-02.vsysad.local.vmx

Find any string that contains lnx-svr-01.vsysad.local and change it to lnx-svr-02.vsysad.local. So in my case the following lines were changed:

nvram = "lnx-svr-02.vsysad.local.nvram"
displayName = "lnx-svr-02.vsysad.local"
extendedConfigFile = "lnx-svr-02.vsysad.local.vmxf"
scsi0:0.fileName = "lnx-svr-02.vsysad.local.vmdk"
sched.swap.derivedName = "/vmfs/volumes/55627693-62f7625a-65ce-a82066349979/lnx-svr-02.vsysad.local/lnx-svr-02.vsysad.local-15fdf1aa.vswp"

Save the changes made to lnx-svr-02.vsysad.local.vmx.

10. So we are now ready to register our VM. Run this command to register it:

~ # vim-cmd solo/registervm /vmfs/volumes/hyp1-local-1/lnx-svr-02.vsysad.local/lnx-svr-02.vsysad.local.vmx

In the vSphere Client you will see the corresponding task:


And BOOM! There it is in your inventory:


A couple of points to mention:

When you power the VM on you will see the following question:


Check I Copied It and click OK and the VM will power on OK.

The next thing to mention is that you should make sure the new VM being powered on doesn’t cause an IP conflict with the VM it was cloned from. If the original VM has a static IP configured then an IP conlfict will ensue by powering on the new/cloned version. So to avoid this, disable the NIC in the VM settings of the new/cloned VM, by un-checking Connect at power on, like so:


Then you can power on the VM, login to the console, re-IP it and then check Connected and Connect at power on in the VM settings. Those actions will avoid causing an IP conflict and potential havoc on your network.

Cloning and converting virtual machine disks with vmkfstools (1028042)
Registering or adding a virtual machine to the inventory on vCenter Server or on an ESX/ESXi host (1006160)

Convert sparse disk to thick disk

After adding a customer supplied vmdk file to a VM in vCenter I noticed that it was a sparse disk:


It was originally created in VirtualBox which uses this format. To take advantage of the features of thick disk we had to convert it using the vmkfstools command. To do this perform the following steps:

1. SSH onto the ESX server and navigate to the folder containing the vmdk file in sparse format.

[root@ESX1]# cd /vmfs/volumes/san-datastore1/VM1

2. Run the following command to convert VM1.vmdk to VM1-thick.vmdk:

vmkfstools -i VM1.vmdk -d eagerzeroedthick  VM1-thick.vmdk

The result will be as follows:

[root@ESX1]# vmkfstools -i "VM1.vmdk" -d eagerzeroedthick "VM1-thick.vmdk"
Destination disk format: VMFS eagerzeroedthick
Cloning disk 'VM1.vmdk'...
Clone: 100% done.

3. Once it completes remove the old sparse disk and then add the newly created thick disk, which is VM1-thick.vmdk, to the VM. You will now see that the format of the disk has changed to thick:


4. Power on the VM and ensure it is working properly.

Reference: vmkstools command syntax