ovf-export, open-source tool for exporting libvirt domains as OVF/OVA

Today I’m releasing ovf-export, a tool for exporting libvirt domains as OVF/OVA, as open-source. Generated packages follow the OVF 1.0 standard so that you can use them with VirtualBox, VMware Workstation/Player, and others.

What is OVF?

OVF is the acronym of Open Virtualization Format, an open standard for packaging and distributing virtual machines (or “virtual appliances”). The standard is developed by Distributed Management Task Force.

An OVF distribution is a directory that contains:

The “OVF file” is an XML document (with the .ovf extension) with a “standard” section plus custom/proprietary tags. The “standard” section is sufficient for describing a VM with attributes that can be found in any hypervisor (like vCPUs, RAM, etc.), while hypervisors can use the proprietary section to describe specific attributes (for example, VirtualBox-specific configurations).

An OVA is an “all-in-one-file” OVF distribution: it’s built by creating a tar archive that contains the same file as the OVF directory, in that specific order (see list above). An OVA can be convenient to distribute.

Currently, major hypervisors support importing/exporting OVF/OVA.

So, why should I use this tool?

Sometimes I prepare virtual machines for my lab. Exporting these VMs in OVA is helpful for me and others (one single file to upload/download, no constraints on hypervisor).

Unluckily, I use libvirt (KVM), which doesn’t support OVF/OVA at all, and sometimes Proxmox (KVM), which supports importing OVF but not exporting it. Meet ovf-export.

The ovf-export tool can export a libvirt domain as OVF/OVA, and the OVF/OVA can be successfully imported in VirtualBox and VMware Workstation (I was able to do tests only with these two). I’m working on a branch that will support Proxmox. In both cases, you should launch this tool in the same local machine as libvirt/Proxmox - I may implement a remote option in the future.

$ ovf-export -list
UUID                                    Name
--------------------------------------------------------
0962a56e96144bdd99bd83418c3e425a        debian10
61290c324b744d9095c6023520ddf72d        openindiana
e7904362d30b4179977804d073f070b4        win10

$ ovf-export -id 0962a56e96144bdd99bd83418c3e425a -output ~/debian10ovf -ova

The source code for this tool is available at https://gitlab.com/Enrico204/ovf-export . If you have Go, you can download and build the tool with go install:

$ go install gitlab.com/enrico204/ovf-export/cmd/ovf-export@latest

Also, the code comes with an ovf package that can generate arbitrary OVF files. Unfortunately, due to a bug/limit in the Go encoding/xml package, the same ovf package cannot be used to parse an OVF file.

Feel free to propose patches :-)