[Tool] pvstream2ova — Export Proxmox VM to OVA, 5× faster than qemu-img
Hi all,
I wrote a Python script to export Proxmox VMs to OVA format. Two features make it different from qemu-img convert:
Benchmark (100 GB disk, 52 GB used, NVMe PCIe 4):
* qemu-img produces a VMDK only — OVA packing adds ~1:30
Also included: pvefingerprint.sh / ovafingerprint.sh to verify VM integrity before export and after import.
The script prints warnings for known OVF limitations (VirtIO SCSI controller, OVMF BIOS, network bridge mapping).
GitHub: https://github.com/a-n-d-r-e-a-b/pvstream2ova
Tested on Proxmox VE 9.1. Give it a try and let me know if you find it useful!
---
Hi all,
I wrote a Python script to export Proxmox VMs to OVA format. Two features make it different from qemu-img convert:
- Parallel zlib compression — each 64 KiB VMDK grain is compressed in a separate thread (ThreadPoolExecutor, default: all CPU cores). On a 100 GB disk this gives ~440 MiB/s vs qemu-img's single-thread approach.
- Hole-punch streaming — the intermediate VMDK is hole-punched as it streams into the OVA tar. Peak disk usage = final OVA size, never more.
Benchmark (100 GB disk, 52 GB used, NVMe PCIe 4):
Tool | VMDK | OVA pack | Total | Size[/B]-----------------------------+-------+----------+--------+-----------pvstream2ova --level 6 (def) | 3:51 | 1:30 | 5:21 | 27,968 MiBpvstream2ova --level 1 | 3:35 | 1:30 | 5:05 | 29,128 MiBqemu-img convert | 23:36 | 1:30* | ~25:00 | 27,988 MiBvzdump zstd (Proxmox only) | - | - | 2:31 | 25,214 MiB-----------------------------+-------+----------+--------+-----------* qemu-img produces a VMDK only — OVA packing adds ~1:30
Also included: pvefingerprint.sh / ovafingerprint.sh to verify VM integrity before export and after import.
The script prints warnings for known OVF limitations (VirtIO SCSI controller, OVMF BIOS, network bridge mapping).
GitHub: https://github.com/a-n-d-r-e-a-b/pvstream2ova
Tested on Proxmox VE 9.1. Give it a try and let me know if you find it useful!
---
Last edited: