# virt-v2v

`virt-v2v` is a command-line tool used to convert virtual machine images from one virtualization format to another. It is particularly designed for converting virtual machines from proprietary hypervisor formats (like VMware, Xen, or Hyper-V) to formats used by the **KVM/QEMU** virtualization stack. This tool is commonly used when migrating virtual machines from commercial virtualization platforms to open-source solutions like **libvirt**, which uses KVM/QEMU.

#### Purpose of `virt-v2v`

The main purpose of `virt-v2v` is to allow users to seamlessly migrate virtual machines from a wide variety of source hypervisors to KVM-based environments. This is particularly useful for organizations looking to move away from proprietary virtualization solutions and adopt open-source alternatives. It simplifies the migration process by automating much of the work involved in converting virtual machine images and configuration.

#### Key Features of `virt-v2v`

1. **VM Migration**:
   * Converts and migrates virtual machines from various formats to KVM-compatible formats.
2. **Preserves VM Configuration**:
   * Attempts to preserve the VM's configuration, including its disk structure, networking, and memory settings, when possible.
3. **Conversion of Virtual Machine Disk Images**:
   * Converts disk images from formats such as **VMware VMDK**, **Xen VDI**, or **Hyper-V VHD** to **QCOW2** or **RAW**, which are used by KVM.
4. **Cross-Hypervisor Compatibility**:
   * Supports multiple hypervisor platforms, including VMware, Xen, Hyper-V, and more.
5. **Automated Setup**:
   * Configures the KVM environment to accommodate the imported VM, making it easier to get the VM up and running.
6. **Preserves Network Configuration**:
   * Attempts to map network interfaces and configurations from the source hypervisor to the destination KVM setup.
7. **Can Handle Multiple Virtual Machines**:
   * Can convert multiple VMs in one operation if necessary.

#### Basic Syntax

```bash
virt-v2v [OPTIONS] SOURCE
```

* **SOURCE**: The source of the virtual machine to be converted. This could be a directory, disk image, or remote hypervisor.
* **OPTIONS**: Various options can be provided to control the conversion, such as specifying the target destination, adjusting network settings, or customizing disk formats.

#### Common Options

* `-o, --output`
  * Specifies the destination for the converted virtual machine (e.g., a directory or a remote server).
* `-t, --target`
  * Specifies the type of destination, e.g., `libvirt` for a KVM setup. The default is usually `libvirt`.
* `-n, --network`
  * Allows the user to configure network interfaces for the destination VM, mapping source interfaces to target interfaces.
* `-v, --verbose`
  * Enables verbose output to provide more details during the conversion process.
* `-p, --parallel`
  * Specifies the number of parallel conversions to perform when converting multiple virtual machines.
* `-x, --no-check-certificate`
  * Disables SSL verification when downloading disk images from remote sources.
* `-d, --disk`
  * Specifies the disk conversion settings, such as format and size. Can be used to select the output format for the virtual machine disk.

#### Example Usage

1. **Convert a VMware VM to a KVM Virtual Machine:**

   ```bash
   virt-v2v -o /var/lib/libvirt/images -t libvirt /path/to/vmware-vm.vmx
   ```

   * Converts the VMware virtual machine specified in `/path/to/vmware-vm.vmx` to KVM format and saves the converted VM in `/var/lib/libvirt/images`.
2. **Convert Hyper-V Virtual Machine to KVM:**

   ```bash
   virt-v2v -o /var/lib/libvirt/images -t libvirt -v /path/to/hyperv-vm.vhdx
   ```

   * Converts the Hyper-V virtual machine located at `/path/to/hyperv-vm.vhdx` and places it in `/var/lib/libvirt/images` as a KVM-compatible VM.
3. **Convert and Configure Network for KVM Virtual Machine:**

   ```bash
   virt-v2v -o /var/lib/libvirt/images -t libvirt --network bridge=br0 /path/to/vmware-vm.vmx
   ```

   * Converts the VMware VM and connects the new KVM virtual machine to the `br0` bridge on the host.
4. **Convert Multiple VMs Simultaneously (using parallel conversion):**

   ```bash
   virt-v2v -o /var/lib/libvirt/images -t libvirt -p 2 /path/to/vm1.vmx /path/to/vm2.vmx
   ```

   * Converts two VMware VMs in parallel, speeding up the process.
5. **Convert Xen Virtual Machine to KVM:**

   ```bash
   virt-v2v -o /var/lib/libvirt/images -t libvirt /path/to/xen-vm.img
   ```

   * Converts the Xen virtual machine located at `/path/to/xen-vm.img` to KVM format.

#### Considerations

* **Disk Image Conversion**: `virt-v2v` can convert disk images to different formats (e.g., `VMDK` to `QCOW2`). However, it's important to ensure that the disk image format chosen for the destination is compatible with the KVM/QEMU hypervisor.
* **Network Configuration**: The network interfaces on the converted VM may need to be adjusted to work with the destination environment. For example, a VMware VM might have specific network adapter configurations that need to be mapped to KVM network bridges or other network interfaces.
* **Guest Agent**: Depending on the source hypervisor, it may be beneficial to install a guest agent (such as `qemu-guest-agent`) in the converted VM for better performance and integration with the KVM/QEMU hypervisor.
* **Virtual Machine Hardware Compatibility**: Some hardware configurations from source hypervisors may not be fully supported by KVM. For example, hardware-assisted virtualization options like PCI passthrough may need additional configuration.

#### Conclusion

`virt-v2v` is an essential tool for converting virtual machines between different hypervisor platforms, particularly when migrating to a KVM-based environment. It simplifies the process by handling the conversion of both virtual machine disks and configuration, ensuring that the virtual machine is properly set up and ready for use in the new environment. This tool is a key component for organizations moving away from proprietary virtualization solutions and adopting open-source virtualization technologies like KVM and QEMU.
