Converting a VMware vCenter Windows virtual machine to KVM

Updated -

The virt-v2v tool converts virtual machines (VMs), including their disk images and metadata, from foreign hypervisors for use with Red Hat Enterprise Linux with KVM managed by libvirt, Red Hat Virtualization, and Red Hat OpenStack Platform.

This article provides instructions for converting a Windows VM from a VMware vCenter hypervisor to run on Red Hat Enterprise Linux 7 KVM, Red Hat Enterprise Linux 8 KVM, and Red Hat Enterprise Linux 9 KVM.

For an overview of the virt-v2v tool, supported conversions, and links to other types of virtual machine conversions, see Converting Virtual Machines from Other Hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9.

On successful completion of the conversion process, virt-v2v creates a new libvirt domain XML file for the converted VM with the same name as the original VM. The VM can be started using libvirt tools, such as virt-manager or virsh.

Note: If virt-v2v is run as a non-root user, the virt-manager application will not detect the converted VM. This is because virt-v2v saves converted VMs to the current user's namespace, but libvirt maintains separate namespaces for the VMs for each user.


  • Note that on Red Hat Enterprise Linux 7, Windows VMs are supported only under specific subscription programs, such as Advanced Mission Critical (AMC).

  • virt-v2v must be run on a Red Hat Enterprise Linux 64-bit host system.

  • Ensure that the virtual machine is gracefully and fully shutdown prior to running the conversion process, not in fast restart or hibernation modes, otherwise this problem will occur. In addition, remove the VMWare Tools program from the VM.

  • If attempting to convert a Windows 7 or a Windows Server 2008 R2 virtual machine (VM) using the virt-v2v utility, the support for SHA-2 signing certificates must be applied to the VM. For instructions to do so, see Microsoft Security Advisory 3033929. If SHA-2 support is not applied, the converted VM will not work properly.

  • The following minimum system resources must be available:

    • Minimum network speed 1Gbps
    • Disk space: sufficient space to store the VM's disk image, plus 1 GB
    • Sufficient free space in the VM's file system according to the following table:
File system Minimum free space
Root file system or c:\ 100 MB
Every other mountable file system 10 MB
  • The source VM must have 100 or more free index nodes (inodes). If the VM does not have a sufficient number of free inodes, for example if it uses an XFS file system and contains very many files, the conversion will be very slow or it will fail.


Step 1

Install the virt-v2v and virtio-win packages and their dependencies on the host system:

# yum install virt-v2v virtio-win

Step 2

To convert the VMware Windows virtual machine, use the following command and replace with the path to the VMWare vCenter and guestvm1 with the name of the VM to convert:

# virt-v2v -ic esx:// guestvm1

Note: If the vpx username contains a backslash character (such as DOMAIN\USER), it is necessary to enter a URI escape for the character: DOMAIN%5cUSER. Similarly, spaces in the Datacenter name must be entered using the %20 code.

For a full list of virt-v2v parameters, see the virt-v2v man page.

Step 3

Authenticate to the VMware vCenter server.

Connecting to the VMware vCenter server requires authentication. virt-v2v supports password authentication when connecting to VMware vCenter. The password can be entered during conversion, or by using the --password-file option.

Note: When the VMware vCenter server is not configured with a valid vCenter CA certificate, for example if it uses a self-signed certificate, connecting to the server will fail. In this case, certificate checking can be explicitly disabled by adding ?no_verify=1 to the connection URI as shown below:

... -ic esx:// ...

Step 4

Observe the conversion progress. A successful conversion output looks similar to the following:

# virt-v2v -ic 'vpx://' "windows_vm" -o local -os /conversions/ 2>&1 | tee /var/log/v2voutput.log
[   0.0] Opening the source -i libvirt -ic vpx:// windows_vm
Enter administrator's password for
Enter host password for user 'administrator':
[  16.0] Creating an overlay to protect the source from being modified
[  18.0] Opening the overlay
[  50.0] Initializing the target -o local -os /conversions/
[  50.0] Inspecting the overlay
[ 511.0] Checking for sufficient free disk space in the guest
[ 511.0] Estimating space required on target for each disk
[ 511.0] Converting Windows 7 Enterprise to run on KVM
virt-v2v: This guest has virtio drivers installed.
[ 548.0] Mapping filesystem data to avoid copying unused and blank areas
[ 556.0] Closing the overlay
[ 556.0] Copying disk 1/1 to /conversions/windows_vm (raw)
[ 670.0] Creating output metadata
[ 670.0] Finished off

Step 5

Confirm that the VM was imported correctly with the following command:

# virsh list --all

If this command lists the new Windows VM, you have successfully converted and imported the VM.

Step 6

Boot the VM.

When the offline conversion is complete, the converted guest does not yet have all necessary drivers installed to work correctly. These will be installed automatically the first time the guest boots.

Important: Do not interrupt the automatic driver installation process when logging in to the guest for the first time, because this may prevent the guest from subsequently booting correctly.

Afterwards, confirm the full functionality of the VM before deleting the original VM or migrating active services.

Further resources

For more information on managing virtual machines with libvirt in RHEL 7, see the Red Hat Enterprise Linux 7 Virtualization Deployment and Administration Guide.

For more information on managing virtual machines with libvirt in RHEL 8, see Configuring and Managing Virtualization.

For more information on managing virtual machines with libvirt in RHEL 9, see Configuring and Managing Virtualization.

For more information on using virt-v2v to convert virtual machines, you can see the following articles:

In addition, you can refer to the virt-v2v man page and the virt-v2v upstream documentation.