libguestfs / virt-v2v

Virt-v2v converts guests from foreign hypervisors to run on KVM
GNU General Public License v2.0
94 stars 38 forks source link

eBlockerVM-2.9.1-amd64.ova / virt-v2v: error: libguestfs error: you must call guestfs_add_drive before guestfs_launch #26

Open minger0 opened 1 year ago

minger0 commented 1 year ago

rwmjones 17c6d52 reported the eBlockerVM-2.9.1-amd64.ova working on the latest after his commit, so I followed the install steps and installed virtv2v latest to /usr/local/bin/virt-v2v, hoping that it would work for me just like for rwmjones. It did not, because I get a virt-v2v: error: libguestfs error: you must call guestfs_add_drive before error instead. See details below. Question: how to get the eBlockerVM-2.9.1-amd64.ova conversion working?

which virt-v2v

/usr/local/bin/virt-v2v

/usr/bin/virt-v2v --version

virt-v2v 1.44.2

/usr/local/bin/virt-v2v --version

virt-v2v 2.3.3

export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
/usr/local/bin/virt-v2v -v -x -i ova eBlockerVM-2.9.1-amd64.ova -of qcow2

libguestfs: trace: set_verbose true libguestfs: trace: set_verbose = 0 libguestfs: trace: get_cachedir libguestfs: trace: get_cachedir = "/var/tmp" virt-v2v: virt-v2v 2.3.3 (x86_64) libvirt version: 8.0.0 check_host_free_space: large_tmpdir=/var/tmp free_space=813592858624 [ 0.0] Setting up the source: -i ova eBlockerVM-2.9.1-amd64.ova qemu-img info json:'{ "file": { "driver": "raw", "offset": 512, "size": 512, "file": { "filename": "/tmp/v2vqemuimgtstb82e23.img" } } }' >/dev/null qemu-img supports "offset" and "size" in json URLs: true libguestfs: trace: set_verbose true libguestfs: trace: set_verbose = 0 libguestfs: trace: set_trace true libguestfs: trace: set_trace = 0 libguestfs: trace: set_verbose true libguestfs: trace: set_verbose = 0 libguestfs: trace: get_backend libguestfs: trace: get_backend = "direct" tar -tf 'eBlockerVM-2.9.1-amd64.ova' tar -xf 'eBlockerVM-2.9.1-amd64.ova' -C '/var/tmp/ova.CdLB6P' 'eBlockerVM-2.9.1-amd64.ovf' 'eBlockerVM-2.9.1-amd64.mf' ova: orig_ova = eBlockerVM-2.9.1-amd64.ova, top_dir = /var/tmp/ova.CdLB6P, ova_type = TarOptimized eBlockerVM-2.9.1-amd64.ova ova: processing manifest file /var/tmp/ova.CdLB6P/eBlockerVM-2.9.1-amd64.mf libguestfs: trace: close libguestfs: closing guestfs handle 0x5567bd9367a0 (state 0) libguestfs: trace: close libguestfs: closing guestfs handle 0x5567bd948a40 (state 0) tar xOf 'eBlockerVM-2.9.1-amd64.ova' 'eBlocker VM-disk001.vmdk' | sha256sum tar xOf 'eBlockerVM-2.9.1-amd64.ova' 'eBlockerVM-2.9.1-amd64.ovf' | sha256sum virt-v2v: warning: could not parse ovf:Name from OVF document [ 7.0] Opening the source libguestfs: trace: set_verbose true libguestfs: trace: set_verbose = 0 libguestfs: trace: set_trace true libguestfs: trace: set_trace = 0 libguestfs: trace: set_verbose true libguestfs: trace: set_verbose = 0 libguestfs: trace: set_identifier "v2v" libguestfs: trace: v2v: set_identifier = 0 libguestfs: trace: v2v: get_memsize libguestfs: trace: v2v: get_memsize = 1280 libguestfs: trace: v2v: set_memsize 2560 libguestfs: trace: v2v: set_memsize = 0 libguestfs: trace: v2v: set_smp 8 libguestfs: trace: v2v: set_smp = 0 libguestfs: trace: v2v: set_network true libguestfs: trace: v2v: set_network = 0 libguestfs: trace: v2v: launch libguestfs: trace: v2v: max_disks libguestfs: trace: v2v: max_disks = 255 libguestfs: trace: v2v: get_tmpdir libguestfs: trace: v2v: get_tmpdir = "/tmp" libguestfs: trace: v2v: version libguestfs: trace: v2v: version = <struct guestfs_version = major: 1, minor: 46, release: 2, extra: , > libguestfs: trace: v2v: get_backend libguestfs: trace: v2v: get_backend = "direct" libguestfs: launch: program=virt-v2v libguestfs: launch: identifier=v2v libguestfs: launch: version=1.46.2 libguestfs: launch: backend registered: unix libguestfs: launch: backend registered: uml libguestfs: launch: backend registered: libvirt libguestfs: launch: backend registered: direct libguestfs: launch: backend=direct libguestfs: launch: tmpdir=/tmp/libguestfs7y9SCY libguestfs: launch: umask=0002 libguestfs: launch: euid=1000 libguestfs: trace: v2v: launch = -1 (error) virt-v2v: error: libguestfs error: you must call guestfs_add_drive before guestfs_launch rm -rf -- '/var/tmp/ova.CdLB6P' rm -rf -- '/tmp/v2v.OLYbVO' libguestfs: trace: v2v: close libguestfs: closing guestfs handle 0x5567bd95acc0 (state 0) libguestfs: command: run: rm libguestfs: command: run: \ -rf /tmp/libguestfs7y9SCY

rwmjones commented 1 year ago

About eBlockerVM in general: The OVA uses an unusual, newer OVF variant than we currently support, and as a result virt-v2v cannot right now be used to import it.

There is a bug about this: https://bugzilla.redhat.com/show_bug.cgi?id=2183999

minger0 commented 1 year ago

Do you expect a solution coming in a few weeks? If not, is there a temporary one-off bootstrapping for the issues you mentioned? (1) The xmlns changed to: xmlns="http://schemas.dmtf.org/ovf/envelope/2" (2) ovf:version="2.0" in the <Envelope> (3) Uses <StorageItem> instead of <Item>

rwmjones commented 1 year ago

It's a volunteer project and everyone is welcome to contribute. That said, this particular new format is hard to implement and apparently not used by VMware.

It may well be possible to modify the OVF to turn it into a v1 format. You might want to start by looking at some other example OVFs to get the idea, such as the ones we use for testing here: https://github.com/libguestfs/virt-v2v/tree/master/tests